2 // System.Web.UI.WebControls.DetailsView.cs
\r
5 // Lluis Sanchez Gual (lluis@novell.com)
\r
7 // (C) 2005 Novell, Inc (http://www.novell.com)
\r
9 // Permission is hereby granted, free of charge, to any person obtaining
\r
10 // a copy of this software and associated documentation files (the
\r
11 // "Software"), to deal in the Software without restriction, including
\r
12 // without limitation the rights to use, copy, modify, merge, publish,
\r
13 // distribute, sublicense, and/or sell copies of the Software, and to
\r
14 // permit persons to whom the Software is furnished to do so, subject to
\r
15 // the following conditions:
\r
17 // The above copyright notice and this permission notice shall be
\r
18 // included in all copies or substantial portions of the Software.
\r
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
32 using System.Collections;
\r
33 using System.Collections.Specialized;
\r
34 using System.ComponentModel;
\r
35 using System.Web.UI;
\r
36 using System.Security.Permissions;
\r
39 using System.Reflection;
\r
41 namespace System.Web.UI.WebControls
\r
43 [SupportsEventValidation]
\r
44 [ToolboxDataAttribute ("<{0}:DetailsView runat=\"server\" Width=\"125px\" Height=\"50px\"></{0}:DetailsView>")]
\r
45 [DesignerAttribute ("System.Web.UI.Design.WebControls.DetailsViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
\r
46 [ControlValuePropertyAttribute ("SelectedValue")]
\r
47 [DefaultEventAttribute ("PageIndexChanging")]
\r
48 [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
\r
49 [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
\r
50 public class DetailsView: CompositeDataBoundControl, ICallbackEventHandler, ICallbackContainer, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer
\r
55 DetailsViewRowCollection rows;
\r
56 DetailsViewRow headerRow;
\r
57 DetailsViewRow footerRow;
\r
58 DetailsViewRow bottomPagerRow;
\r
59 DetailsViewRow topPagerRow;
\r
61 IOrderedDictionary currentEditRowKeys;
\r
62 IOrderedDictionary currentEditNewValues;
\r
63 IOrderedDictionary currentEditOldValues;
\r
65 ITemplate pagerTemplate;
\r
66 ITemplate emptyDataTemplate;
\r
67 ITemplate headerTemplate;
\r
68 ITemplate footerTemplate;
\r
70 PropertyDescriptor[] cachedKeyProperties;
\r
71 readonly string[] emptyKeys = new string[0];
\r
72 readonly string unhandledEventExceptionMessage = "The DetailsView '{0}' fired event {1} which wasn't handled.";
\r
75 DataControlFieldCollection columns;
\r
76 PagerSettings pagerSettings;
\r
78 TableItemStyle alternatingRowStyle;
\r
79 TableItemStyle editRowStyle;
\r
80 TableItemStyle insertRowStyle;
\r
81 TableItemStyle emptyDataRowStyle;
\r
82 TableItemStyle footerStyle;
\r
83 TableItemStyle headerStyle;
\r
84 TableItemStyle pagerStyle;
\r
85 TableItemStyle rowStyle;
\r
86 TableItemStyle commandRowStyle;
\r
87 TableItemStyle fieldHeaderStyle;
\r
89 IOrderedDictionary _keyTable;
\r
91 DataKey oldEditValues;
\r
92 AutoGeneratedFieldProperties[] autoFieldProperties;
\r
94 private static readonly object PageIndexChangedEvent = new object();
\r
95 private static readonly object PageIndexChangingEvent = new object();
\r
96 private static readonly object ItemCommandEvent = new object();
\r
97 private static readonly object ItemCreatedEvent = new object();
\r
98 private static readonly object ItemDeletedEvent = new object();
\r
99 private static readonly object ItemDeletingEvent = new object();
\r
100 private static readonly object ItemInsertedEvent = new object();
\r
101 private static readonly object ItemInsertingEvent = new object();
\r
102 private static readonly object ModeChangingEvent = new object();
\r
103 private static readonly object ModeChangedEvent = new object();
\r
104 private static readonly object ItemUpdatedEvent = new object();
\r
105 private static readonly object ItemUpdatingEvent = new object();
\r
109 DetailsViewMode currentMode = DetailsViewMode.ReadOnly;
\r
110 bool hasCurrentMode;
\r
113 public DetailsView ()
\r
115 rows = new DetailsViewRowCollection (new ArrayList ());
\r
118 public event EventHandler PageIndexChanged {
\r
119 add { Events.AddHandler (PageIndexChangedEvent, value); }
\r
120 remove { Events.RemoveHandler (PageIndexChangedEvent, value); }
\r
123 public event DetailsViewPageEventHandler PageIndexChanging {
\r
124 add { Events.AddHandler (PageIndexChangingEvent, value); }
\r
125 remove { Events.RemoveHandler (PageIndexChangingEvent, value); }
\r
128 public event DetailsViewCommandEventHandler ItemCommand {
\r
129 add { Events.AddHandler (ItemCommandEvent, value); }
\r
130 remove { Events.RemoveHandler (ItemCommandEvent, value); }
\r
133 public event EventHandler ItemCreated {
\r
134 add { Events.AddHandler (ItemCreatedEvent, value); }
\r
135 remove { Events.RemoveHandler (ItemCreatedEvent, value); }
\r
138 public event DetailsViewDeletedEventHandler ItemDeleted {
\r
139 add { Events.AddHandler (ItemDeletedEvent, value); }
\r
140 remove { Events.RemoveHandler (ItemDeletedEvent, value); }
\r
143 public event DetailsViewDeleteEventHandler ItemDeleting {
\r
144 add { Events.AddHandler (ItemDeletingEvent, value); }
\r
145 remove { Events.RemoveHandler (ItemDeletingEvent, value); }
\r
148 public event DetailsViewInsertedEventHandler ItemInserted {
\r
149 add { Events.AddHandler (ItemInsertedEvent, value); }
\r
150 remove { Events.RemoveHandler (ItemInsertedEvent, value); }
\r
153 public event DetailsViewInsertEventHandler ItemInserting {
\r
154 add { Events.AddHandler (ItemInsertingEvent, value); }
\r
155 remove { Events.RemoveHandler (ItemInsertingEvent, value); }
\r
158 public event DetailsViewModeEventHandler ModeChanging {
\r
159 add { Events.AddHandler (ModeChangingEvent, value); }
\r
160 remove { Events.RemoveHandler (ModeChangingEvent, value); }
\r
163 public event EventHandler ModeChanged {
\r
164 add { Events.AddHandler (ModeChangedEvent, value); }
\r
165 remove { Events.RemoveHandler (ModeChangedEvent, value); }
\r
168 public event DetailsViewUpdatedEventHandler ItemUpdated {
\r
169 add { Events.AddHandler (ItemUpdatedEvent, value); }
\r
170 remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
\r
173 public event DetailsViewUpdateEventHandler ItemUpdating {
\r
174 add { Events.AddHandler (ItemUpdatingEvent, value); }
\r
175 remove { Events.RemoveHandler (ItemUpdatingEvent, value); }
\r
178 protected virtual void OnPageIndexChanged (EventArgs e)
\r
180 if (Events != null) {
\r
181 EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];
\r
182 if (eh != null) eh (this, e);
\r
186 protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)
\r
188 if (Events != null) {
\r
189 DetailsViewPageEventHandler eh = (DetailsViewPageEventHandler) Events [PageIndexChangingEvent];
\r
195 if (!IsBoundUsingDataSourceID)
\r
196 throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "PageIndexChanging"));
\r
199 protected virtual void OnItemCommand (DetailsViewCommandEventArgs e)
\r
201 if (Events != null) {
\r
202 DetailsViewCommandEventHandler eh = (DetailsViewCommandEventHandler) Events [ItemCommandEvent];
\r
203 if (eh != null) eh (this, e);
\r
207 protected virtual void OnItemCreated (EventArgs e)
\r
209 if (Events != null) {
\r
210 EventHandler eh = (EventHandler) Events [ItemCreatedEvent];
\r
211 if (eh != null) eh (this, e);
\r
215 protected virtual void OnItemDeleted (DetailsViewDeletedEventArgs e)
\r
217 if (Events != null) {
\r
218 DetailsViewDeletedEventHandler eh = (DetailsViewDeletedEventHandler) Events [ItemDeletedEvent];
\r
219 if (eh != null) eh (this, e);
\r
223 protected virtual void OnItemInserted (DetailsViewInsertedEventArgs e)
\r
225 if (Events != null) {
\r
226 DetailsViewInsertedEventHandler eh = (DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
\r
227 if (eh != null) eh (this, e);
\r
231 protected virtual void OnItemInserting (DetailsViewInsertEventArgs e)
\r
233 if (Events != null) {
\r
234 DetailsViewInsertEventHandler eh = (DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
\r
240 if (!IsBoundUsingDataSourceID)
\r
241 throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemInserting"));
\r
244 protected virtual void OnItemDeleting (DetailsViewDeleteEventArgs e)
\r
246 if (Events != null) {
\r
247 DetailsViewDeleteEventHandler eh = (DetailsViewDeleteEventHandler) Events [ItemDeletingEvent];
\r
253 if (!IsBoundUsingDataSourceID)
\r
254 throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemDeleting"));
\r
257 protected virtual void OnModeChanged (EventArgs e)
\r
259 if (Events != null) {
\r
260 EventHandler eh = (EventHandler) Events [ModeChangedEvent];
\r
261 if (eh != null) eh (this, e);
\r
265 protected virtual void OnModeChanging (DetailsViewModeEventArgs e)
\r
267 if (Events != null) {
\r
268 DetailsViewModeEventHandler eh = (DetailsViewModeEventHandler) Events [ModeChangingEvent];
\r
274 if (!IsBoundUsingDataSourceID)
\r
275 throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ModeChanging"));
\r
278 protected virtual void OnItemUpdated (DetailsViewUpdatedEventArgs e)
\r
280 if (Events != null) {
\r
281 DetailsViewUpdatedEventHandler eh = (DetailsViewUpdatedEventHandler) Events [ItemUpdatedEvent];
\r
282 if (eh != null) eh (this, e);
\r
286 protected virtual void OnItemUpdating (DetailsViewUpdateEventArgs e)
\r
288 if (Events != null) {
\r
289 DetailsViewUpdateEventHandler eh = (DetailsViewUpdateEventHandler) Events [ItemUpdatingEvent];
\r
295 if (!IsBoundUsingDataSourceID)
\r
296 throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemUpdating"));
\r
300 [WebCategoryAttribute ("Paging")]
\r
301 [DefaultValueAttribute (false)]
\r
302 public virtual bool AllowPaging {
\r
304 object ob = ViewState ["AllowPaging"];
\r
305 if (ob != null) return (bool) ob;
\r
309 ViewState ["AllowPaging"] = value;
\r
314 [DefaultValueAttribute (null)]
\r
315 [WebCategoryAttribute ("Styles")]
\r
316 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
317 [NotifyParentProperty (true)]
\r
318 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
319 public TableItemStyle AlternatingRowStyle {
\r
321 if (alternatingRowStyle == null) {
\r
322 alternatingRowStyle = new TableItemStyle ();
\r
323 if (IsTrackingViewState)
\r
324 alternatingRowStyle.TrackViewState();
\r
326 return alternatingRowStyle;
\r
330 [WebCategoryAttribute ("Behavior")]
\r
331 [DefaultValueAttribute (false)]
\r
332 public virtual bool AutoGenerateEditButton {
\r
334 object ob = ViewState ["AutoGenerateEditButton"];
\r
335 if (ob != null) return (bool) ob;
\r
339 ViewState ["AutoGenerateEditButton"] = value;
\r
344 [WebCategoryAttribute ("Behavior")]
\r
345 [DefaultValueAttribute (false)]
\r
346 public virtual bool AutoGenerateDeleteButton {
\r
348 object ob = ViewState ["AutoGenerateDeleteButton"];
\r
349 if (ob != null) return (bool) ob;
\r
353 ViewState ["AutoGenerateDeleteButton"] = value;
\r
358 [WebCategoryAttribute ("Behavior")]
\r
359 [DefaultValueAttribute (false)]
\r
360 public virtual bool AutoGenerateInsertButton {
\r
362 object ob = ViewState ["AutoGenerateInsertButton"];
\r
363 if (ob != null) return (bool) ob;
\r
367 ViewState ["AutoGenerateInsertButton"] = value;
\r
372 [WebCategoryAttribute ("Behavior")]
\r
373 [DefaultValueAttribute (true)]
\r
374 public virtual bool AutoGenerateRows {
\r
376 object ob = ViewState ["AutoGenerateRows"];
\r
377 if (ob != null) return (bool) ob;
\r
381 ViewState ["AutoGenerateRows"] = value;
\r
386 [UrlPropertyAttribute]
\r
387 [WebCategoryAttribute ("Appearance")]
\r
388 [DefaultValueAttribute ("")]
\r
389 [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
390 public virtual string BackImageUrl {
\r
392 if (ControlStyleCreated)
\r
393 return ((TableStyle) ControlStyle).BackImageUrl;
\r
394 return String.Empty;
\r
397 ((TableStyle) ControlStyle).BackImageUrl = value;
\r
401 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
402 [BrowsableAttribute (false)]
\r
403 public virtual DetailsViewRow BottomPagerRow {
\r
405 EnsureChildControls ();
\r
406 return bottomPagerRow;
\r
410 [WebCategoryAttribute ("Accessibility")]
\r
411 [DefaultValueAttribute ("")]
\r
412 [LocalizableAttribute (true)]
\r
413 public virtual string Caption {
\r
415 object ob = ViewState ["Caption"];
\r
416 if (ob != null) return (string) ob;
\r
417 return string.Empty;
\r
420 ViewState ["Caption"] = value;
\r
425 [WebCategoryAttribute ("Accessibility")]
\r
426 [DefaultValueAttribute (TableCaptionAlign.NotSet)]
\r
427 public virtual TableCaptionAlign CaptionAlign
\r
430 object o = ViewState ["CaptionAlign"];
\r
431 if(o != null) return (TableCaptionAlign) o;
\r
432 return TableCaptionAlign.NotSet;
\r
435 ViewState ["CaptionAlign"] = value;
\r
440 [WebCategoryAttribute ("Layout")]
\r
441 [DefaultValueAttribute (-1)]
\r
442 public virtual int CellPadding
\r
445 if (ControlStyleCreated)
\r
446 return ((TableStyle) ControlStyle).CellPadding;
\r
450 ((TableStyle) ControlStyle).CellPadding = value;
\r
454 [WebCategoryAttribute ("Layout")]
\r
455 [DefaultValueAttribute (0)]
\r
456 public virtual int CellSpacing
\r
459 if (ControlStyleCreated)
\r
460 return ((TableStyle) ControlStyle).CellSpacing;
\r
464 ((TableStyle) ControlStyle).CellSpacing = value;
\r
468 [DefaultValueAttribute (null)]
\r
469 [WebCategoryAttribute ("Styles")]
\r
470 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
471 [NotifyParentProperty (true)]
\r
472 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
473 public TableItemStyle CommandRowStyle {
\r
475 if (commandRowStyle == null) {
\r
476 commandRowStyle = new TableItemStyle ();
\r
477 if (IsTrackingViewState)
\r
478 commandRowStyle.TrackViewState();
\r
480 return commandRowStyle;
\r
484 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
485 [BrowsableAttribute (false)]
\r
486 public DetailsViewMode CurrentMode {
\r
488 return hasCurrentMode ? currentMode : DefaultMode;
\r
491 hasCurrentMode = true;
\r
492 currentMode = value;
\r
496 DetailsViewMode defaultMode = DetailsViewMode.ReadOnly;
\r
497 [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
\r
498 [WebCategoryAttribute ("Behavior")]
\r
499 public virtual DetailsViewMode DefaultMode {
\r
501 return defaultMode;
\r
504 defaultMode = value;
\r
509 [EditorAttribute ("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
510 [MergablePropertyAttribute (false)]
\r
511 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
512 [DefaultValueAttribute (null)]
\r
513 [WebCategoryAttribute ("Misc")]
\r
514 public virtual DataControlFieldCollection Fields {
\r
516 if (columns == null) {
\r
517 columns = new DataControlFieldCollection ();
\r
518 columns.FieldsChanged += new EventHandler (OnFieldsChanged);
\r
519 if (IsTrackingViewState)
\r
520 ((IStateManager)columns).TrackViewState ();
\r
526 string[] dataKeyNames = null;
\r
528 [DefaultValueAttribute (null)]
\r
529 [WebCategoryAttribute ("Data")]
\r
530 [TypeConverter (typeof(StringArrayConverter))]
\r
531 [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
532 public virtual string[] DataKeyNames
\r
535 if (dataKeyNames == null)
\r
538 return dataKeyNames;
\r
541 dataKeyNames = value;
\r
546 IOrderedDictionary KeyTable {
\r
548 if (_keyTable == null) {
\r
549 _keyTable = new OrderedDictionary (DataKeyNames.Length);
\r
555 [BrowsableAttribute (false)]
\r
556 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
557 public virtual DataKey DataKey {
\r
560 key = new DataKey (KeyTable);
\r
566 DataKey OldEditValues {
\r
568 if (oldEditValues == null) {
\r
569 oldEditValues = new DataKey (new OrderedDictionary ());
\r
571 return oldEditValues;
\r
575 [WebCategoryAttribute ("Styles")]
\r
576 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
577 [NotifyParentProperty (true)]
\r
578 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
579 [DefaultValueAttribute (null)]
\r
580 public TableItemStyle EditRowStyle {
\r
582 if (editRowStyle == null) {
\r
583 editRowStyle = new TableItemStyle ();
\r
584 if (IsTrackingViewState)
\r
585 editRowStyle.TrackViewState();
\r
587 return editRowStyle;
\r
591 [WebCategoryAttribute ("Styles")]
\r
592 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
593 [NotifyParentProperty (true)]
\r
594 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
595 [DefaultValueAttribute (null)]
\r
596 public TableItemStyle EmptyDataRowStyle {
\r
598 if (emptyDataRowStyle == null) {
\r
599 emptyDataRowStyle = new TableItemStyle ();
\r
600 if (IsTrackingViewState)
\r
601 emptyDataRowStyle.TrackViewState();
\r
603 return emptyDataRowStyle;
\r
607 [DefaultValue (null)]
\r
608 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
609 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
610 [Browsable (false)]
\r
611 public virtual ITemplate EmptyDataTemplate {
\r
612 get { return emptyDataTemplate; }
\r
613 set { emptyDataTemplate = value; }
\r
616 [LocalizableAttribute (true)]
\r
617 [WebCategoryAttribute ("Appearance")]
\r
618 [DefaultValueAttribute ("")]
\r
619 public virtual string EmptyDataText {
\r
621 object ob = ViewState ["EmptyDataText"];
\r
622 if (ob != null) return (string) ob;
\r
623 return string.Empty;
\r
626 ViewState ["EmptyDataText"] = value;
\r
631 [WebCategoryAttribute ("Behavior")]
\r
632 [DefaultValueAttribute (false)]
\r
633 public virtual bool EnablePagingCallbacks {
\r
635 object ob = ViewState ["EnablePagingCallbacks"];
\r
636 if (ob != null) return (bool) ob;
\r
640 ViewState ["EnablePagingCallbacks"] = value;
\r
645 [WebCategoryAttribute ("Styles")]
\r
646 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
647 [NotifyParentProperty (true)]
\r
648 [DefaultValue (null)]
\r
649 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
650 public TableItemStyle FieldHeaderStyle {
\r
652 if (fieldHeaderStyle == null) {
\r
653 fieldHeaderStyle = new TableItemStyle ();
\r
654 if (IsTrackingViewState)
\r
655 fieldHeaderStyle.TrackViewState();
\r
657 return fieldHeaderStyle;
\r
661 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
662 [BrowsableAttribute (false)]
\r
663 public virtual DetailsViewRow FooterRow {
\r
665 EnsureChildControls ();
\r
670 [DefaultValue (null)]
\r
671 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
672 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
673 [Browsable (false)]
\r
674 public virtual ITemplate FooterTemplate {
\r
675 get { return footerTemplate; }
\r
676 set { footerTemplate = value; }
\r
679 [LocalizableAttribute (true)]
\r
680 [WebCategoryAttribute ("Appearance")]
\r
681 [DefaultValueAttribute ("")]
\r
682 public virtual string FooterText {
\r
684 object ob = ViewState ["FooterText"];
\r
685 if (ob != null) return (string) ob;
\r
686 return string.Empty;
\r
689 ViewState ["FooterText"] = value;
\r
694 [WebCategoryAttribute ("Styles")]
\r
695 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
696 [NotifyParentProperty (true)]
\r
697 [DefaultValue (null)]
\r
698 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
699 public TableItemStyle FooterStyle {
\r
701 if (footerStyle == null) {
\r
702 footerStyle = new TableItemStyle ();
\r
703 if (IsTrackingViewState)
\r
704 footerStyle.TrackViewState();
\r
706 return footerStyle;
\r
710 [WebCategoryAttribute ("Appearance")]
\r
711 [DefaultValueAttribute (GridLines.Both)]
\r
712 public virtual GridLines GridLines {
\r
714 if (ControlStyleCreated)
\r
715 return ((TableStyle) ControlStyle).GridLines;
\r
716 return GridLines.Both;
\r
719 ((TableStyle) ControlStyle).GridLines = value;
\r
723 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
724 [BrowsableAttribute (false)]
\r
725 public virtual DetailsViewRow HeaderRow {
\r
727 EnsureChildControls ();
\r
732 [WebCategoryAttribute ("Styles")]
\r
733 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
734 [NotifyParentProperty (true)]
\r
735 [DefaultValue (null)]
\r
736 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
737 public TableItemStyle HeaderStyle {
\r
739 if (headerStyle == null) {
\r
740 headerStyle = new TableItemStyle ();
\r
741 if (IsTrackingViewState)
\r
742 headerStyle.TrackViewState();
\r
744 return headerStyle;
\r
748 [DefaultValue (null)]
\r
749 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
750 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
751 [Browsable (false)]
\r
752 public virtual ITemplate HeaderTemplate {
\r
753 get { return headerTemplate; }
\r
754 set { headerTemplate = value; }
\r
757 [LocalizableAttribute (true)]
\r
758 [WebCategoryAttribute ("Appearance")]
\r
759 [DefaultValueAttribute ("")]
\r
760 public virtual string HeaderText {
\r
762 object ob = ViewState ["HeaderText"];
\r
763 if (ob != null) return (string) ob;
\r
764 return string.Empty;
\r
767 ViewState ["HeaderText"] = value;
\r
772 [Category ("Layout")]
\r
773 [DefaultValueAttribute (HorizontalAlign.NotSet)]
\r
774 public virtual HorizontalAlign HorizontalAlign {
\r
776 if (ControlStyleCreated)
\r
777 return ((TableStyle) ControlStyle).HorizontalAlign;
\r
778 return HorizontalAlign.NotSet;
\r
781 ((TableStyle) ControlStyle).HorizontalAlign = value;
\r
785 [WebCategoryAttribute ("Styles")]
\r
786 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
787 [NotifyParentProperty (true)]
\r
788 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
789 [DefaultValueAttribute (null)]
\r
790 public TableItemStyle InsertRowStyle {
\r
792 if (insertRowStyle == null) {
\r
793 insertRowStyle = new TableItemStyle ();
\r
794 if (IsTrackingViewState)
\r
795 insertRowStyle.TrackViewState();
\r
797 return insertRowStyle;
\r
801 [BrowsableAttribute (false)]
\r
802 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
803 public virtual int PageCount {
\r
812 [WebCategoryAttribute ("Paging")]
\r
813 [BindableAttribute (true, BindingDirection.OneWay)]
\r
814 [DefaultValueAttribute (0)]
\r
815 public virtual int PageIndex {
\r
817 if (CurrentMode == DetailsViewMode.Insert)
\r
823 throw new ArgumentOutOfRangeException ("PageIndex must be non-negative");
\r
824 if (pageIndex == value || value == -1)
\r
831 [WebCategoryAttribute ("Paging")]
\r
832 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
\r
833 [NotifyParentPropertyAttribute (true)]
\r
834 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
835 public virtual PagerSettings PagerSettings {
\r
837 if (pagerSettings == null) {
\r
838 pagerSettings = new PagerSettings (this);
\r
839 if (IsTrackingViewState)
\r
840 ((IStateManager)pagerSettings).TrackViewState ();
\r
842 return pagerSettings;
\r
846 [WebCategoryAttribute ("Styles")]
\r
847 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
848 [NotifyParentProperty (true)]
\r
849 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
850 public TableItemStyle PagerStyle {
\r
852 if (pagerStyle == null) {
\r
853 pagerStyle = new TableItemStyle ();
\r
854 if (IsTrackingViewState)
\r
855 pagerStyle.TrackViewState();
\r
862 [DefaultValue (null)]
\r
863 [TemplateContainer (typeof (DetailsView), BindingDirection.OneWay)]
\r
864 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
865 [Browsable (false)]
\r
866 public virtual ITemplate PagerTemplate {
\r
867 get { return pagerTemplate; }
\r
868 set { pagerTemplate = value; }
\r
871 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
872 [BrowsableAttribute (false)]
\r
873 public virtual DetailsViewRowCollection Rows {
\r
875 EnsureChildControls ();
\r
880 [WebCategoryAttribute ("Styles")]
\r
881 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
882 [NotifyParentProperty (true)]
\r
883 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
884 [DefaultValue (null)]
\r
885 public TableItemStyle RowStyle {
\r
887 if (rowStyle == null) {
\r
888 rowStyle = new TableItemStyle ();
\r
889 if (IsTrackingViewState)
\r
890 rowStyle.TrackViewState();
\r
896 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
897 [BrowsableAttribute (false)]
\r
898 public object SelectedValue {
\r
899 get { return DataKey.Value; }
\r
902 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
903 [BrowsableAttribute (false)]
\r
904 public virtual DetailsViewRow TopPagerRow {
\r
906 EnsureChildControls ();
\r
907 return topPagerRow;
\r
911 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
912 [BrowsableAttribute (false)]
\r
913 public virtual object DataItem {
\r
919 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
920 [BrowsableAttribute (false)]
\r
921 public int DataItemCount {
\r
922 get { return PageCount; }
\r
925 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
926 [BrowsableAttribute (false)]
\r
927 public virtual int DataItemIndex {
\r
928 get { return PageIndex; }
\r
931 int IDataItemContainer.DisplayIndex {
\r
932 get { return PageIndex; }
\r
935 int IDataItemContainer.DataItemIndex {
\r
936 get { return DataItemIndex; }
\r
939 public virtual bool IsBindableType (Type type)
\r
941 return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);
\r
944 protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
\r
946 DataSourceSelectArguments arg = new DataSourceSelectArguments ();
\r
947 DataSourceView view = GetData ();
\r
948 if (AllowPaging && view.CanPage) {
\r
949 arg.StartRowIndex = PageIndex;
\r
950 if (view.CanRetrieveTotalRowCount) {
\r
951 arg.RetrieveTotalRowCount = true;
\r
952 arg.MaximumRows = 1;
\r
955 arg.MaximumRows = -1;
\r
961 protected virtual ICollection CreateFieldSet (object dataItem, bool useDataSource)
\r
963 ArrayList fields = new ArrayList ();
\r
965 if (AutoGenerateRows) {
\r
966 if (useDataSource) {
\r
967 if (dataItem != null)
\r
968 fields.AddRange (CreateAutoGeneratedRows (dataItem));
\r
970 if (autoFieldProperties != null) {
\r
971 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
972 fields.Add (CreateAutoGeneratedRow (props));
\r
977 fields.AddRange (Fields);
\r
979 if (AutoGenerateEditButton || AutoGenerateDeleteButton || AutoGenerateInsertButton) {
\r
980 CommandField field = new CommandField ();
\r
981 field.ShowEditButton = AutoGenerateEditButton;
\r
982 field.ShowDeleteButton = AutoGenerateDeleteButton;
\r
983 field.ShowInsertButton = AutoGenerateInsertButton;
\r
984 fields.Add (field);
\r
990 protected virtual ICollection CreateAutoGeneratedRows (object dataItem)
\r
992 if (dataItem == null)
\r
995 ArrayList list = new ArrayList ();
\r
996 autoFieldProperties = CreateAutoFieldProperties (dataItem);
\r
997 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
998 list.Add (CreateAutoGeneratedRow (props));
\r
1002 protected virtual AutoGeneratedField CreateAutoGeneratedRow (AutoGeneratedFieldProperties fieldProperties)
\r
1004 return new AutoGeneratedField (fieldProperties);
\r
1007 AutoGeneratedFieldProperties[] CreateAutoFieldProperties (object dataItem)
\r
1009 if (IsBindableType (dataItem.GetType ()))
\r
1011 AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
\r
1012 ((IStateManager) field).TrackViewState ();
\r
1013 field.Name = "Item";
\r
1014 field.DataField = BoundField.ThisExpression;
\r
1015 field.Type = dataItem.GetType ();
\r
1016 return new AutoGeneratedFieldProperties [] { field };
\r
1019 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem, false);
\r
1021 if (props != null && props.Count > 0) {
\r
1022 ArrayList retVal = new ArrayList ();
\r
1023 foreach (PropertyDescriptor current in props) {
\r
1024 if (IsBindableType (current.PropertyType)) {
\r
1025 AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
\r
1026 ((IStateManager) field).TrackViewState ();
\r
1027 field.Name = current.Name;
\r
1028 field.DataField = current.Name;
\r
1029 for (int i = 0; i < DataKeyNames.Length; i++) {
\r
1030 if (string.Compare (DataKeyNames [i], current.Name, StringComparison.InvariantCultureIgnoreCase) == 0) {
\r
1031 field.IsReadOnly = true;
\r
1035 field.Type = current.PropertyType;
\r
1036 retVal.Add (field);
\r
1039 if (retVal.Count > 0)
\r
1040 return (AutoGeneratedFieldProperties []) retVal.ToArray (typeof (AutoGeneratedFieldProperties));
\r
1042 throw new HttpException (String.Format ("DetailsView with id '{0}' did not have any properties or attributes from which to generate fields. Ensure that your data source has content.", ID));
\r
1045 protected virtual DetailsViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
\r
1047 DetailsViewRow row;
\r
1048 if (rowType == DataControlRowType.Pager)
\r
1049 row = new DetailsViewPagerRow (rowIndex, rowType, rowState);
\r
1051 row = new DetailsViewRow (rowIndex, rowType, rowState);
\r
1055 void RequireBinding ()
\r
1057 if (Initialized) {
\r
1058 RequiresDataBinding = true;
\r
1062 protected virtual Table CreateTable ()
\r
1064 return new ContainedTable (this);
\r
1067 protected override Style CreateControlStyle ()
\r
1069 TableStyle style = new TableStyle ();
\r
1070 style.GridLines = GridLines.Both;
\r
1071 style.CellSpacing = 0;
\r
1075 protected override int CreateChildControls (IEnumerable data, bool dataBinding)
\r
1077 PagedDataSource dataSource = new PagedDataSource ();
\r
1078 dataSource.DataSource = CurrentMode != DetailsViewMode.Insert ? data : null;
\r
1079 dataSource.AllowPaging = AllowPaging;
\r
1080 dataSource.PageSize = 1;
\r
1081 dataSource.CurrentPageIndex = PageIndex;
\r
1083 if (dataBinding && CurrentMode != DetailsViewMode.Insert) {
\r
1084 DataSourceView view = GetData ();
\r
1085 if (view != null && view.CanPage) {
\r
1086 dataSource.AllowServerPaging = true;
\r
1087 if (SelectArguments.RetrieveTotalRowCount)
\r
1088 dataSource.VirtualCount = SelectArguments.TotalRowCount;
\r
1092 bool showPager = AllowPaging && (dataSource.PageCount > 1);
\r
1094 Controls.Clear ();
\r
1095 table = CreateTable ();
\r
1096 Controls.Add (table);
\r
1099 topPagerRow = null;
\r
1100 bottomPagerRow = null;
\r
1101 ArrayList list = new ArrayList ();
\r
1103 // Gets the current data item
\r
1105 if (AllowPaging) {
\r
1106 PageCount = dataSource.DataSourceCount;
\r
1107 if (PageIndex >= PageCount && PageCount > 0) {
\r
1108 pageIndex = dataSource.CurrentPageIndex = PageCount - 1;
\r
1110 if (dataSource.DataSource != null) {
\r
1111 IEnumerator e = dataSource.GetEnumerator ();
\r
1112 if (e.MoveNext ())
\r
1113 dataItem = e.Current;
\r
1118 object lastItem = null;
\r
1119 if (dataSource.DataSource != null) {
\r
1120 IEnumerator e = dataSource.GetEnumerator ();
\r
1121 for (; e.MoveNext (); page++) {
\r
1122 lastItem = e.Current;
\r
1123 if (page == PageIndex)
\r
1124 dataItem = e.Current;
\r
1128 if (PageIndex >= PageCount && PageCount > 0) {
\r
1129 pageIndex = PageCount - 1;
\r
1130 dataItem = lastItem;
\r
1134 if (PageCount == 0 && CurrentMode != DetailsViewMode.Insert) {
\r
1135 DetailsViewRow row = CreateEmptyRow ();
\r
1136 if (row != null) {
\r
1137 table.Rows.Add (row);
\r
1143 // Creates the set of fields to show
\r
1145 ICollection fieldCollection = CreateFieldSet (dataItem, dataBinding && dataItem != null);
\r
1146 DataControlField [] fields = new DataControlField [fieldCollection.Count];
\r
1147 fieldCollection.CopyTo (fields, 0);
\r
1149 foreach (DataControlField field in fields) {
\r
1150 field.Initialize (false, this);
\r
1151 if (EnablePagingCallbacks)
\r
1152 field.ValidateSupportsCallback ();
\r
1155 // Main table creation
\r
1157 headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
\r
1158 DataControlFieldCell headerCell = new DataControlFieldCell (null);
\r
1159 headerCell.ColumnSpan = 2;
\r
1160 if (headerTemplate != null)
\r
1161 headerTemplate.InstantiateIn (headerCell);
\r
1162 else if (!String.IsNullOrEmpty (HeaderText))
\r
1163 headerCell.Text = HeaderText;
\r
1165 headerRow.Visible = false;
\r
1166 headerRow.Cells.Add (headerCell);
\r
1167 table.Rows.Add (headerRow);
\r
1169 if (showPager && PagerSettings.Position == PagerPosition.Top ||
\r
1170 PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1171 topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1172 InitializePager (topPagerRow, dataSource);
\r
1173 table.Rows.Add (topPagerRow);
\r
1176 foreach (DataControlField field in fields) {
\r
1177 DataControlRowState rstate = GetRowState (list.Count);
\r
1178 DetailsViewRow row = CreateRow (PageIndex, DataControlRowType.DataRow, rstate);
\r
1179 InitializeRow (row, field);
\r
1180 table.Rows.Add (row);
\r
1184 footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);
\r
1185 DataControlFieldCell footerCell = new DataControlFieldCell (null);
\r
1186 footerCell.ColumnSpan = 2;
\r
1187 if (footerTemplate != null)
\r
1188 footerTemplate.InstantiateIn (footerCell);
\r
1189 else if (!String.IsNullOrEmpty (FooterText))
\r
1190 footerCell.Text = FooterText;
\r
1192 footerRow.Visible = false;
\r
1193 footerRow.Cells.Add (footerCell);
\r
1194 table.Rows.Add (footerRow);
\r
1196 if (showPager && PagerSettings.Position == PagerPosition.Bottom ||
\r
1197 PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1198 bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1199 InitializePager (bottomPagerRow, dataSource);
\r
1200 table.Rows.Add (bottomPagerRow);
\r
1204 rows = new DetailsViewRowCollection (list);
\r
1209 OnItemCreated (EventArgs.Empty);
\r
1214 protected override void EnsureDataBound ()
\r
1216 if (CurrentMode == DetailsViewMode.Insert) {
\r
1217 if (RequiresDataBinding) {
\r
1218 OnDataBinding (EventArgs.Empty);
\r
1219 RequiresDataBinding = false;
\r
1220 InternalPerformDataBinding (null);
\r
1221 MarkAsDataBound ();
\r
1222 OnDataBound (EventArgs.Empty);
\r
1226 base.EnsureDataBound ();
\r
1229 DataControlRowState GetRowState (int index)
\r
1231 DataControlRowState rstate = (index % 2) == 0 ? DataControlRowState.Normal : DataControlRowState.Alternate;
\r
1232 if (CurrentMode == DetailsViewMode.Edit) rstate |= DataControlRowState.Edit;
\r
1233 else if (CurrentMode == DetailsViewMode.Insert) rstate |= DataControlRowState.Insert;
\r
1237 protected virtual void InitializePager (DetailsViewRow row, PagedDataSource dataSource)
\r
1239 TableCell cell = new TableCell ();
\r
1240 cell.ColumnSpan = 2;
\r
1242 if (pagerTemplate != null)
\r
1243 pagerTemplate.InstantiateIn (cell);
\r
1245 cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));
\r
1247 row.Cells.Add (cell);
\r
1250 DetailsViewRow CreateEmptyRow ()
\r
1252 TableCell cell = new TableCell ();
\r
1254 if (emptyDataTemplate != null)
\r
1255 emptyDataTemplate.InstantiateIn (cell);
\r
1256 else if (!String.IsNullOrEmpty (EmptyDataText))
\r
1257 cell.Text = EmptyDataText;
\r
1261 DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
\r
1262 row.Cells.Add (cell);
\r
1266 protected virtual void InitializeRow (DetailsViewRow row, DataControlField field)
\r
1268 if (!field.Visible) {
\r
1269 row.Visible = false;
\r
1273 row.ContainingField = field;
\r
1274 DataControlFieldCell cell;
\r
1276 if (field.ShowHeader) {
\r
1277 cell = new DataControlFieldCell (field);
\r
1278 row.Cells.Add (cell);
\r
1279 field.InitializeCell (cell, DataControlCellType.Header, row.RowState, row.RowIndex);
\r
1282 cell = new DataControlFieldCell (field);
\r
1283 if (!field.ShowHeader)
\r
1284 cell.ColumnSpan = 2;
\r
1285 row.Cells.Add (cell);
\r
1286 field.InitializeCell (cell, DataControlCellType.DataCell, row.RowState, row.RowIndex);
\r
1288 if (CurrentMode == DetailsViewMode.Insert && !field.InsertVisible)
\r
1289 row.Visible = false;
\r
1292 void FillRowDataKey (object dataItem)
\r
1294 KeyTable.Clear ();
\r
1296 if (cachedKeyProperties == null) {
\r
1297 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
\r
1298 cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];
\r
1299 for (int n=0; n<DataKeyNames.Length; n++) {
\r
1300 PropertyDescriptor p = props.Find (DataKeyNames [n], true);
\r
1302 throw new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());
\r
1303 cachedKeyProperties [n] = p;
\r
1307 foreach (PropertyDescriptor p in cachedKeyProperties)
\r
1308 KeyTable [p.Name] = p.GetValue (dataItem);
\r
1311 IOrderedDictionary GetRowValues (bool includeReadOnlyFields, bool includePrimaryKey)
\r
1313 OrderedDictionary dic = new OrderedDictionary ();
\r
1314 ExtractRowValues (dic, includeReadOnlyFields, includePrimaryKey);
\r
1318 protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeReadOnlyFields, bool includePrimaryKey)
\r
1320 foreach (DetailsViewRow row in Rows) {
\r
1321 if (row.Cells.Count < 1) continue;
\r
1322 DataControlFieldCell c = row.Cells[row.Cells.Count-1] as DataControlFieldCell;
\r
1324 c.ContainingField.ExtractValuesFromCell (fieldValues, c, row.RowState, includeReadOnlyFields);
\r
1326 if (!includePrimaryKey && DataKeyNames != null)
\r
1327 foreach (string key in DataKeyNames)
\r
1328 fieldValues.Remove (key);
\r
1331 protected override HtmlTextWriterTag TagKey {
\r
1333 if (EnablePagingCallbacks)
\r
1334 return HtmlTextWriterTag.Div;
\r
1336 return HtmlTextWriterTag.Table;
\r
1340 public sealed override void DataBind ()
\r
1342 cachedKeyProperties = null;
\r
1345 if (dataItem != null) {
\r
1346 if (CurrentMode == DetailsViewMode.Edit)
\r
1347 oldEditValues = new DataKey (GetRowValues (false, true));
\r
1348 FillRowDataKey (dataItem);
\r
1349 key = new DataKey (KeyTable);
\r
1353 protected internal override void PerformDataBinding (IEnumerable data)
\r
1355 base.PerformDataBinding (data);
\r
1358 protected internal virtual void PrepareControlHierarchy ()
\r
1360 if (table == null)
\r
1363 table.Caption = Caption;
\r
1364 table.CaptionAlign = CaptionAlign;
\r
1366 foreach (DetailsViewRow row in table.Rows) {
\r
1367 switch (row.RowType) {
\r
1368 case DataControlRowType.Header:
\r
1369 if (headerStyle != null && !headerStyle.IsEmpty)
\r
1370 row.ControlStyle.CopyFrom (headerStyle);
\r
1372 case DataControlRowType.Footer:
\r
1373 if (footerStyle != null && !footerStyle.IsEmpty)
\r
1374 row.ControlStyle.CopyFrom (footerStyle);
\r
1376 case DataControlRowType.Pager:
\r
1377 if (pagerStyle != null && !pagerStyle.IsEmpty)
\r
1378 row.ControlStyle.CopyFrom (pagerStyle);
\r
1380 case DataControlRowType.EmptyDataRow:
\r
1381 if (emptyDataRowStyle != null && !emptyDataRowStyle.IsEmpty)
\r
1382 row.ControlStyle.CopyFrom (emptyDataRowStyle);
\r
1384 case DataControlRowType.DataRow:
\r
1385 if (rowStyle != null && !rowStyle.IsEmpty)
\r
1386 row.ControlStyle.CopyFrom (rowStyle);
\r
1387 if ((row.RowState & DataControlRowState.Alternate) != 0 && alternatingRowStyle != null && !alternatingRowStyle.IsEmpty)
\r
1388 row.ControlStyle.CopyFrom (alternatingRowStyle);
\r
1394 if (row.ContainingField is CommandField) {
\r
1395 if (commandRowStyle != null && !commandRowStyle.IsEmpty)
\r
1396 row.ControlStyle.CopyFrom (commandRowStyle);
\r
1399 if ((row.RowState & DataControlRowState.Edit) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)
\r
1400 row.ControlStyle.CopyFrom (editRowStyle);
\r
1401 if ((row.RowState & DataControlRowState.Insert) != 0) {
\r
1402 if (insertRowStyle != null && !insertRowStyle.IsEmpty)
\r
1403 row.ControlStyle.CopyFrom (insertRowStyle);
\r
1404 else if (editRowStyle != null && !editRowStyle.IsEmpty)
\r
1405 row.ControlStyle.CopyFrom (editRowStyle);
\r
1409 for (int n = 0; n < row.Cells.Count; n++) {
\r
1410 DataControlFieldCell fcell = row.Cells [n] as DataControlFieldCell;
\r
1411 if (fcell != null && fcell.ContainingField != null) {
\r
1412 DataControlField field = fcell.ContainingField;
\r
1413 if (n == 0 && field.ShowHeader) {
\r
1414 if (fieldHeaderStyle != null && !fieldHeaderStyle.IsEmpty)
\r
1415 fcell.ControlStyle.CopyFrom (fieldHeaderStyle);
\r
1416 if (field.HeaderStyleCreated && !field.HeaderStyle.IsEmpty)
\r
1417 fcell.ControlStyle.CopyFrom (field.HeaderStyle);
\r
1420 if (field.ControlStyleCreated && !field.ControlStyle.IsEmpty)
\r
1421 foreach (Control c in fcell.Controls) {
\r
1422 WebControl wc = c as WebControl;
\r
1424 wc.ControlStyle.MergeWith (field.ControlStyle);
\r
1426 if (field.ItemStyleCreated && !field.ItemStyle.IsEmpty)
\r
1427 fcell.ControlStyle.CopyFrom (field.ItemStyle);
\r
1434 protected internal override void OnInit (EventArgs e)
\r
1436 Page.RegisterRequiresControlState (this);
\r
1440 void OnFieldsChanged (object sender, EventArgs args)
\r
1442 RequireBinding ();
\r
1445 protected override void OnDataSourceViewChanged (object sender, EventArgs e)
\r
1447 base.OnDataSourceViewChanged (sender, e);
\r
1448 RequireBinding ();
\r
1451 protected override bool OnBubbleEvent (object source, EventArgs e)
\r
1453 DetailsViewCommandEventArgs args = e as DetailsViewCommandEventArgs;
\r
1454 if (args != null) {
\r
1455 bool causesValidation = false;
\r
1456 IButtonControl button = args.CommandSource as IButtonControl;
\r
1457 if (button != null && button.CausesValidation) {
\r
1458 Page.Validate (button.ValidationGroup);
\r
1459 causesValidation = true;
\r
1461 ProcessCommand (args, causesValidation);
\r
1464 return base.OnBubbleEvent (source, e);
\r
1467 void ProcessCommand (DetailsViewCommandEventArgs args, bool causesValidation) {
\r
1468 OnItemCommand (args);
\r
1469 ProcessEvent (args.CommandName, args.CommandArgument as string, causesValidation);
\r
1472 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
\r
1474 RaisePostBackEvent (eventArgument);
\r
1477 // TODO: This is prolly obsolete
\r
1478 protected virtual void RaisePostBackEvent (string eventArgument)
\r
1480 int i = eventArgument.IndexOf ('$');
\r
1481 CommandEventArgs arg;
\r
1483 arg = new CommandEventArgs (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));
\r
1485 arg = new CommandEventArgs (eventArgument, null);
\r
1486 ProcessCommand (new DetailsViewCommandEventArgs (this, arg), false);
\r
1489 void ProcessEvent (string eventName, string param, bool causesValidation)
\r
1491 switch (eventName)
\r
1493 case DataControlCommands.PageCommandName:
\r
1494 int newIndex = -1;
\r
1496 case DataControlCommands.FirstPageCommandArgument:
\r
1499 case DataControlCommands.LastPageCommandArgument:
\r
1500 newIndex = PageCount - 1;
\r
1502 case DataControlCommands.NextPageCommandArgument:
\r
1503 newIndex = PageIndex + 1;
\r
1505 case DataControlCommands.PreviousPageCommandArgument:
\r
1506 newIndex = PageIndex - 1;
\r
1509 int paramIndex = 0;
\r
1510 int.TryParse (param, out paramIndex);
\r
1511 newIndex = paramIndex - 1;
\r
1514 ShowPage (newIndex);
\r
1517 case DataControlCommands.FirstPageCommandArgument:
\r
1521 case DataControlCommands.LastPageCommandArgument:
\r
1522 ShowPage (PageCount - 1);
\r
1525 case DataControlCommands.NextPageCommandArgument:
\r
1526 if (PageIndex < PageCount - 1)
\r
1527 ShowPage (PageIndex + 1);
\r
1530 case DataControlCommands.PreviousPageCommandArgument:
\r
1531 if (PageIndex > 0)
\r
1532 ShowPage (PageIndex - 1);
\r
1535 case DataControlCommands.EditCommandName:
\r
1536 ProcessChangeMode (DetailsViewMode.Edit);
\r
1539 case DataControlCommands.NewCommandName:
\r
1540 ProcessChangeMode (DetailsViewMode.Insert);
\r
1543 case DataControlCommands.UpdateCommandName:
\r
1544 UpdateItem (param, causesValidation);
\r
1547 case DataControlCommands.CancelCommandName:
\r
1551 case DataControlCommands.DeleteCommandName:
\r
1555 case DataControlCommands.InsertCommandName:
\r
1556 InsertItem (causesValidation);
\r
1561 void ShowPage (int newIndex)
\r
1563 DetailsViewPageEventArgs args = new DetailsViewPageEventArgs (newIndex);
\r
1564 OnPageIndexChanging (args);
\r
1566 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1569 if (args.NewPageIndex < 0 || args.NewPageIndex >= PageCount)
\r
1571 EndRowEdit (false);
\r
1572 PageIndex = args.NewPageIndex;
\r
1573 OnPageIndexChanged (EventArgs.Empty);
\r
1576 public void ChangeMode (DetailsViewMode newMode)
\r
1578 CurrentMode = newMode;
\r
1579 RequireBinding ();
\r
1582 void ProcessChangeMode (DetailsViewMode newMode)
\r
1584 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (newMode, false);
\r
1585 OnModeChanging (args);
\r
1587 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1590 ChangeMode (args.NewMode);
\r
1592 OnModeChanged (EventArgs.Empty);
\r
1595 void CancelEdit ()
\r
1597 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (DetailsViewMode.ReadOnly, true);
\r
1598 OnModeChanging (args);
\r
1600 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1606 public virtual void UpdateItem (bool causesValidation)
\r
1608 UpdateItem (null, causesValidation);
\r
1611 void UpdateItem (string param, bool causesValidation)
\r
1613 if (causesValidation && Page != null && !Page.IsValid)
\r
1616 if (CurrentMode != DetailsViewMode.Edit) throw new HttpException ();
\r
1618 currentEditOldValues = OldEditValues.Values;
\r
1620 currentEditRowKeys = DataKey.Values;
\r
1621 currentEditNewValues = GetRowValues (false, false);
\r
1623 DetailsViewUpdateEventArgs args = new DetailsViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1624 OnItemUpdating (args);
\r
1626 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1629 DataSourceView view = GetData ();
\r
1631 throw new HttpException ("The DataSourceView associated to data bound control was null");
\r
1632 view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));
\r
1635 bool UpdateCallback (int recordsAffected, Exception exception)
\r
1637 DetailsViewUpdatedEventArgs dargs = new DetailsViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1638 OnItemUpdated (dargs);
\r
1640 if (!dargs.KeepInEditMode)
\r
1643 return dargs.ExceptionHandled;
\r
1646 public virtual void InsertItem (bool causesValidation)
\r
1648 InsertItem (null, causesValidation);
\r
1651 void InsertItem (string param, bool causesValidation)
\r
1653 if (causesValidation && Page != null && !Page.IsValid)
\r
1656 if (CurrentMode != DetailsViewMode.Insert) throw new HttpException ();
\r
1658 currentEditNewValues = GetRowValues (false, true);
\r
1659 DetailsViewInsertEventArgs args = new DetailsViewInsertEventArgs (param, currentEditNewValues);
\r
1660 OnItemInserting (args);
\r
1662 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1665 DataSourceView view = GetData ();
\r
1667 throw new HttpException ("The DataSourceView associated to data bound control was null");
\r
1668 view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));
\r
1671 bool InsertCallback (int recordsAffected, Exception exception)
\r
1673 DetailsViewInsertedEventArgs dargs = new DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
\r
1674 OnItemInserted (dargs);
\r
1676 if (!dargs.KeepInInsertMode)
\r
1679 return dargs.ExceptionHandled;
\r
1682 public virtual void DeleteItem ()
\r
1684 currentEditRowKeys = DataKey.Values;
\r
1685 currentEditNewValues = GetRowValues (true, false);
\r
1687 DetailsViewDeleteEventArgs args = new DetailsViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);
\r
1688 OnItemDeleting (args);
\r
1690 if (args.Cancel || !IsBoundUsingDataSourceID)
\r
1693 DataSourceView view = GetData ();
\r
1695 view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));
\r
1697 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);
\r
1698 OnItemDeleted (dargs);
\r
1700 if (PageIndex > 0 && PageIndex == PageCount - 1)
\r
1702 RequireBinding ();
\r
1705 bool DeleteCallback (int recordsAffected, Exception exception)
\r
1707 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);
\r
1708 OnItemDeleted (dargs);
\r
1709 return dargs.ExceptionHandled;
\r
1712 void EndRowEdit ()
\r
1714 EndRowEdit (true);
\r
1717 void EndRowEdit (bool switchToDefaultMode) {
\r
1718 if (switchToDefaultMode)
\r
1719 ChangeMode (DefaultMode);
\r
1720 oldEditValues = new DataKey (new OrderedDictionary ());
\r
1721 currentEditRowKeys = null;
\r
1722 currentEditOldValues = null;
\r
1723 currentEditNewValues = null;
\r
1724 RequireBinding ();
\r
1727 protected internal override void LoadControlState (object ob)
\r
1729 if (ob == null) return;
\r
1730 object[] state = (object[]) ob;
\r
1731 base.LoadControlState (state[0]);
\r
1732 pageIndex = (int) state[1];
\r
1733 pageCount = (int) state[2];
\r
1734 CurrentMode = (DetailsViewMode) state[3];
\r
1735 dataKeyNames = (string[]) state[4];
\r
1736 defaultMode = (DetailsViewMode) state[5];
\r
1737 if (state [6] != null)
\r
1738 ((IStateManager) DataKey).LoadViewState (state [6]);
\r
1739 if (state [7] != null)
\r
1740 ((IStateManager) OldEditValues).LoadViewState (state [7]);
\r
1743 protected internal override object SaveControlState ()
\r
1745 object bstate = base.SaveControlState ();
\r
1746 return new object[] {
\r
1753 (key == null ? null : ((IStateManager)key).SaveViewState()),
\r
1754 (oldEditValues == null ? null : ((IStateManager) oldEditValues).SaveViewState ())
\r
1758 protected override void TrackViewState()
\r
1760 base.TrackViewState();
\r
1761 if (columns != null) ((IStateManager)columns).TrackViewState();
\r
1762 if (pagerSettings != null) ((IStateManager)pagerSettings).TrackViewState();
\r
1763 if (alternatingRowStyle != null) ((IStateManager)alternatingRowStyle).TrackViewState();
\r
1764 if (footerStyle != null) ((IStateManager)footerStyle).TrackViewState();
\r
1765 if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();
\r
1766 if (pagerStyle != null) ((IStateManager)pagerStyle).TrackViewState();
\r
1767 if (rowStyle != null) ((IStateManager)rowStyle).TrackViewState();
\r
1768 if (editRowStyle != null) ((IStateManager)editRowStyle).TrackViewState();
\r
1769 if (insertRowStyle != null) ((IStateManager)insertRowStyle).TrackViewState();
\r
1770 if (emptyDataRowStyle != null) ((IStateManager)emptyDataRowStyle).TrackViewState();
\r
1771 if (key != null) ((IStateManager)key).TrackViewState();
\r
1772 if (autoFieldProperties != null) {
\r
1773 foreach (IStateManager sm in autoFieldProperties)
\r
1774 sm.TrackViewState ();
\r
1776 if (ControlStyleCreated)
\r
1777 ControlStyle.TrackViewState ();
\r
1780 protected override object SaveViewState()
\r
1782 object[] states = new object [13];
\r
1783 states[0] = base.SaveViewState();
\r
1784 states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());
\r
1785 states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());
\r
1786 states[3] = (alternatingRowStyle == null ? null : ((IStateManager)alternatingRowStyle).SaveViewState());
\r
1787 states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());
\r
1788 states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());
\r
1789 states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());
\r
1790 states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());
\r
1791 states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());
\r
1792 states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());
\r
1793 states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());
\r
1795 if (autoFieldProperties != null) {
\r
1796 object[] data = new object [autoFieldProperties.Length];
\r
1797 bool allNull = true;
\r
1798 for (int n=0; n<data.Length; n++) {
\r
1799 data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();
\r
1800 if (data [n] != null) allNull = false;
\r
1802 if (!allNull) states [11] = data;
\r
1804 if (ControlStyleCreated)
\r
1805 states [12] = ControlStyle.SaveViewState ();
\r
1807 for (int i = states.Length - 1; i >= 0; i--) {
\r
1808 if (states [i] != null)
\r
1815 protected override void LoadViewState (object savedState)
\r
1817 if (savedState == null) {
\r
1818 base.LoadViewState (null);
\r
1822 object [] states = (object []) savedState;
\r
1824 if (states[11] != null) {
\r
1825 object[] data = (object[]) states [11];
\r
1826 autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];
\r
1827 for (int n=0; n<data.Length; n++) {
\r
1828 IStateManager p = new AutoGeneratedFieldProperties ();
\r
1829 p.TrackViewState ();
\r
1830 p.LoadViewState (data [n]);
\r
1831 autoFieldProperties [n] = (AutoGeneratedFieldProperties) p;
\r
1835 base.LoadViewState (states[0]);
\r
1837 if (states[1] != null) ((IStateManager)Fields).LoadViewState (states[1]);
\r
1838 if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
\r
1839 if (states[3] != null) ((IStateManager)AlternatingRowStyle).LoadViewState (states[3]);
\r
1840 if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);
\r
1841 if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);
\r
1842 if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);
\r
1843 if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);
\r
1844 if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);
\r
1845 if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);
\r
1846 if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
\r
1847 if (states [12] != null)
\r
1848 ControlStyle.LoadViewState (states [12]);
\r
1851 void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)
\r
1853 RaiseCallbackEvent (eventArgs);
\r
1856 protected virtual void RaiseCallbackEvent (string eventArgs)
\r
1858 string[] clientData = eventArgs.Split ('|');
\r
1859 PageIndex = int.Parse (clientData[0]);
\r
1861 RaisePostBackEvent (clientData[1]);
\r
1865 string ICallbackEventHandler.GetCallbackResult ()
\r
1867 return GetCallbackResult ();
\r
1870 protected virtual string GetCallbackResult ()
\r
1872 PrepareControlHierarchy ();
\r
1874 StringWriter sw = new StringWriter ();
\r
1875 sw.Write (PageIndex.ToString () + '|');
\r
1877 HtmlTextWriter writer = new HtmlTextWriter (sw);
\r
1878 RenderGrid (writer);
\r
1879 return sw.ToString ();
\r
1882 protected virtual string GetCallbackScript (IButtonControl buttonControl, string argument)
\r
1884 if (EnablePagingCallbacks)
\r
1885 return "javascript:DetailsView_ClientEvent (\"" + ClientID + "\",\"" + buttonControl.CommandName + "$" + buttonControl.CommandArgument + "\"); return false;";
\r
1890 string ICallbackContainer.GetCallbackScript (IButtonControl control, string argument)
\r
1892 return GetCallbackScript (control, argument);
\r
1895 protected override void OnPagePreLoad (object sender, EventArgs e)
\r
1897 base.OnPagePreLoad (sender, e);
\r
1899 if (Page.IsPostBack && EnablePagingCallbacks) {
\r
1901 if (int.TryParse (Page.Request.Form [ClientID + "_Page"], out page))
\r
1906 const string onPreRenderScript = @"var {0} = new Object ();
\r
1907 {0}.pageIndex = {1};
\r
1912 protected internal override void OnPreRender (EventArgs e)
\r
1914 base.OnPreRender (e);
\r
1916 if (EnablePagingCallbacks)
\r
1918 if (!Page.ClientScript.IsClientScriptIncludeRegistered (typeof(DetailsView), "DetailsView.js")) {
\r
1919 string url = Page.ClientScript.GetWebResourceUrl (typeof(DetailsView), "DetailsView.js");
\r
1920 Page.ClientScript.RegisterClientScriptInclude (typeof(DetailsView), "DetailsView.js", url);
\r
1922 Page.ClientScript.RegisterHiddenField (ClientID + "_Page", PageIndex.ToString ());
\r
1924 string cgrid = ClientID + "_data";
\r
1925 string script = String.Format (onPreRenderScript,
\r
1927 ClientScriptManager.GetScriptLiteral (PageIndex),
\r
1928 ClientScriptManager.GetScriptLiteral (UniqueID),
\r
1931 Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
\r
1933 // Make sure the basic script infrastructure is rendered
\r
1934 Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");
\r
1935 Page.ClientScript.GetPostBackClientHyperlink (this, "");
\r
1939 protected internal override void Render (HtmlTextWriter writer)
\r
1941 PrepareControlHierarchy ();
\r
1943 if (EnablePagingCallbacks)
\r
1944 writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID + "_div");
\r
1945 writer.RenderBeginTag (HtmlTextWriterTag.Div);
\r
1947 RenderGrid (writer);
\r
1949 writer.RenderEndTag ();
\r
1952 void RenderGrid (HtmlTextWriter writer)
\r
1954 if (table == null)
\r
1957 table.Render (writer);
\r
1960 PostBackOptions IPostBackContainer.GetPostBackOptions(IButtonControl control)
\r
1962 if (control == null)
\r
1963 throw new ArgumentNullException ("control");
\r
1965 if (control.CausesValidation)
\r
1966 throw new InvalidOperationException ("A button that causes validation in DetailsView '" + ID + "' is attempting to use the container GridView as the post back target. The button should either turn off validation or use itself as the post back container.");
\r
1968 PostBackOptions options = new PostBackOptions (this);
\r
1969 options.Argument = control.CommandName + "$" + control.CommandArgument;
\r
1970 options.RequiresJavaScriptProtocol = true;
\r