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
74 DataControlFieldCollection columns;
\r
75 PagerSettings pagerSettings;
\r
77 TableItemStyle alternatingRowStyle;
\r
78 TableItemStyle editRowStyle;
\r
79 TableItemStyle insertRowStyle;
\r
80 TableItemStyle emptyDataRowStyle;
\r
81 TableItemStyle footerStyle;
\r
82 TableItemStyle headerStyle;
\r
83 TableItemStyle pagerStyle;
\r
84 TableItemStyle rowStyle;
\r
85 TableItemStyle commandRowStyle;
\r
86 TableItemStyle fieldHeaderStyle;
\r
88 IOrderedDictionary _keyTable;
\r
90 DataKey oldEditValues;
\r
91 AutoGeneratedFieldProperties[] autoFieldProperties;
\r
93 private static readonly object PageIndexChangedEvent = new object();
\r
94 private static readonly object PageIndexChangingEvent = new object();
\r
95 private static readonly object ItemCommandEvent = new object();
\r
96 private static readonly object ItemCreatedEvent = new object();
\r
97 private static readonly object ItemDeletedEvent = new object();
\r
98 private static readonly object ItemDeletingEvent = new object();
\r
99 private static readonly object ItemInsertedEvent = new object();
\r
100 private static readonly object ItemInsertingEvent = new object();
\r
101 private static readonly object ModeChangingEvent = new object();
\r
102 private static readonly object ModeChangedEvent = new object();
\r
103 private static readonly object ItemUpdatedEvent = new object();
\r
104 private static readonly object ItemUpdatingEvent = new object();
\r
108 DetailsViewMode currentMode = DetailsViewMode.ReadOnly;
\r
109 bool hasCurrentMode;
\r
112 public DetailsView ()
\r
114 rows = new DetailsViewRowCollection (new ArrayList ());
\r
117 public event EventHandler PageIndexChanged {
\r
118 add { Events.AddHandler (PageIndexChangedEvent, value); }
\r
119 remove { Events.RemoveHandler (PageIndexChangedEvent, value); }
\r
122 public event DetailsViewPageEventHandler PageIndexChanging {
\r
123 add { Events.AddHandler (PageIndexChangingEvent, value); }
\r
124 remove { Events.RemoveHandler (PageIndexChangingEvent, value); }
\r
127 public event DetailsViewCommandEventHandler ItemCommand {
\r
128 add { Events.AddHandler (ItemCommandEvent, value); }
\r
129 remove { Events.RemoveHandler (ItemCommandEvent, value); }
\r
132 public event EventHandler ItemCreated {
\r
133 add { Events.AddHandler (ItemCreatedEvent, value); }
\r
134 remove { Events.RemoveHandler (ItemCreatedEvent, value); }
\r
137 public event DetailsViewDeletedEventHandler ItemDeleted {
\r
138 add { Events.AddHandler (ItemDeletedEvent, value); }
\r
139 remove { Events.RemoveHandler (ItemDeletedEvent, value); }
\r
142 public event DetailsViewDeleteEventHandler ItemDeleting {
\r
143 add { Events.AddHandler (ItemDeletingEvent, value); }
\r
144 remove { Events.RemoveHandler (ItemDeletingEvent, value); }
\r
147 public event DetailsViewInsertedEventHandler ItemInserted {
\r
148 add { Events.AddHandler (ItemInsertedEvent, value); }
\r
149 remove { Events.RemoveHandler (ItemInsertedEvent, value); }
\r
152 public event DetailsViewInsertEventHandler ItemInserting {
\r
153 add { Events.AddHandler (ItemInsertingEvent, value); }
\r
154 remove { Events.RemoveHandler (ItemInsertingEvent, value); }
\r
157 public event DetailsViewModeEventHandler ModeChanging {
\r
158 add { Events.AddHandler (ModeChangingEvent, value); }
\r
159 remove { Events.RemoveHandler (ModeChangingEvent, value); }
\r
162 public event EventHandler ModeChanged {
\r
163 add { Events.AddHandler (ModeChangedEvent, value); }
\r
164 remove { Events.RemoveHandler (ModeChangedEvent, value); }
\r
167 public event DetailsViewUpdatedEventHandler ItemUpdated {
\r
168 add { Events.AddHandler (ItemUpdatedEvent, value); }
\r
169 remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
\r
172 public event DetailsViewUpdateEventHandler ItemUpdating {
\r
173 add { Events.AddHandler (ItemUpdatingEvent, value); }
\r
174 remove { Events.RemoveHandler (ItemUpdatingEvent, value); }
\r
177 protected virtual void OnPageIndexChanged (EventArgs e)
\r
179 if (Events != null) {
\r
180 EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];
\r
181 if (eh != null) eh (this, e);
\r
185 protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)
\r
187 if (Events != null) {
\r
188 DetailsViewPageEventHandler eh = (DetailsViewPageEventHandler) Events [PageIndexChangingEvent];
\r
189 if (eh != null) eh (this, e);
\r
193 protected virtual void OnItemCommand (DetailsViewCommandEventArgs e)
\r
195 if (Events != null) {
\r
196 DetailsViewCommandEventHandler eh = (DetailsViewCommandEventHandler) Events [ItemCommandEvent];
\r
197 if (eh != null) eh (this, e);
\r
201 protected virtual void OnItemCreated (EventArgs e)
\r
203 if (Events != null) {
\r
204 EventHandler eh = (EventHandler) Events [ItemCreatedEvent];
\r
205 if (eh != null) eh (this, e);
\r
209 protected virtual void OnItemDeleted (DetailsViewDeletedEventArgs e)
\r
211 if (Events != null) {
\r
212 DetailsViewDeletedEventHandler eh = (DetailsViewDeletedEventHandler) Events [ItemDeletedEvent];
\r
213 if (eh != null) eh (this, e);
\r
217 protected virtual void OnItemInserted (DetailsViewInsertedEventArgs e)
\r
219 if (Events != null) {
\r
220 DetailsViewInsertedEventHandler eh = (DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
\r
221 if (eh != null) eh (this, e);
\r
225 protected virtual void OnItemInserting (DetailsViewInsertEventArgs e)
\r
227 if (Events != null) {
\r
228 DetailsViewInsertEventHandler eh = (DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
\r
229 if (eh != null) eh (this, e);
\r
233 protected virtual void OnItemDeleting (DetailsViewDeleteEventArgs e)
\r
235 if (Events != null) {
\r
236 DetailsViewDeleteEventHandler eh = (DetailsViewDeleteEventHandler) Events [ItemDeletingEvent];
\r
237 if (eh != null) eh (this, e);
\r
241 protected virtual void OnModeChanged (EventArgs e)
\r
243 if (Events != null) {
\r
244 EventHandler eh = (EventHandler) Events [ModeChangedEvent];
\r
245 if (eh != null) eh (this, e);
\r
249 protected virtual void OnModeChanging (DetailsViewModeEventArgs e)
\r
251 if (Events != null) {
\r
252 DetailsViewModeEventHandler eh = (DetailsViewModeEventHandler) Events [ModeChangingEvent];
\r
253 if (eh != null) eh (this, e);
\r
257 protected virtual void OnItemUpdated (DetailsViewUpdatedEventArgs e)
\r
259 if (Events != null) {
\r
260 DetailsViewUpdatedEventHandler eh = (DetailsViewUpdatedEventHandler) Events [ItemUpdatedEvent];
\r
261 if (eh != null) eh (this, e);
\r
265 protected virtual void OnItemUpdating (DetailsViewUpdateEventArgs e)
\r
267 if (Events != null) {
\r
268 DetailsViewUpdateEventHandler eh = (DetailsViewUpdateEventHandler) Events [ItemUpdatingEvent];
\r
269 if (eh != null) eh (this, e);
\r
274 [WebCategoryAttribute ("Paging")]
\r
275 [DefaultValueAttribute (false)]
\r
276 public virtual bool AllowPaging {
\r
278 object ob = ViewState ["AllowPaging"];
\r
279 if (ob != null) return (bool) ob;
\r
283 ViewState ["AllowPaging"] = value;
\r
288 [DefaultValueAttribute (null)]
\r
289 [WebCategoryAttribute ("Styles")]
\r
290 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
291 [NotifyParentProperty (true)]
\r
292 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
293 public TableItemStyle AlternatingRowStyle {
\r
295 if (alternatingRowStyle == null) {
\r
296 alternatingRowStyle = new TableItemStyle ();
\r
297 if (IsTrackingViewState)
\r
298 alternatingRowStyle.TrackViewState();
\r
300 return alternatingRowStyle;
\r
304 [WebCategoryAttribute ("Behavior")]
\r
305 [DefaultValueAttribute (false)]
\r
306 public virtual bool AutoGenerateEditButton {
\r
308 object ob = ViewState ["AutoGenerateEditButton"];
\r
309 if (ob != null) return (bool) ob;
\r
313 ViewState ["AutoGenerateEditButton"] = value;
\r
318 [WebCategoryAttribute ("Behavior")]
\r
319 [DefaultValueAttribute (false)]
\r
320 public virtual bool AutoGenerateDeleteButton {
\r
322 object ob = ViewState ["AutoGenerateDeleteButton"];
\r
323 if (ob != null) return (bool) ob;
\r
327 ViewState ["AutoGenerateDeleteButton"] = value;
\r
332 [WebCategoryAttribute ("Behavior")]
\r
333 [DefaultValueAttribute (false)]
\r
334 public virtual bool AutoGenerateInsertButton {
\r
336 object ob = ViewState ["AutoGenerateInsertButton"];
\r
337 if (ob != null) return (bool) ob;
\r
341 ViewState ["AutoGenerateInsertButton"] = value;
\r
346 [WebCategoryAttribute ("Behavior")]
\r
347 [DefaultValueAttribute (true)]
\r
348 public virtual bool AutoGenerateRows {
\r
350 object ob = ViewState ["AutoGenerateRows"];
\r
351 if (ob != null) return (bool) ob;
\r
355 ViewState ["AutoGenerateRows"] = value;
\r
360 [UrlPropertyAttribute]
\r
361 [WebCategoryAttribute ("Appearance")]
\r
362 [DefaultValueAttribute ("")]
\r
363 [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
364 public virtual string BackImageUrl {
\r
366 if (ControlStyleCreated)
\r
367 return ((TableStyle) ControlStyle).BackImageUrl;
\r
368 return String.Empty;
\r
371 ((TableStyle) ControlStyle).BackImageUrl = value;
\r
375 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
376 [BrowsableAttribute (false)]
\r
377 public virtual DetailsViewRow BottomPagerRow {
\r
379 EnsureDataBound ();
\r
380 return bottomPagerRow;
\r
384 [WebCategoryAttribute ("Accessibility")]
\r
385 [DefaultValueAttribute ("")]
\r
386 [LocalizableAttribute (true)]
\r
387 public virtual string Caption {
\r
389 object ob = ViewState ["Caption"];
\r
390 if (ob != null) return (string) ob;
\r
391 return string.Empty;
\r
394 ViewState ["Caption"] = value;
\r
399 [WebCategoryAttribute ("Accessibility")]
\r
400 [DefaultValueAttribute (TableCaptionAlign.NotSet)]
\r
401 public virtual TableCaptionAlign CaptionAlign
\r
404 object o = ViewState ["CaptionAlign"];
\r
405 if(o != null) return (TableCaptionAlign) o;
\r
406 return TableCaptionAlign.NotSet;
\r
409 ViewState ["CaptionAlign"] = value;
\r
414 [WebCategoryAttribute ("Layout")]
\r
415 [DefaultValueAttribute (-1)]
\r
416 public virtual int CellPadding
\r
419 if (ControlStyleCreated)
\r
420 return ((TableStyle) ControlStyle).CellPadding;
\r
424 ((TableStyle) ControlStyle).CellPadding = value;
\r
428 [WebCategoryAttribute ("Layout")]
\r
429 [DefaultValueAttribute (0)]
\r
430 public virtual int CellSpacing
\r
433 if (ControlStyleCreated)
\r
434 return ((TableStyle) ControlStyle).CellSpacing;
\r
438 ((TableStyle) ControlStyle).CellSpacing = value;
\r
442 [DefaultValueAttribute (null)]
\r
443 [WebCategoryAttribute ("Styles")]
\r
444 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
445 [NotifyParentProperty (true)]
\r
446 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
447 public TableItemStyle CommandRowStyle {
\r
449 if (commandRowStyle == null) {
\r
450 commandRowStyle = new TableItemStyle ();
\r
451 if (IsTrackingViewState)
\r
452 commandRowStyle.TrackViewState();
\r
454 return commandRowStyle;
\r
458 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
459 [BrowsableAttribute (false)]
\r
460 public DetailsViewMode CurrentMode {
\r
462 return hasCurrentMode ? currentMode : DefaultMode;
\r
465 hasCurrentMode = true;
\r
466 currentMode = value;
\r
470 DetailsViewMode defaultMode = DetailsViewMode.ReadOnly;
\r
471 [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
\r
472 [WebCategoryAttribute ("Behavior")]
\r
473 public virtual DetailsViewMode DefaultMode {
\r
475 return defaultMode;
\r
478 defaultMode = value;
\r
483 [EditorAttribute ("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
484 [MergablePropertyAttribute (false)]
\r
485 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
486 [DefaultValueAttribute (null)]
\r
487 [WebCategoryAttribute ("Misc")]
\r
488 public virtual DataControlFieldCollection Fields {
\r
490 if (columns == null) {
\r
491 columns = new DataControlFieldCollection ();
\r
492 columns.FieldsChanged += new EventHandler (OnFieldsChanged);
\r
493 if (IsTrackingViewState)
\r
494 ((IStateManager)columns).TrackViewState ();
\r
500 string[] dataKeyNames = null;
\r
502 [DefaultValueAttribute (null)]
\r
503 [WebCategoryAttribute ("Data")]
\r
504 [TypeConverter (typeof(StringArrayConverter))]
\r
505 [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
506 public virtual string[] DataKeyNames
\r
509 if (dataKeyNames == null)
\r
512 return dataKeyNames;
\r
515 dataKeyNames = value;
\r
520 IOrderedDictionary KeyTable {
\r
522 if (_keyTable == null) {
\r
523 _keyTable = new OrderedDictionary (DataKeyNames.Length);
\r
529 [BrowsableAttribute (false)]
\r
530 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
531 public virtual DataKey DataKey {
\r
534 key = new DataKey (KeyTable);
\r
540 DataKey OldEditValues {
\r
542 if (oldEditValues == null) {
\r
543 oldEditValues = new DataKey (new OrderedDictionary ());
\r
545 return oldEditValues;
\r
549 [WebCategoryAttribute ("Styles")]
\r
550 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
551 [NotifyParentProperty (true)]
\r
552 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
553 [DefaultValueAttribute (null)]
\r
554 public TableItemStyle EditRowStyle {
\r
556 if (editRowStyle == null) {
\r
557 editRowStyle = new TableItemStyle ();
\r
558 if (IsTrackingViewState)
\r
559 editRowStyle.TrackViewState();
\r
561 return editRowStyle;
\r
565 [WebCategoryAttribute ("Styles")]
\r
566 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
567 [NotifyParentProperty (true)]
\r
568 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
569 [DefaultValueAttribute (null)]
\r
570 public TableItemStyle EmptyDataRowStyle {
\r
572 if (emptyDataRowStyle == null) {
\r
573 emptyDataRowStyle = new TableItemStyle ();
\r
574 if (IsTrackingViewState)
\r
575 emptyDataRowStyle.TrackViewState();
\r
577 return emptyDataRowStyle;
\r
581 [DefaultValue (null)]
\r
582 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
583 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
584 [Browsable (false)]
\r
585 public virtual ITemplate EmptyDataTemplate {
\r
586 get { return emptyDataTemplate; }
\r
587 set { emptyDataTemplate = value; RequireBinding (); }
\r
590 [LocalizableAttribute (true)]
\r
591 [WebCategoryAttribute ("Appearance")]
\r
592 [DefaultValueAttribute ("")]
\r
593 public virtual string EmptyDataText {
\r
595 object ob = ViewState ["EmptyDataText"];
\r
596 if (ob != null) return (string) ob;
\r
597 return string.Empty;
\r
600 ViewState ["EmptyDataText"] = value;
\r
605 [WebCategoryAttribute ("Behavior")]
\r
606 [DefaultValueAttribute (false)]
\r
607 public virtual bool EnablePagingCallbacks {
\r
609 object ob = ViewState ["EnablePagingCallbacks"];
\r
610 if (ob != null) return (bool) ob;
\r
614 ViewState ["EnablePagingCallbacks"] = value;
\r
619 [WebCategoryAttribute ("Styles")]
\r
620 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
621 [NotifyParentProperty (true)]
\r
622 [DefaultValue (null)]
\r
623 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
624 public TableItemStyle FieldHeaderStyle {
\r
626 if (fieldHeaderStyle == null) {
\r
627 fieldHeaderStyle = new TableItemStyle ();
\r
628 if (IsTrackingViewState)
\r
629 fieldHeaderStyle.TrackViewState();
\r
631 return fieldHeaderStyle;
\r
635 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
636 [BrowsableAttribute (false)]
\r
637 public virtual DetailsViewRow FooterRow {
\r
639 EnsureChildControls ();
\r
644 [DefaultValue (null)]
\r
645 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
646 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
647 [Browsable (false)]
\r
648 public virtual ITemplate FooterTemplate {
\r
649 get { return footerTemplate; }
\r
650 set { footerTemplate = value; RequireBinding (); }
\r
653 [LocalizableAttribute (true)]
\r
654 [WebCategoryAttribute ("Appearance")]
\r
655 [DefaultValueAttribute ("")]
\r
656 public virtual string FooterText {
\r
658 object ob = ViewState ["FooterText"];
\r
659 if (ob != null) return (string) ob;
\r
660 return string.Empty;
\r
663 ViewState ["FooterText"] = value;
\r
668 [WebCategoryAttribute ("Styles")]
\r
669 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
670 [NotifyParentProperty (true)]
\r
671 [DefaultValue (null)]
\r
672 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
673 public TableItemStyle FooterStyle {
\r
675 if (footerStyle == null) {
\r
676 footerStyle = new TableItemStyle ();
\r
677 if (IsTrackingViewState)
\r
678 footerStyle.TrackViewState();
\r
680 return footerStyle;
\r
684 [WebCategoryAttribute ("Appearance")]
\r
685 [DefaultValueAttribute (GridLines.Both)]
\r
686 public virtual GridLines GridLines {
\r
688 if (ControlStyleCreated)
\r
689 return ((TableStyle) ControlStyle).GridLines;
\r
690 return GridLines.Both;
\r
693 ((TableStyle) ControlStyle).GridLines = value;
\r
697 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
698 [BrowsableAttribute (false)]
\r
699 public virtual DetailsViewRow HeaderRow {
\r
701 EnsureChildControls ();
\r
706 [WebCategoryAttribute ("Styles")]
\r
707 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
708 [NotifyParentProperty (true)]
\r
709 [DefaultValue (null)]
\r
710 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
711 public TableItemStyle HeaderStyle {
\r
713 if (headerStyle == null) {
\r
714 headerStyle = new TableItemStyle ();
\r
715 if (IsTrackingViewState)
\r
716 headerStyle.TrackViewState();
\r
718 return headerStyle;
\r
722 [DefaultValue (null)]
\r
723 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
724 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
725 [Browsable (false)]
\r
726 public virtual ITemplate HeaderTemplate {
\r
727 get { return headerTemplate; }
\r
728 set { headerTemplate = value; RequireBinding (); }
\r
731 [LocalizableAttribute (true)]
\r
732 [WebCategoryAttribute ("Appearance")]
\r
733 [DefaultValueAttribute ("")]
\r
734 public virtual string HeaderText {
\r
736 object ob = ViewState ["HeaderText"];
\r
737 if (ob != null) return (string) ob;
\r
738 return string.Empty;
\r
741 ViewState ["HeaderText"] = value;
\r
746 [Category ("Layout")]
\r
747 [DefaultValueAttribute (HorizontalAlign.NotSet)]
\r
748 public virtual HorizontalAlign HorizontalAlign {
\r
750 if (ControlStyleCreated)
\r
751 return ((TableStyle) ControlStyle).HorizontalAlign;
\r
752 return HorizontalAlign.NotSet;
\r
755 ((TableStyle) ControlStyle).HorizontalAlign = value;
\r
759 [WebCategoryAttribute ("Styles")]
\r
760 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
761 [NotifyParentProperty (true)]
\r
762 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
763 [DefaultValueAttribute (null)]
\r
764 public TableItemStyle InsertRowStyle {
\r
766 if (insertRowStyle == null) {
\r
767 insertRowStyle = new TableItemStyle ();
\r
768 if (IsTrackingViewState)
\r
769 insertRowStyle.TrackViewState();
\r
771 return insertRowStyle;
\r
775 [BrowsableAttribute (false)]
\r
776 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
777 public virtual int PageCount {
\r
783 [WebCategoryAttribute ("Paging")]
\r
784 [BindableAttribute (true, BindingDirection.OneWay)]
\r
785 [DefaultValueAttribute (0)]
\r
786 public virtual int PageIndex {
\r
792 throw new ArgumentOutOfRangeException ("PageIndex must be non-negative");
\r
793 if (value == pageIndex)
\r
800 [WebCategoryAttribute ("Paging")]
\r
801 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
\r
802 [NotifyParentPropertyAttribute (true)]
\r
803 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
804 public virtual PagerSettings PagerSettings {
\r
806 if (pagerSettings == null) {
\r
807 pagerSettings = new PagerSettings (this);
\r
808 if (IsTrackingViewState)
\r
809 ((IStateManager)pagerSettings).TrackViewState ();
\r
811 return pagerSettings;
\r
815 [WebCategoryAttribute ("Styles")]
\r
816 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
817 [NotifyParentProperty (true)]
\r
818 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
819 public TableItemStyle PagerStyle {
\r
821 if (pagerStyle == null) {
\r
822 pagerStyle = new TableItemStyle ();
\r
823 if (IsTrackingViewState)
\r
824 pagerStyle.TrackViewState();
\r
831 [DefaultValue (null)]
\r
832 [TemplateContainer (typeof (DetailsView), BindingDirection.OneWay)]
\r
833 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
834 [Browsable (false)]
\r
835 public virtual ITemplate PagerTemplate {
\r
836 get { return pagerTemplate; }
\r
837 set { pagerTemplate = value; RequireBinding (); }
\r
840 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
841 [BrowsableAttribute (false)]
\r
842 public virtual DetailsViewRowCollection Rows {
\r
844 EnsureChildControls ();
\r
849 [WebCategoryAttribute ("Styles")]
\r
850 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
851 [NotifyParentProperty (true)]
\r
852 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
853 [DefaultValue (null)]
\r
854 public TableItemStyle RowStyle {
\r
856 if (rowStyle == null) {
\r
857 rowStyle = new TableItemStyle ();
\r
858 if (IsTrackingViewState)
\r
859 rowStyle.TrackViewState();
\r
865 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
866 [BrowsableAttribute (false)]
\r
867 public object SelectedValue {
\r
868 get { return DataKey.Value; }
\r
871 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
872 [BrowsableAttribute (false)]
\r
873 public virtual DetailsViewRow TopPagerRow {
\r
875 EnsureDataBound ();
\r
876 return topPagerRow;
\r
880 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
881 [BrowsableAttribute (false)]
\r
882 public virtual object DataItem {
\r
884 EnsureDataBound ();
\r
889 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
890 [BrowsableAttribute (false)]
\r
891 public int DataItemCount {
\r
892 get { return PageCount; }
\r
895 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
896 [BrowsableAttribute (false)]
\r
897 public virtual int DataItemIndex {
\r
898 get { return PageIndex; }
\r
901 int IDataItemContainer.DisplayIndex {
\r
902 get { return PageIndex; }
\r
905 public virtual bool IsBindableType (Type type)
\r
907 return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);
\r
910 protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
\r
912 DataSourceSelectArguments arg = new DataSourceSelectArguments ();
\r
913 DataSourceView view = GetData ();
\r
914 if (AllowPaging && view.CanPage) {
\r
915 arg.StartRowIndex = PageIndex;
\r
916 if (view.CanRetrieveTotalRowCount) {
\r
917 arg.RetrieveTotalRowCount = true;
\r
918 arg.MaximumRows = 1;
\r
921 arg.MaximumRows = -1;
\r
927 protected virtual ICollection CreateFieldSet (object dataItem, bool useDataSource)
\r
929 ArrayList fields = new ArrayList ();
\r
931 if (AutoGenerateRows) {
\r
932 if (useDataSource) {
\r
933 if (dataItem != null)
\r
934 fields.AddRange (CreateAutoGeneratedRows (dataItem));
\r
936 if (autoFieldProperties != null) {
\r
937 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
938 fields.Add (CreateAutoGeneratedRow (props));
\r
943 fields.AddRange (Fields);
\r
945 if (AutoGenerateEditButton || AutoGenerateDeleteButton || AutoGenerateInsertButton) {
\r
946 CommandField field = new CommandField ();
\r
947 field.ShowEditButton = AutoGenerateEditButton;
\r
948 field.ShowDeleteButton = AutoGenerateDeleteButton;
\r
949 field.ShowInsertButton = AutoGenerateInsertButton;
\r
950 fields.Add (field);
\r
956 protected virtual ICollection CreateAutoGeneratedRows (object dataItem)
\r
958 ArrayList list = new ArrayList ();
\r
959 autoFieldProperties = CreateAutoFieldProperties (dataItem);
\r
960 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
961 list.Add (CreateAutoGeneratedRow (props));
\r
965 protected virtual AutoGeneratedField CreateAutoGeneratedRow (AutoGeneratedFieldProperties fieldProperties)
\r
967 return new AutoGeneratedField (fieldProperties);
\r
970 AutoGeneratedFieldProperties[] CreateAutoFieldProperties (object dataItem)
\r
972 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
\r
974 ArrayList retVal = new ArrayList();
\r
975 if (props != null && props.Count > 0)
\r
977 foreach (PropertyDescriptor current in props) {
\r
978 if (IsBindableType (current.PropertyType)) {
\r
979 AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
\r
980 ((IStateManager)field).TrackViewState();
\r
981 field.Name = current.Name;
\r
982 field.DataField = current.Name;
\r
983 field.IsReadOnly = current.IsReadOnly;
\r
984 field.Type = current.PropertyType;
\r
985 retVal.Add (field);
\r
990 if (retVal.Count > 0)
\r
991 return (AutoGeneratedFieldProperties[]) retVal.ToArray (typeof(AutoGeneratedFieldProperties));
\r
993 return new AutoGeneratedFieldProperties [0];
\r
996 protected virtual DetailsViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
\r
998 DetailsViewRow row;
\r
999 if (rowType == DataControlRowType.Pager)
\r
1000 row = new DetailsViewPagerRow (rowIndex, rowType, rowState);
\r
1002 row = new DetailsViewRow (rowIndex, rowType, rowState);
\r
1003 OnItemCreated (EventArgs.Empty);
\r
1007 void RequireBinding ()
\r
1009 if (Initialized) {
\r
1010 RequiresDataBinding = true;
\r
1014 protected virtual Table CreateTable ()
\r
1016 return new ContainedTable (this);
\r
1019 protected override Style CreateControlStyle ()
\r
1021 TableStyle style = new TableStyle (ViewState);
\r
1022 style.GridLines = GridLines.Both;
\r
1023 style.CellSpacing = 0;
\r
1027 protected override int CreateChildControls (IEnumerable data, bool dataBinding)
\r
1029 PagedDataSource dataSource;
\r
1031 if (dataBinding) {
\r
1032 DataSourceView view = GetData ();
\r
1033 dataSource = new PagedDataSource ();
\r
1034 dataSource.DataSource = data;
\r
1036 if (AllowPaging) {
\r
1037 dataSource.AllowPaging = true;
\r
1038 dataSource.PageSize = 1;
\r
1039 dataSource.CurrentPageIndex = PageIndex;
\r
1040 if (view.CanPage) {
\r
1041 dataSource.AllowServerPaging = true;
\r
1042 if (SelectArguments.RetrieveTotalRowCount)
\r
1043 dataSource.VirtualCount = SelectArguments.TotalRowCount;
\r
1047 pageCount = dataSource.DataSourceCount;
\r
1051 dataSource = new PagedDataSource ();
\r
1052 dataSource.DataSource = data;
\r
1053 if (AllowPaging) {
\r
1054 dataSource.AllowPaging = true;
\r
1055 dataSource.PageSize = 1;
\r
1056 dataSource.CurrentPageIndex = PageIndex;
\r
1060 bool showPager = AllowPaging && (PageCount > 1);
\r
1062 Controls.Clear ();
\r
1063 table = CreateTable ();
\r
1064 Controls.Add (table);
\r
1066 ArrayList list = new ArrayList ();
\r
1068 // Gets the current data item
\r
1070 IEnumerator e = dataSource.GetEnumerator ();
\r
1071 if (e.MoveNext ())
\r
1072 dataItem = e.Current;
\r
1076 // Creates the set of fields to show
\r
1078 ICollection fieldCollection = CreateFieldSet (dataItem, dataBinding);
\r
1079 DataControlField[] fields = new DataControlField [fieldCollection.Count];
\r
1080 fieldCollection.CopyTo (fields, 0);
\r
1082 foreach (DataControlField field in fields) {
\r
1083 field.Initialize (false, this);
\r
1084 if (EnablePagingCallbacks)
\r
1085 field.ValidateSupportsCallback ();
\r
1088 // Main table creation
\r
1090 headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
\r
1091 DataControlFieldCell headerCell = new DataControlFieldCell (null);
\r
1092 headerCell.ColumnSpan = 2;
\r
1093 if (headerTemplate != null)
\r
1094 headerTemplate.InstantiateIn (headerCell);
\r
1096 headerCell.Text = HeaderText;
\r
1097 headerRow.Cells.Add (headerCell);
\r
1098 table.Rows.Add (headerRow);
\r
1100 if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1101 topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1102 InitializePager (topPagerRow, dataSource);
\r
1103 table.Rows.Add (topPagerRow);
\r
1106 if (dataSource.Count > 0) {
\r
1107 foreach (DataControlField field in fields) {
\r
1108 DataControlRowState rstate = GetRowState (list.Count);
\r
1109 DetailsViewRow row = CreateRow (PageIndex, DataControlRowType.DataRow, rstate);
\r
1110 InitializeRow (row, field);
\r
1111 table.Rows.Add (row);
\r
1115 table.Rows.Add (CreateEmptyrRow ());
\r
1118 rows = new DetailsViewRowCollection (list);
\r
1120 footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);
\r
1121 DataControlFieldCell footerCell = new DataControlFieldCell (null);
\r
1122 footerCell.ColumnSpan = 2;
\r
1123 if (footerTemplate != null)
\r
1124 footerTemplate.InstantiateIn (footerCell);
\r
1126 footerCell.Text = FooterText;
\r
1127 footerRow.Cells.Add (footerCell);
\r
1128 table.Rows.Add (footerRow);
\r
1130 if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1131 bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1132 InitializePager (bottomPagerRow, dataSource);
\r
1133 table.Rows.Add (bottomPagerRow);
\r
1139 return dataSource.DataSourceCount;
\r
1142 protected override void EnsureDataBound ()
\r
1144 base.EnsureDataBound ();
\r
1147 DataControlRowState GetRowState (int index)
\r
1149 DataControlRowState rstate = (index % 2) == 0 ? DataControlRowState.Normal : DataControlRowState.Alternate;
\r
1150 if (CurrentMode == DetailsViewMode.Edit) rstate |= DataControlRowState.Edit;
\r
1151 else if (CurrentMode == DetailsViewMode.Insert) rstate |= DataControlRowState.Insert;
\r
1155 protected virtual void InitializePager (DetailsViewRow row, PagedDataSource dataSource)
\r
1157 TableCell cell = new TableCell ();
\r
1158 cell.ColumnSpan = 2;
\r
1160 if (pagerTemplate != null)
\r
1161 pagerTemplate.InstantiateIn (cell);
\r
1163 cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));
\r
1165 row.Cells.Add (cell);
\r
1168 DetailsViewRow CreateEmptyrRow ()
\r
1170 DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
\r
1171 TableCell cell = new TableCell ();
\r
1172 cell.ColumnSpan = 2;
\r
1174 if (emptyDataTemplate != null)
\r
1175 emptyDataTemplate.InstantiateIn (cell);
\r
1177 cell.Text = EmptyDataText;
\r
1179 row.Cells.Add (cell);
\r
1183 protected virtual void InitializeRow (DetailsViewRow row, DataControlField field)
\r
1185 row.ContainingField = field;
\r
1186 DataControlFieldCell cell;
\r
1188 if (field.ShowHeader) {
\r
1189 cell = new DataControlFieldCell (field);
\r
1190 row.Cells.Add (cell);
\r
1191 field.InitializeCell (cell, DataControlCellType.Header, row.RowState, row.RowIndex);
\r
1194 cell = new DataControlFieldCell (field);
\r
1195 if (!field.ShowHeader)
\r
1196 cell.ColumnSpan = 2;
\r
1197 row.Cells.Add (cell);
\r
1198 field.InitializeCell (cell, DataControlCellType.DataCell, row.RowState, row.RowIndex);
\r
1200 if (CurrentMode == DetailsViewMode.Insert && !field.InsertVisible)
\r
1201 row.Visible = false;
\r
1204 void FillRowDataKey (object dataItem)
\r
1206 KeyTable.Clear ();
\r
1208 if (cachedKeyProperties == null) {
\r
1209 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
\r
1210 cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];
\r
1211 for (int n=0; n<DataKeyNames.Length; n++) {
\r
1212 PropertyDescriptor p = props [DataKeyNames[n]];
\r
1214 new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());
\r
1215 cachedKeyProperties [n] = p;
\r
1219 foreach (PropertyDescriptor p in cachedKeyProperties)
\r
1220 KeyTable [p.Name] = p.GetValue (dataItem);
\r
1223 IOrderedDictionary GetRowValues (bool includeReadOnlyFields, bool includePrimaryKey)
\r
1225 OrderedDictionary dic = new OrderedDictionary ();
\r
1226 ExtractRowValues (dic, includeReadOnlyFields, includePrimaryKey);
\r
1230 protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeReadOnlyFields, bool includePrimaryKey)
\r
1232 foreach (DetailsViewRow row in Rows) {
\r
1233 if (row.Cells.Count < 1) continue;
\r
1234 DataControlFieldCell c = row.Cells[row.Cells.Count-1] as DataControlFieldCell;
\r
1236 c.ContainingField.ExtractValuesFromCell (fieldValues, c, row.RowState, includeReadOnlyFields);
\r
1238 if (!includePrimaryKey && DataKeyNames != null)
\r
1239 foreach (string key in DataKeyNames)
\r
1240 fieldValues.Remove (key);
\r
1243 protected override HtmlTextWriterTag TagKey {
\r
1245 if (EnablePagingCallbacks)
\r
1246 return HtmlTextWriterTag.Div;
\r
1248 return HtmlTextWriterTag.Table;
\r
1252 public sealed override void DataBind ()
\r
1254 if (CurrentMode == DetailsViewMode.Insert) {
\r
1255 RequiresDataBinding = false;
\r
1256 PerformDataBinding (new object [] { null });
\r
1260 cachedKeyProperties = null;
\r
1263 if (dataItem != null) {
\r
1264 if (CurrentMode == DetailsViewMode.Edit)
\r
1265 oldEditValues = new DataKey (GetRowValues (false, true));
\r
1266 FillRowDataKey (dataItem);
\r
1267 key = new DataKey (KeyTable);
\r
1271 protected internal override void PerformDataBinding (IEnumerable data)
\r
1273 base.PerformDataBinding (data);
\r
1276 protected internal virtual void PrepareControlHierarchy ()
\r
1278 if (table == null)
\r
1281 table.Caption = Caption;
\r
1282 table.CaptionAlign = CaptionAlign;
\r
1284 foreach (DetailsViewRow row in table.Rows) {
\r
1285 switch (row.RowType) {
\r
1286 case DataControlRowType.Header:
\r
1287 if (headerStyle != null && !headerStyle.IsEmpty)
\r
1288 row.ControlStyle.CopyFrom (headerStyle);
\r
1290 case DataControlRowType.Footer:
\r
1291 if (footerStyle != null && !footerStyle.IsEmpty)
\r
1292 row.ControlStyle.CopyFrom (footerStyle);
\r
1294 case DataControlRowType.Pager:
\r
1295 if (pagerStyle != null && !pagerStyle.IsEmpty)
\r
1296 row.ControlStyle.CopyFrom (pagerStyle);
\r
1298 case DataControlRowType.EmptyDataRow:
\r
1299 if (emptyDataRowStyle != null && !emptyDataRowStyle.IsEmpty)
\r
1300 row.ControlStyle.CopyFrom (emptyDataRowStyle);
\r
1302 case DataControlRowType.DataRow:
\r
1303 if (rowStyle != null && !rowStyle.IsEmpty)
\r
1304 row.ControlStyle.CopyFrom (rowStyle);
\r
1305 if ((row.RowState & DataControlRowState.Alternate) != 0 && alternatingRowStyle != null && !alternatingRowStyle.IsEmpty)
\r
1306 row.ControlStyle.CopyFrom (alternatingRowStyle);
\r
1307 if ((row.RowState & DataControlRowState.Edit) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)
\r
1308 row.ControlStyle.CopyFrom (editRowStyle);
\r
1309 if ((row.RowState & DataControlRowState.Insert) != 0 && insertRowStyle != null && !insertRowStyle.IsEmpty)
\r
1310 row.ControlStyle.CopyFrom (insertRowStyle);
\r
1316 if ((row.ContainingField is CommandField) && commandRowStyle != null && !commandRowStyle.IsEmpty)
\r
1317 row.ControlStyle.CopyFrom (commandRowStyle);
\r
1319 for (int n = 0; n < row.Cells.Count; n++) {
\r
1320 DataControlFieldCell fcell = row.Cells [n] as DataControlFieldCell;
\r
1321 if (fcell != null && fcell.ContainingField != null) {
\r
1322 DataControlField field = fcell.ContainingField;
\r
1323 if (n == 0 && field.ShowHeader) {
\r
1324 if (fieldHeaderStyle != null && !fieldHeaderStyle.IsEmpty)
\r
1325 fcell.ControlStyle.CopyFrom (fieldHeaderStyle);
\r
1326 if (field.HeaderStyleCreated && !field.HeaderStyle.IsEmpty)
\r
1327 fcell.ControlStyle.CopyFrom (field.HeaderStyle);
\r
1330 if (field.ControlStyleCreated && !field.ControlStyle.IsEmpty)
\r
1331 foreach (Control c in fcell.Controls) {
\r
1332 WebControl wc = c as WebControl;
\r
1334 wc.ControlStyle.MergeWith (field.ControlStyle);
\r
1336 if (field.ItemStyleCreated && !field.ItemStyle.IsEmpty)
\r
1337 fcell.ControlStyle.CopyFrom (field.ItemStyle);
\r
1344 protected internal override void OnInit (EventArgs e)
\r
1346 Page.RegisterRequiresControlState (this);
\r
1350 void OnFieldsChanged (object sender, EventArgs args)
\r
1352 RequireBinding ();
\r
1355 protected override void OnDataSourceViewChanged (object sender, EventArgs e)
\r
1357 base.OnDataSourceViewChanged (sender, e);
\r
1358 RequireBinding ();
\r
1361 protected override bool OnBubbleEvent (object source, EventArgs e)
\r
1363 DetailsViewCommandEventArgs args = e as DetailsViewCommandEventArgs;
\r
1364 if (args != null) {
\r
1365 OnItemCommand (args);
\r
1366 ProcessEvent (args.CommandName, args.CommandArgument as string);
\r
1369 return base.OnBubbleEvent (source, e);
\r
1372 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
\r
1374 RaisePostBackEvent (eventArgument);
\r
1377 // TODO: This is prolly obsolete
\r
1378 protected virtual void RaisePostBackEvent (string eventArgument)
\r
1380 int i = eventArgument.IndexOf ('$');
\r
1382 ProcessEvent (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));
\r
1384 ProcessEvent (eventArgument, null);
\r
1387 void ProcessEvent (string eventName, string param)
\r
1389 switch (eventName)
\r
1391 case DataControlCommands.PageCommandName:
\r
1392 int newIndex = -1;
\r
1394 case DataControlCommands.FirstPageCommandArgument:
\r
1397 case DataControlCommands.LastPageCommandArgument:
\r
1398 newIndex = PageCount - 1;
\r
1400 case DataControlCommands.NextPageCommandArgument:
\r
1401 newIndex = PageIndex + 1;
\r
1403 case DataControlCommands.PreviousPageCommandArgument:
\r
1404 newIndex = PageIndex - 1;
\r
1407 int paramIndex = 0;
\r
1408 int.TryParse (param, out paramIndex);
\r
1409 newIndex = paramIndex - 1;
\r
1412 ShowPage (newIndex);
\r
1415 case DataControlCommands.FirstPageCommandArgument:
\r
1419 case DataControlCommands.LastPageCommandArgument:
\r
1420 ShowPage (PageCount - 1);
\r
1423 case DataControlCommands.NextPageCommandArgument:
\r
1424 if (PageIndex < PageCount - 1)
\r
1425 ShowPage (PageIndex + 1);
\r
1428 case DataControlCommands.PreviousPageCommandArgument:
\r
1429 if (PageIndex > 0)
\r
1430 ShowPage (PageIndex - 1);
\r
1433 case DataControlCommands.EditCommandName:
\r
1434 ChangeMode (DetailsViewMode.Edit);
\r
1437 case DataControlCommands.NewCommandName:
\r
1438 ChangeMode (DetailsViewMode.Insert);
\r
1441 case DataControlCommands.UpdateCommandName:
\r
1442 UpdateItem (param, true);
\r
1445 case DataControlCommands.CancelCommandName:
\r
1449 case DataControlCommands.DeleteCommandName:
\r
1453 case DataControlCommands.InsertCommandName:
\r
1454 InsertItem (true);
\r
1459 void ShowPage (int newIndex)
\r
1461 DetailsViewPageEventArgs args = new DetailsViewPageEventArgs (newIndex);
\r
1462 OnPageIndexChanging (args);
\r
1463 if (!args.Cancel) {
\r
1464 if (args.NewPageIndex < 0 || args.NewPageIndex >= PageCount)
\r
1466 EndRowEdit (false);
\r
1467 PageIndex = args.NewPageIndex;
\r
1468 OnPageIndexChanged (EventArgs.Empty);
\r
1472 public void ChangeMode (DetailsViewMode newMode)
\r
1474 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (newMode, false);
\r
1475 OnModeChanging (args);
\r
1476 if (!args.Cancel) {
\r
1477 CurrentMode = args.NewMode;
\r
1478 OnModeChanged (EventArgs.Empty);
\r
1479 RequireBinding ();
\r
1483 void CancelEdit ()
\r
1485 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (DetailsViewMode.ReadOnly, true);
\r
1486 OnModeChanging (args);
\r
1487 if (!args.Cancel) {
\r
1492 public virtual void UpdateItem (bool causesValidation)
\r
1494 UpdateItem (null, causesValidation);
\r
1497 void UpdateItem (string param, bool causesValidation)
\r
1499 if (causesValidation && Page != null)
\r
1502 if (CurrentMode != DetailsViewMode.Edit) throw new HttpException ();
\r
1504 currentEditOldValues = OldEditValues.Values;
\r
1506 currentEditRowKeys = DataKey.Values;
\r
1507 currentEditNewValues = GetRowValues (false, false);
\r
1509 DetailsViewUpdateEventArgs args = new DetailsViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1510 OnItemUpdating (args);
\r
1511 if (!args.Cancel) {
\r
1512 DataSourceView view = GetData ();
\r
1514 throw new HttpException ("The DataSourceView associated to data bound control was null");
\r
1515 if (view.CanUpdate)
\r
1516 view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));
\r
1522 bool UpdateCallback (int recordsAffected, Exception exception)
\r
1524 DetailsViewUpdatedEventArgs dargs = new DetailsViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1525 OnItemUpdated (dargs);
\r
1527 if (!dargs.KeepInEditMode)
\r
1530 return dargs.ExceptionHandled;
\r
1533 public virtual void InsertItem (bool causesValidation)
\r
1535 InsertItem (null, causesValidation);
\r
1538 void InsertItem (string param, bool causesValidation)
\r
1540 if (causesValidation && Page != null)
\r
1543 if (CurrentMode != DetailsViewMode.Insert) throw new HttpException ();
\r
1545 currentEditNewValues = GetRowValues (false, true);
\r
1546 DetailsViewInsertEventArgs args = new DetailsViewInsertEventArgs (param, currentEditNewValues);
\r
1547 OnItemInserting (args);
\r
1548 if (!args.Cancel) {
\r
1549 DataSourceView view = GetData ();
\r
1551 throw new HttpException ("The DataSourceView associated to data bound control was null");
\r
1552 if (view.CanInsert)
\r
1553 view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));
\r
1559 bool InsertCallback (int recordsAffected, Exception exception)
\r
1561 DetailsViewInsertedEventArgs dargs = new DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
\r
1562 OnItemInserted (dargs);
\r
1564 if (!dargs.KeepInInsertMode)
\r
1567 return dargs.ExceptionHandled;
\r
1570 public virtual void DeleteItem ()
\r
1572 currentEditRowKeys = DataKey.Values;
\r
1573 currentEditNewValues = GetRowValues (true, true);
\r
1575 DetailsViewDeleteEventArgs args = new DetailsViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);
\r
1576 OnItemDeleting (args);
\r
1578 if (!args.Cancel) {
\r
1579 if (PageIndex == PageCount - 1)
\r
1581 RequireBinding ();
\r
1582 DataSourceView view = GetData ();
\r
1583 if (view != null && view.CanDelete)
\r
1584 view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));
\r
1586 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);
\r
1587 OnItemDeleted (dargs);
\r
1592 bool DeleteCallback (int recordsAffected, Exception exception)
\r
1594 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);
\r
1595 OnItemDeleted (dargs);
\r
1596 return dargs.ExceptionHandled;
\r
1599 void EndRowEdit ()
\r
1601 EndRowEdit (true);
\r
1604 void EndRowEdit (bool switchToDefaultMode) {
\r
1605 if (switchToDefaultMode)
\r
1606 ChangeMode (DefaultMode);
\r
1607 oldEditValues = new DataKey (new OrderedDictionary ());
\r
1608 currentEditRowKeys = null;
\r
1609 currentEditOldValues = null;
\r
1610 currentEditNewValues = null;
\r
1611 RequireBinding ();
\r
1614 protected internal override void LoadControlState (object ob)
\r
1616 if (ob == null) return;
\r
1617 object[] state = (object[]) ob;
\r
1618 base.LoadControlState (state[0]);
\r
1619 pageIndex = (int) state[1];
\r
1620 pageCount = (int) state[2];
\r
1621 CurrentMode = (DetailsViewMode) state[3];
\r
1622 dataKeyNames = (string[]) state[4];
\r
1623 defaultMode = (DetailsViewMode) state[5];
\r
1624 if (state [6] != null)
\r
1625 ((IStateManager) DataKey).LoadViewState (state [6]);
\r
1626 if (state [7] != null)
\r
1627 ((IStateManager) OldEditValues).LoadViewState (state [7]);
\r
1630 protected internal override object SaveControlState ()
\r
1632 object bstate = base.SaveControlState ();
\r
1633 return new object[] {
\r
1640 (key == null ? null : ((IStateManager)key).SaveViewState()),
\r
1641 (oldEditValues == null ? null : ((IStateManager) oldEditValues).SaveViewState ())
\r
1645 protected override void TrackViewState()
\r
1647 base.TrackViewState();
\r
1648 if (columns != null) ((IStateManager)columns).TrackViewState();
\r
1649 if (pagerSettings != null) ((IStateManager)pagerSettings).TrackViewState();
\r
1650 if (alternatingRowStyle != null) ((IStateManager)alternatingRowStyle).TrackViewState();
\r
1651 if (footerStyle != null) ((IStateManager)footerStyle).TrackViewState();
\r
1652 if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();
\r
1653 if (pagerStyle != null) ((IStateManager)pagerStyle).TrackViewState();
\r
1654 if (rowStyle != null) ((IStateManager)rowStyle).TrackViewState();
\r
1655 if (editRowStyle != null) ((IStateManager)editRowStyle).TrackViewState();
\r
1656 if (insertRowStyle != null) ((IStateManager)insertRowStyle).TrackViewState();
\r
1657 if (emptyDataRowStyle != null) ((IStateManager)emptyDataRowStyle).TrackViewState();
\r
1658 if (key != null) ((IStateManager)key).TrackViewState();
\r
1659 if (autoFieldProperties != null) {
\r
1660 foreach (IStateManager sm in autoFieldProperties)
\r
1661 sm.TrackViewState ();
\r
1665 protected override object SaveViewState()
\r
1667 object[] states = new object [12];
\r
1668 states[0] = base.SaveViewState();
\r
1669 states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());
\r
1670 states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());
\r
1671 states[3] = (alternatingRowStyle == null ? null : ((IStateManager)alternatingRowStyle).SaveViewState());
\r
1672 states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());
\r
1673 states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());
\r
1674 states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());
\r
1675 states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());
\r
1676 states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());
\r
1677 states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());
\r
1678 states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());
\r
1680 if (autoFieldProperties != null) {
\r
1681 object[] data = new object [autoFieldProperties.Length];
\r
1682 bool allNull = true;
\r
1683 for (int n=0; n<data.Length; n++) {
\r
1684 data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();
\r
1685 if (data [n] != null) allNull = false;
\r
1687 if (!allNull) states [11] = data;
\r
1690 for (int i = states.Length - 1; i >= 0; i--) {
\r
1691 if (states [i] != null)
\r
1698 protected override void LoadViewState (object savedState)
\r
1700 if (savedState == null) {
\r
1701 base.LoadViewState (null);
\r
1705 object [] states = (object []) savedState;
\r
1707 if (states[11] != null) {
\r
1708 object[] data = (object[]) states [11];
\r
1709 autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];
\r
1710 for (int n=0; n<data.Length; n++) {
\r
1711 IStateManager p = new AutoGeneratedFieldProperties ();
\r
1712 p.TrackViewState ();
\r
1713 p.LoadViewState (data [n]);
\r
1714 autoFieldProperties [n] = (AutoGeneratedFieldProperties) p;
\r
1718 base.LoadViewState (states[0]);
\r
1720 if (states[1] != null) ((IStateManager)Fields).LoadViewState (states[1]);
\r
1721 if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
\r
1722 if (states[3] != null) ((IStateManager)AlternatingRowStyle).LoadViewState (states[3]);
\r
1723 if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);
\r
1724 if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);
\r
1725 if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);
\r
1726 if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);
\r
1727 if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);
\r
1728 if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);
\r
1729 if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
\r
1732 void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)
\r
1734 RaiseCallbackEvent (eventArgs);
\r
1737 protected virtual void RaiseCallbackEvent (string eventArgs)
\r
1739 string[] clientData = eventArgs.Split ('|');
\r
1740 PageIndex = int.Parse (clientData[0]);
\r
1742 RaisePostBackEvent (clientData[1]);
\r
1746 string ICallbackEventHandler.GetCallbackResult ()
\r
1748 return GetCallbackResult ();
\r
1751 protected virtual string GetCallbackResult ()
\r
1753 PrepareControlHierarchy ();
\r
1755 StringWriter sw = new StringWriter ();
\r
1756 sw.Write (PageIndex.ToString () + '|');
\r
1758 HtmlTextWriter writer = new HtmlTextWriter (sw);
\r
1759 RenderGrid (writer);
\r
1760 return sw.ToString ();
\r
1763 protected virtual string GetCallbackScript (IButtonControl buttonControl, string argument)
\r
1765 if (EnablePagingCallbacks)
\r
1766 return "javascript:DetailsView_ClientEvent (\"" + ClientID + "\",\"" + buttonControl.CommandName + "$" + buttonControl.CommandArgument + "\"); return false;";
\r
1771 string ICallbackContainer.GetCallbackScript (IButtonControl control, string argument)
\r
1773 return GetCallbackScript (control, argument);
\r
1776 protected override void OnPagePreLoad (object sender, EventArgs e)
\r
1778 base.OnPagePreLoad (sender, e);
\r
1780 if (Page.IsPostBack && EnablePagingCallbacks) {
\r
1782 if (int.TryParse (Page.Request.Form [ClientID + "_Page"], out page))
\r
1787 protected internal override void OnPreRender (EventArgs e)
\r
1789 base.OnPreRender (e);
\r
1791 if (EnablePagingCallbacks)
\r
1793 if (!Page.ClientScript.IsClientScriptIncludeRegistered (typeof(DetailsView), "DetailsView.js")) {
\r
1794 string url = Page.ClientScript.GetWebResourceUrl (typeof(DetailsView), "DetailsView.js");
\r
1795 Page.ClientScript.RegisterClientScriptInclude (typeof(DetailsView), "DetailsView.js", url);
\r
1797 Page.ClientScript.RegisterHiddenField (ClientID + "_Page", PageIndex.ToString ());
\r
1799 string cgrid = ClientID + "_data";
\r
1800 string script = string.Format ("var {0} = new Object ();\n", cgrid);
\r
1801 script += string.Format ("{0}.pageIndex = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (PageIndex));
\r
1802 script += string.Format ("{0}.uid = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (UniqueID));
\r
1803 Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
\r
1805 // Make sure the basic script infrastructure is rendered
\r
1806 Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");
\r
1807 Page.ClientScript.GetPostBackClientHyperlink (this, "");
\r
1811 protected internal override void Render (HtmlTextWriter writer)
\r
1813 PrepareControlHierarchy ();
\r
1815 if (EnablePagingCallbacks)
\r
1816 base.RenderBeginTag (writer);
\r
1818 writer.RenderBeginTag (HtmlTextWriterTag.Div);
\r
1820 RenderGrid (writer);
\r
1822 if (EnablePagingCallbacks)
\r
1823 base.RenderEndTag (writer);
\r
1825 writer.RenderEndTag ();
\r
1828 void RenderGrid (HtmlTextWriter writer)
\r
1830 if (table == null)
\r
1833 table.Render (writer);
\r
1836 PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)
\r
1838 if (control == null)
\r
1839 throw new ArgumentNullException ("control");
\r
1841 if (control.CausesValidation)
\r
1842 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
1844 PostBackOptions options = new PostBackOptions (this);
\r
1845 options.Argument = control.CommandName + "$" + control.CommandArgument;
\r
1846 options.RequiresJavaScriptProtocol = true;
\r