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
73 CommandField commandField;
\r
74 DetailsViewRow commandRow;
\r
77 DataControlFieldCollection columns;
\r
78 PagerSettings pagerSettings;
\r
80 TableItemStyle alternatingRowStyle;
\r
81 TableItemStyle editRowStyle;
\r
82 TableItemStyle insertRowStyle;
\r
83 TableItemStyle emptyDataRowStyle;
\r
84 TableItemStyle footerStyle;
\r
85 TableItemStyle headerStyle;
\r
86 TableItemStyle pagerStyle;
\r
87 TableItemStyle rowStyle;
\r
88 TableItemStyle commandRowStyle;
\r
89 TableItemStyle fieldHeaderStyle;
\r
92 DataKey oldEditValues;
\r
93 AutoGeneratedFieldProperties[] autoFieldProperties;
\r
95 private static readonly object PageIndexChangedEvent = new object();
\r
96 private static readonly object PageIndexChangingEvent = new object();
\r
97 private static readonly object ItemCommandEvent = new object();
\r
98 private static readonly object ItemCreatedEvent = new object();
\r
99 private static readonly object ItemDeletedEvent = new object();
\r
100 private static readonly object ItemDeletingEvent = new object();
\r
101 private static readonly object ItemInsertedEvent = new object();
\r
102 private static readonly object ItemInsertingEvent = new object();
\r
103 private static readonly object ModeChangingEvent = new object();
\r
104 private static readonly object ModeChangedEvent = new object();
\r
105 private static readonly object ItemUpdatedEvent = new object();
\r
106 private static readonly object ItemUpdatingEvent = new object();
\r
110 DetailsViewMode currentMode = DetailsViewMode.ReadOnly;
\r
113 public DetailsView ()
\r
115 rows = new DetailsViewRowCollection (new ArrayList ());
\r
116 key = new DataKey (new OrderedDictionary ());
\r
119 public event EventHandler PageIndexChanged {
\r
120 add { Events.AddHandler (PageIndexChangedEvent, value); }
\r
121 remove { Events.RemoveHandler (PageIndexChangedEvent, value); }
\r
124 public event DetailsViewPageEventHandler PageIndexChanging {
\r
125 add { Events.AddHandler (PageIndexChangingEvent, value); }
\r
126 remove { Events.RemoveHandler (PageIndexChangingEvent, value); }
\r
129 public event DetailsViewCommandEventHandler ItemCommand {
\r
130 add { Events.AddHandler (ItemCommandEvent, value); }
\r
131 remove { Events.RemoveHandler (ItemCommandEvent, value); }
\r
134 public event EventHandler ItemCreated {
\r
135 add { Events.AddHandler (ItemCreatedEvent, value); }
\r
136 remove { Events.RemoveHandler (ItemCreatedEvent, value); }
\r
139 public event DetailsViewDeletedEventHandler ItemDeleted {
\r
140 add { Events.AddHandler (ItemDeletedEvent, value); }
\r
141 remove { Events.RemoveHandler (ItemDeletedEvent, value); }
\r
144 public event DetailsViewDeleteEventHandler ItemDeleting {
\r
145 add { Events.AddHandler (ItemDeletingEvent, value); }
\r
146 remove { Events.RemoveHandler (ItemDeletingEvent, value); }
\r
149 public event DetailsViewInsertedEventHandler ItemInserted {
\r
150 add { Events.AddHandler (ItemInsertedEvent, value); }
\r
151 remove { Events.RemoveHandler (ItemInsertedEvent, value); }
\r
154 public event DetailsViewInsertEventHandler ItemInserting {
\r
155 add { Events.AddHandler (ItemInsertingEvent, value); }
\r
156 remove { Events.RemoveHandler (ItemInsertingEvent, value); }
\r
159 public event DetailsViewModeEventHandler ModeChanging {
\r
160 add { Events.AddHandler (ModeChangingEvent, value); }
\r
161 remove { Events.RemoveHandler (ModeChangingEvent, value); }
\r
164 public event EventHandler ModeChanged {
\r
165 add { Events.AddHandler (ModeChangedEvent, value); }
\r
166 remove { Events.RemoveHandler (ModeChangedEvent, value); }
\r
169 public event DetailsViewUpdatedEventHandler ItemUpdated {
\r
170 add { Events.AddHandler (ItemUpdatedEvent, value); }
\r
171 remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
\r
174 public event DetailsViewUpdateEventHandler ItemUpdating {
\r
175 add { Events.AddHandler (ItemUpdatingEvent, value); }
\r
176 remove { Events.RemoveHandler (ItemUpdatingEvent, value); }
\r
179 protected virtual void OnPageIndexChanged (EventArgs e)
\r
181 if (Events != null) {
\r
182 EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];
\r
183 if (eh != null) eh (this, e);
\r
187 protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)
\r
189 if (Events != null) {
\r
190 DetailsViewPageEventHandler eh = (DetailsViewPageEventHandler) Events [PageIndexChangingEvent];
\r
191 if (eh != null) eh (this, e);
\r
195 protected virtual void OnItemCommand (DetailsViewCommandEventArgs e)
\r
197 if (Events != null) {
\r
198 DetailsViewCommandEventHandler eh = (DetailsViewCommandEventHandler) Events [ItemCommandEvent];
\r
199 if (eh != null) eh (this, e);
\r
203 protected virtual void OnItemCreated (EventArgs e)
\r
205 if (Events != null) {
\r
206 EventHandler eh = (EventHandler) Events [ItemCreatedEvent];
\r
207 if (eh != null) eh (this, e);
\r
211 protected virtual void OnItemDeleted (DetailsViewDeletedEventArgs e)
\r
213 if (Events != null) {
\r
214 DetailsViewDeletedEventHandler eh = (DetailsViewDeletedEventHandler) Events [ItemDeletedEvent];
\r
215 if (eh != null) eh (this, e);
\r
219 protected virtual void OnItemInserted (DetailsViewInsertedEventArgs e)
\r
221 if (Events != null) {
\r
222 DetailsViewInsertedEventHandler eh = (DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
\r
223 if (eh != null) eh (this, e);
\r
227 protected virtual void OnItemInserting (DetailsViewInsertEventArgs e)
\r
229 if (Events != null) {
\r
230 DetailsViewInsertEventHandler eh = (DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
\r
231 if (eh != null) eh (this, e);
\r
235 protected virtual void OnItemDeleting (DetailsViewDeleteEventArgs e)
\r
237 if (Events != null) {
\r
238 DetailsViewDeleteEventHandler eh = (DetailsViewDeleteEventHandler) Events [ItemDeletingEvent];
\r
239 if (eh != null) eh (this, e);
\r
243 protected virtual void OnModeChanged (EventArgs e)
\r
245 if (Events != null) {
\r
246 EventHandler eh = (EventHandler) Events [ModeChangedEvent];
\r
247 if (eh != null) eh (this, e);
\r
251 protected virtual void OnModeChanging (DetailsViewModeEventArgs e)
\r
253 if (Events != null) {
\r
254 DetailsViewModeEventHandler eh = (DetailsViewModeEventHandler) Events [ModeChangingEvent];
\r
255 if (eh != null) eh (this, e);
\r
259 protected virtual void OnItemUpdated (DetailsViewUpdatedEventArgs e)
\r
261 if (Events != null) {
\r
262 DetailsViewUpdatedEventHandler eh = (DetailsViewUpdatedEventHandler) Events [ItemUpdatedEvent];
\r
263 if (eh != null) eh (this, e);
\r
267 protected virtual void OnItemUpdating (DetailsViewUpdateEventArgs e)
\r
269 if (Events != null) {
\r
270 DetailsViewUpdateEventHandler eh = (DetailsViewUpdateEventHandler) Events [ItemUpdatingEvent];
\r
271 if (eh != null) eh (this, e);
\r
276 [WebCategoryAttribute ("Paging")]
\r
277 [DefaultValueAttribute (false)]
\r
278 public virtual bool AllowPaging {
\r
280 object ob = ViewState ["AllowPaging"];
\r
281 if (ob != null) return (bool) ob;
\r
285 ViewState ["AllowPaging"] = value;
\r
290 [DefaultValueAttribute (null)]
\r
291 [WebCategoryAttribute ("Styles")]
\r
292 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
293 [NotifyParentProperty (true)]
\r
294 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
295 public TableItemStyle AlternatingRowStyle {
\r
297 if (alternatingRowStyle == null) {
\r
298 alternatingRowStyle = new TableItemStyle ();
\r
299 if (IsTrackingViewState)
\r
300 alternatingRowStyle.TrackViewState();
\r
302 return alternatingRowStyle;
\r
306 [WebCategoryAttribute ("Behavior")]
\r
307 [DefaultValueAttribute (false)]
\r
308 public virtual bool AutoGenerateEditButton {
\r
310 object ob = ViewState ["AutoGenerateEditButton"];
\r
311 if (ob != null) return (bool) ob;
\r
315 ViewState ["AutoGenerateEditButton"] = value;
\r
320 [WebCategoryAttribute ("Behavior")]
\r
321 [DefaultValueAttribute (false)]
\r
322 public virtual bool AutoGenerateDeleteButton {
\r
324 object ob = ViewState ["AutoGenerateDeleteButton"];
\r
325 if (ob != null) return (bool) ob;
\r
329 ViewState ["AutoGenerateDeleteButton"] = value;
\r
334 [WebCategoryAttribute ("Behavior")]
\r
335 [DefaultValueAttribute (false)]
\r
336 public virtual bool AutoGenerateInsertButton {
\r
338 object ob = ViewState ["AutoGenerateInsertButton"];
\r
339 if (ob != null) return (bool) ob;
\r
343 ViewState ["AutoGenerateInsertButton"] = value;
\r
348 [WebCategoryAttribute ("Behavior")]
\r
349 [DefaultValueAttribute (true)]
\r
350 public virtual bool AutoGenerateRows {
\r
352 object ob = ViewState ["AutoGenerateRows"];
\r
353 if (ob != null) return (bool) ob;
\r
357 ViewState ["AutoGenerateRows"] = value;
\r
362 [UrlPropertyAttribute]
\r
363 [WebCategoryAttribute ("Appearance")]
\r
364 [DefaultValueAttribute ("")]
\r
365 [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
366 public virtual string BackImageUrl {
\r
368 object ob = ViewState ["BackImageUrl"];
\r
369 if (ob != null) return (string) ob;
\r
370 return string.Empty;
\r
373 ViewState ["BackImageUrl"] = value;
\r
378 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
379 [BrowsableAttribute (false)]
\r
380 public virtual DetailsViewRow BottomPagerRow {
\r
382 EnsureDataBound ();
\r
383 return bottomPagerRow;
\r
387 [WebCategoryAttribute ("Accessibility")]
\r
388 [DefaultValueAttribute ("")]
\r
389 [LocalizableAttribute (true)]
\r
390 public virtual string Caption {
\r
392 object ob = ViewState ["Caption"];
\r
393 if (ob != null) return (string) ob;
\r
394 return string.Empty;
\r
397 ViewState ["Caption"] = value;
\r
402 [WebCategoryAttribute ("Accessibility")]
\r
403 [DefaultValueAttribute (TableCaptionAlign.NotSet)]
\r
404 public virtual TableCaptionAlign CaptionAlign
\r
407 object o = ViewState ["CaptionAlign"];
\r
408 if(o != null) return (TableCaptionAlign) o;
\r
409 return TableCaptionAlign.NotSet;
\r
412 ViewState ["CaptionAlign"] = value;
\r
417 [WebCategoryAttribute ("Layout")]
\r
418 [DefaultValueAttribute (-1)]
\r
419 public virtual int CellPadding
\r
422 object o = ViewState ["CellPadding"];
\r
423 if (o != null) return (int) o;
\r
428 throw new ArgumentOutOfRangeException ("< -1");
\r
429 ViewState["CellPadding"] = value;
\r
434 [WebCategoryAttribute ("Layout")]
\r
435 [DefaultValueAttribute (0)]
\r
436 public virtual int CellSpacing
\r
439 object o = ViewState ["CellSpacing"];
\r
440 if (o != null) return (int) o;
\r
445 throw new ArgumentOutOfRangeException ("< -1");
\r
446 ViewState ["CellSpacing"] = value;
\r
451 [DefaultValueAttribute (null)]
\r
452 [WebCategoryAttribute ("Styles")]
\r
453 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
454 [NotifyParentProperty (true)]
\r
455 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
456 public TableItemStyle CommandRowStyle {
\r
458 if (commandRowStyle == null) {
\r
459 commandRowStyle = new TableItemStyle ();
\r
460 if (IsTrackingViewState)
\r
461 commandRowStyle.TrackViewState();
\r
463 return commandRowStyle;
\r
467 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
468 [BrowsableAttribute (false)]
\r
469 public DetailsViewMode CurrentMode {
\r
471 return currentMode;
\r
475 DetailsViewMode defaultMode = DetailsViewMode.ReadOnly;
\r
476 [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
\r
477 [WebCategoryAttribute ("Behavior")]
\r
478 public virtual DetailsViewMode DefaultMode {
\r
480 return defaultMode;
\r
483 defaultMode = value;
\r
488 [EditorAttribute ("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
489 [MergablePropertyAttribute (false)]
\r
490 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
491 [DefaultValueAttribute (null)]
\r
492 [WebCategoryAttribute ("Misc")]
\r
493 public virtual DataControlFieldCollection Fields {
\r
495 if (columns == null) {
\r
496 columns = new DataControlFieldCollection ();
\r
497 columns.FieldsChanged += new EventHandler (OnFieldsChanged);
\r
498 if (IsTrackingViewState)
\r
499 ((IStateManager)columns).TrackViewState ();
\r
505 string[] dataKeyNames = null;
\r
507 [DefaultValueAttribute (null)]
\r
508 [WebCategoryAttribute ("Data")]
\r
509 [TypeConverter (typeof(StringArrayConverter))]
\r
510 [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
\r
511 public virtual string[] DataKeyNames
\r
514 if (dataKeyNames == null)
\r
517 return dataKeyNames;
\r
520 dataKeyNames = value;
\r
525 [BrowsableAttribute (false)]
\r
526 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
527 public virtual DataKey DataKey {
\r
529 EnsureDataBound ();
\r
534 [WebCategoryAttribute ("Styles")]
\r
535 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
536 [NotifyParentProperty (true)]
\r
537 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
538 [DefaultValueAttribute (null)]
\r
539 public TableItemStyle EditRowStyle {
\r
541 if (editRowStyle == null) {
\r
542 editRowStyle = new TableItemStyle ();
\r
543 if (IsTrackingViewState)
\r
544 editRowStyle.TrackViewState();
\r
546 return editRowStyle;
\r
550 [WebCategoryAttribute ("Styles")]
\r
551 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
552 [NotifyParentProperty (true)]
\r
553 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
554 [DefaultValueAttribute (null)]
\r
555 public TableItemStyle EmptyDataRowStyle {
\r
557 if (emptyDataRowStyle == null) {
\r
558 emptyDataRowStyle = new TableItemStyle ();
\r
559 if (IsTrackingViewState)
\r
560 emptyDataRowStyle.TrackViewState();
\r
562 return emptyDataRowStyle;
\r
566 [DefaultValue (null)]
\r
567 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
568 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
569 [Browsable (false)]
\r
570 public virtual ITemplate EmptyDataTemplate {
\r
571 get { return emptyDataTemplate; }
\r
572 set { emptyDataTemplate = value; RequireBinding (); }
\r
575 [LocalizableAttribute (true)]
\r
576 [WebCategoryAttribute ("Appearance")]
\r
577 [DefaultValueAttribute ("")]
\r
578 public virtual string EmptyDataText {
\r
580 object ob = ViewState ["EmptyDataText"];
\r
581 if (ob != null) return (string) ob;
\r
582 return string.Empty;
\r
585 ViewState ["EmptyDataText"] = value;
\r
590 [WebCategoryAttribute ("Behavior")]
\r
591 [DefaultValueAttribute (false)]
\r
592 public virtual bool EnablePagingCallbacks {
\r
594 object ob = ViewState ["EnablePagingCallbacks"];
\r
595 if (ob != null) return (bool) ob;
\r
599 ViewState ["EnablePagingCallbacks"] = value;
\r
604 [WebCategoryAttribute ("Styles")]
\r
605 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
606 [NotifyParentProperty (true)]
\r
607 [DefaultValue (null)]
\r
608 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
609 public TableItemStyle FieldHeaderStyle {
\r
611 if (fieldHeaderStyle == null) {
\r
612 fieldHeaderStyle = new TableItemStyle ();
\r
613 if (IsTrackingViewState)
\r
614 fieldHeaderStyle.TrackViewState();
\r
616 return fieldHeaderStyle;
\r
620 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
621 [BrowsableAttribute (false)]
\r
622 public virtual DetailsViewRow FooterRow {
\r
624 EnsureChildControls ();
\r
629 [DefaultValue (null)]
\r
630 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
631 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
632 [Browsable (false)]
\r
633 public virtual ITemplate FooterTemplate {
\r
634 get { return footerTemplate; }
\r
635 set { footerTemplate = value; RequireBinding (); }
\r
638 [LocalizableAttribute (true)]
\r
639 [WebCategoryAttribute ("Appearance")]
\r
640 [DefaultValueAttribute ("")]
\r
641 public virtual string FooterText {
\r
643 object ob = ViewState ["FooterText"];
\r
644 if (ob != null) return (string) ob;
\r
645 return string.Empty;
\r
648 ViewState ["FooterText"] = value;
\r
653 [WebCategoryAttribute ("Styles")]
\r
654 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
655 [NotifyParentProperty (true)]
\r
656 [DefaultValue (null)]
\r
657 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
658 public TableItemStyle FooterStyle {
\r
660 if (footerStyle == null) {
\r
661 footerStyle = new TableItemStyle ();
\r
662 if (IsTrackingViewState)
\r
663 footerStyle.TrackViewState();
\r
665 return footerStyle;
\r
669 [WebCategoryAttribute ("Appearance")]
\r
670 [DefaultValueAttribute (GridLines.Both)]
\r
671 public virtual GridLines GridLines {
\r
673 return ((TableStyle)ControlStyle).GridLines;
\r
676 ((TableStyle)ControlStyle).GridLines = value;
\r
680 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
681 [BrowsableAttribute (false)]
\r
682 public virtual DetailsViewRow HeaderRow {
\r
684 EnsureChildControls ();
\r
689 [WebCategoryAttribute ("Styles")]
\r
690 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
691 [NotifyParentProperty (true)]
\r
692 [DefaultValue (null)]
\r
693 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
694 public TableItemStyle HeaderStyle {
\r
696 if (headerStyle == null) {
\r
697 headerStyle = new TableItemStyle ();
\r
698 if (IsTrackingViewState)
\r
699 headerStyle.TrackViewState();
\r
701 return headerStyle;
\r
705 [DefaultValue (null)]
\r
706 [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
\r
707 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
708 [Browsable (false)]
\r
709 public virtual ITemplate HeaderTemplate {
\r
710 get { return headerTemplate; }
\r
711 set { headerTemplate = value; RequireBinding (); }
\r
714 [LocalizableAttribute (true)]
\r
715 [WebCategoryAttribute ("Appearance")]
\r
716 [DefaultValueAttribute ("")]
\r
717 public virtual string HeaderText {
\r
719 object ob = ViewState ["HeaderText"];
\r
720 if (ob != null) return (string) ob;
\r
721 return string.Empty;
\r
724 ViewState ["HeaderText"] = value;
\r
729 [Category ("Layout")]
\r
730 [DefaultValueAttribute (HorizontalAlign.NotSet)]
\r
731 public virtual HorizontalAlign HorizontalAlign {
\r
733 object ob = ViewState ["HorizontalAlign"];
\r
734 if (ob != null) return (HorizontalAlign) ob;
\r
735 return HorizontalAlign.NotSet;
\r
738 ViewState ["HorizontalAlign"] = value;
\r
743 [WebCategoryAttribute ("Styles")]
\r
744 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
745 [NotifyParentProperty (true)]
\r
746 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
747 [DefaultValueAttribute (null)]
\r
748 public TableItemStyle InsertRowStyle {
\r
750 if (insertRowStyle == null) {
\r
751 insertRowStyle = new TableItemStyle ();
\r
752 if (IsTrackingViewState)
\r
753 insertRowStyle.TrackViewState();
\r
755 return insertRowStyle;
\r
759 [BrowsableAttribute (false)]
\r
760 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
761 public virtual int PageCount {
\r
763 if (pageCount != 0) return pageCount;
\r
764 EnsureDataBound ();
\r
769 [WebCategoryAttribute ("Paging")]
\r
770 [BindableAttribute (true, BindingDirection.OneWay)]
\r
771 [DefaultValueAttribute (0)]
\r
772 public virtual int PageIndex {
\r
782 [WebCategoryAttribute ("Paging")]
\r
783 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
\r
784 [NotifyParentPropertyAttribute (true)]
\r
785 [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
\r
786 public virtual PagerSettings PagerSettings {
\r
788 if (pagerSettings == null) {
\r
789 pagerSettings = new PagerSettings (this);
\r
790 if (IsTrackingViewState)
\r
791 ((IStateManager)pagerSettings).TrackViewState ();
\r
793 return pagerSettings;
\r
797 [WebCategoryAttribute ("Styles")]
\r
798 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
799 [NotifyParentProperty (true)]
\r
800 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
801 public TableItemStyle PagerStyle {
\r
803 if (pagerStyle == null) {
\r
804 pagerStyle = new TableItemStyle ();
\r
805 if (IsTrackingViewState)
\r
806 pagerStyle.TrackViewState();
\r
813 [DefaultValue (null)]
\r
814 /* DataControlPagerCell isnt specified in the docs */
\r
815 //[TemplateContainer (typeof(DataControlPagerCell), BindingDirection.OneWay)]
\r
816 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
817 [Browsable (false)]
\r
818 public virtual ITemplate PagerTemplate {
\r
819 get { return pagerTemplate; }
\r
820 set { pagerTemplate = value; RequireBinding (); }
\r
823 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
824 [BrowsableAttribute (false)]
\r
825 public virtual DetailsViewRowCollection Rows {
\r
827 EnsureChildControls ();
\r
832 [WebCategoryAttribute ("Styles")]
\r
833 [PersistenceMode (PersistenceMode.InnerProperty)]
\r
834 [NotifyParentProperty (true)]
\r
835 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
\r
836 [DefaultValue (null)]
\r
837 public TableItemStyle RowStyle {
\r
839 if (rowStyle == null) {
\r
840 rowStyle = new TableItemStyle ();
\r
841 if (IsTrackingViewState)
\r
842 rowStyle.TrackViewState();
\r
848 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
849 [BrowsableAttribute (false)]
\r
850 public object SelectedValue {
\r
851 get { return DataKey.Value; }
\r
854 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
855 [BrowsableAttribute (false)]
\r
856 public virtual DetailsViewRow TopPagerRow {
\r
858 EnsureDataBound ();
\r
859 return topPagerRow;
\r
863 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
864 [BrowsableAttribute (false)]
\r
865 public virtual object DataItem {
\r
867 EnsureDataBound ();
\r
872 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
873 [BrowsableAttribute (false)]
\r
874 public int DataItemCount {
\r
875 get { return PageCount; }
\r
878 [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
\r
879 [BrowsableAttribute (false)]
\r
880 public virtual int DataItemIndex {
\r
881 get { return PageIndex; }
\r
884 int IDataItemContainer.DisplayIndex {
\r
885 get { return PageIndex; }
\r
888 public virtual bool IsBindableType (Type type)
\r
890 return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);
\r
893 protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
\r
895 return base.CreateDataSourceSelectArguments ();
\r
898 protected virtual ICollection CreateFieldSet (object dataItem, bool useDataSource)
\r
900 ArrayList fields = new ArrayList ();
\r
902 if (AutoGenerateRows) {
\r
903 if (useDataSource) {
\r
904 if (dataItem != null)
\r
905 fields.AddRange (CreateAutoGeneratedRows (dataItem));
\r
907 if (autoFieldProperties != null) {
\r
908 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
909 fields.Add (CreateAutoGeneratedRow (props));
\r
914 fields.AddRange (Fields);
\r
916 if (AutoGenerateEditButton || AutoGenerateDeleteButton || AutoGenerateInsertButton) {
\r
917 CommandField field = new CommandField ();
\r
918 field.ShowEditButton = AutoGenerateEditButton;
\r
919 field.ShowDeleteButton = AutoGenerateDeleteButton;
\r
920 field.ShowInsertButton = AutoGenerateInsertButton;
\r
921 fields.Add (field);
\r
922 commandField = field;
\r
928 protected virtual ICollection CreateAutoGeneratedRows (object dataItem)
\r
930 ArrayList list = new ArrayList ();
\r
931 autoFieldProperties = CreateAutoFieldProperties (dataItem);
\r
932 foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
\r
933 list.Add (CreateAutoGeneratedRow (props));
\r
937 protected virtual AutoGeneratedField CreateAutoGeneratedRow (AutoGeneratedFieldProperties fieldProperties)
\r
939 return new AutoGeneratedField (fieldProperties);
\r
942 AutoGeneratedFieldProperties[] CreateAutoFieldProperties (object dataItem)
\r
944 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
\r
946 ArrayList retVal = new ArrayList();
\r
947 if (props != null && props.Count > 0)
\r
949 foreach (PropertyDescriptor current in props) {
\r
950 if (IsBindableType (current.PropertyType)) {
\r
951 AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
\r
952 ((IStateManager)field).TrackViewState();
\r
953 field.Name = current.Name;
\r
954 field.DataField = current.Name;
\r
955 field.IsReadOnly = current.IsReadOnly;
\r
956 field.Type = current.PropertyType;
\r
957 retVal.Add (field);
\r
962 if (retVal.Count > 0)
\r
963 return (AutoGeneratedFieldProperties[]) retVal.ToArray (typeof(AutoGeneratedFieldProperties));
\r
965 return new AutoGeneratedFieldProperties [0];
\r
968 protected virtual DetailsViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
\r
970 DetailsViewRow row;
\r
971 if (rowType == DataControlRowType.Pager)
\r
972 row = new DetailsViewPagerRow (rowIndex, rowType, rowState);
\r
974 row = new DetailsViewRow (rowIndex, rowType, rowState);
\r
975 OnItemCreated (EventArgs.Empty);
\r
979 void RequireBinding ()
\r
982 RequiresDataBinding = true;
\r
987 protected virtual Table CreateTable ()
\r
989 Table table = new Table ();
\r
990 table.Caption = Caption;
\r
991 table.CaptionAlign = CaptionAlign;
\r
992 table.CellPadding = CellPadding;
\r
993 //CellSpacing defaults to 0 and Table.CellSpacing to -1
\r
994 if (CellSpacing != 0)
\r
995 table.CellSpacing = CellSpacing;
\r
996 table.HorizontalAlign = HorizontalAlign;
\r
997 table.BackImageUrl = BackImageUrl;
\r
1001 protected override Style CreateControlStyle ()
\r
1003 TableStyle style = new TableStyle (ViewState);
\r
1004 style.GridLines = GridLines.Both;
\r
1005 style.CellSpacing = 0;
\r
1009 protected override int CreateChildControls (IEnumerable data, bool dataBinding)
\r
1011 PagedDataSource dataSource;
\r
1013 if (dataBinding) {
\r
1014 DataSourceView view = GetData ();
\r
1015 dataSource = new PagedDataSource ();
\r
1016 dataSource.DataSource = data;
\r
1018 if (AllowPaging) {
\r
1019 dataSource.AllowPaging = true;
\r
1020 dataSource.PageSize = 1;
\r
1021 dataSource.CurrentPageIndex = PageIndex;
\r
1022 if (view.CanPage) {
\r
1023 dataSource.AllowServerPaging = true;
\r
1024 if (view.CanRetrieveTotalRowCount)
\r
1025 dataSource.VirtualCount = SelectArguments.TotalRowCount;
\r
1029 pageCount = dataSource.DataSourceCount;
\r
1033 dataSource = new PagedDataSource ();
\r
1034 dataSource.DataSource = data;
\r
1035 if (AllowPaging) {
\r
1036 dataSource.AllowPaging = true;
\r
1037 dataSource.PageSize = 1;
\r
1038 dataSource.CurrentPageIndex = PageIndex;
\r
1042 bool showPager = AllowPaging && (PageCount > 1);
\r
1044 Controls.Clear ();
\r
1045 table = CreateTable ();
\r
1046 Controls.Add (table);
\r
1048 ArrayList list = new ArrayList ();
\r
1050 if (Page == null || !Page.IsPostBack)
\r
1051 currentMode = DefaultMode;
\r
1054 // Gets the current data item
\r
1056 IEnumerator e = dataSource.GetEnumerator ();
\r
1057 if (e.MoveNext ())
\r
1058 dataItem = e.Current;
\r
1062 // Creates the set of fields to show
\r
1064 ICollection fieldCollection = CreateFieldSet (dataItem, dataBinding);
\r
1065 DataControlField[] fields = new DataControlField [fieldCollection.Count];
\r
1066 fieldCollection.CopyTo (fields, 0);
\r
1068 foreach (DataControlField field in fields) {
\r
1069 field.Initialize (false, this);
\r
1070 if (EnablePagingCallbacks)
\r
1071 field.ValidateSupportsCallback ();
\r
1074 // Main table creation
\r
1076 headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
\r
1077 DataControlFieldCell headerCell = new DataControlFieldCell (null);
\r
1078 headerCell.ColumnSpan = 2;
\r
1079 if (headerTemplate != null)
\r
1080 headerTemplate.InstantiateIn (headerCell);
\r
1082 headerCell.Text = HeaderText;
\r
1083 headerRow.Cells.Add (headerCell);
\r
1084 table.Rows.Add (headerRow);
\r
1086 if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1087 topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1088 InitializePager (topPagerRow, dataSource);
\r
1089 table.Rows.Add (topPagerRow);
\r
1092 if (dataSource.Count > 0) {
\r
1093 foreach (DataControlField field in fields) {
\r
1094 DataControlRowState rstate = GetRowState (list.Count);
\r
1095 DetailsViewRow row = CreateRow (list.Count, DataControlRowType.DataRow, rstate);
\r
1096 InitializeRow (row, field);
\r
1097 table.Rows.Add (row);
\r
1100 if (commandField == field)
\r
1103 if (!dataBinding) {
\r
1104 if (CurrentMode == DetailsViewMode.Edit)
\r
1105 oldEditValues = new DataKey (new OrderedDictionary ());
\r
1106 key = new DataKey (new OrderedDictionary (), DataKeyNames);
\r
1109 table.Rows.Add (CreateEmptyrRow ());
\r
1112 rows = new DetailsViewRowCollection (list);
\r
1114 if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {
\r
1115 bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
\r
1116 InitializePager (bottomPagerRow, dataSource);
\r
1117 table.Rows.Add (bottomPagerRow);
\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
1133 return dataSource.DataSourceCount;
\r
1137 protected override void EnsureDataBound ()
\r
1139 base.EnsureDataBound ();
\r
1142 DataControlRowState GetRowState (int index)
\r
1144 DataControlRowState rstate = (index % 2) == 0 ? DataControlRowState.Normal : DataControlRowState.Alternate;
\r
1145 if (CurrentMode == DetailsViewMode.Edit) rstate |= DataControlRowState.Edit;
\r
1146 else if (CurrentMode == DetailsViewMode.Insert) rstate |= DataControlRowState.Insert;
\r
1150 protected virtual void InitializePager (DetailsViewRow row, PagedDataSource dataSource)
\r
1152 TableCell cell = new TableCell ();
\r
1153 cell.ColumnSpan = 2;
\r
1155 if (pagerTemplate != null)
\r
1156 pagerTemplate.InstantiateIn (cell);
\r
1158 cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));
\r
1160 row.Cells.Add (cell);
\r
1163 DetailsViewRow CreateEmptyrRow ()
\r
1165 DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
\r
1166 TableCell cell = new TableCell ();
\r
1167 cell.ColumnSpan = 2;
\r
1169 if (emptyDataTemplate != null)
\r
1170 emptyDataTemplate.InstantiateIn (cell);
\r
1172 cell.Text = EmptyDataText;
\r
1174 row.Cells.Add (cell);
\r
1178 protected virtual void InitializeRow (DetailsViewRow row, DataControlField field)
\r
1180 DataControlFieldCell cell;
\r
1182 if (field.ShowHeader) {
\r
1183 cell = new DataControlFieldCell (field);
\r
1184 row.Cells.Add (cell);
\r
1185 field.InitializeCell (cell, DataControlCellType.Header, row.RowState, row.RowIndex);
\r
1188 cell = new DataControlFieldCell (field);
\r
1189 if (!field.ShowHeader)
\r
1190 cell.ColumnSpan = 2;
\r
1191 row.Cells.Add (cell);
\r
1192 field.InitializeCell (cell, DataControlCellType.DataCell, row.RowState, row.RowIndex);
\r
1195 IOrderedDictionary CreateRowDataKey (object dataItem)
\r
1197 if (cachedKeyProperties == null) {
\r
1198 PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
\r
1199 cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];
\r
1200 for (int n=0; n<DataKeyNames.Length; n++) {
\r
1201 PropertyDescriptor p = props [DataKeyNames[n]];
\r
1203 new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());
\r
1204 cachedKeyProperties [n] = p;
\r
1208 OrderedDictionary dic = new OrderedDictionary ();
\r
1209 foreach (PropertyDescriptor p in cachedKeyProperties)
\r
1210 dic [p.Name] = p.GetValue (dataItem);
\r
1214 IOrderedDictionary GetRowValues (bool includeReadOnlyFields, bool includePrimaryKey)
\r
1216 OrderedDictionary dic = new OrderedDictionary ();
\r
1217 ExtractRowValues (dic, includeReadOnlyFields, includePrimaryKey);
\r
1221 protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeReadOnlyFields, bool includePrimaryKey)
\r
1223 foreach (DetailsViewRow row in Rows) {
\r
1224 if (row.Cells.Count < 1) continue;
\r
1225 DataControlFieldCell c = row.Cells[row.Cells.Count-1] as DataControlFieldCell;
\r
1227 c.ContainingField.ExtractValuesFromCell (fieldValues, c, row.RowState, includeReadOnlyFields);
\r
1229 if (!includePrimaryKey && DataKeyNames != null)
\r
1230 foreach (string key in DataKeyNames)
\r
1231 fieldValues.Remove (key);
\r
1234 protected override HtmlTextWriterTag TagKey {
\r
1236 if (EnablePagingCallbacks)
\r
1237 return HtmlTextWriterTag.Div;
\r
1239 return HtmlTextWriterTag.Table;
\r
1243 public sealed override void DataBind ()
\r
1245 DataSourceView view = GetData ();
\r
1246 if (AllowPaging && view.CanPage) {
\r
1247 SelectArguments.StartRowIndex = PageIndex;
\r
1248 SelectArguments.MaximumRows = 1;
\r
1249 if (view.CanRetrieveTotalRowCount)
\r
1250 SelectArguments.RetrieveTotalRowCount = true;
\r
1253 cachedKeyProperties = null;
\r
1256 if (dataItem != null) {
\r
1257 if (CurrentMode == DetailsViewMode.Edit)
\r
1258 oldEditValues = new DataKey (GetRowValues (false, true));
\r
1259 key = new DataKey (CreateRowDataKey (dataItem), DataKeyNames);
\r
1263 protected internal override void PerformDataBinding (IEnumerable data)
\r
1265 base.PerformDataBinding (data);
\r
1269 protected internal virtual void PrepareControlHierarchy ()
\r
1271 throw new NotImplementedException ();
\r
1274 protected internal override void OnInit (EventArgs e)
\r
1276 Page.RegisterRequiresControlState (this);
\r
1280 void OnFieldsChanged (object sender, EventArgs args)
\r
1282 RequireBinding ();
\r
1285 protected override void OnDataSourceViewChanged (object sender, EventArgs e)
\r
1287 base.OnDataSourceViewChanged (sender, e);
\r
1288 RequireBinding ();
\r
1291 protected override bool OnBubbleEvent (object source, EventArgs e)
\r
1293 DetailsViewCommandEventArgs args = e as DetailsViewCommandEventArgs;
\r
1294 if (args != null) {
\r
1295 OnItemCommand (args);
\r
1296 ProcessEvent (args.CommandName, args.CommandArgument as string);
\r
1298 return base.OnBubbleEvent (source, e);
\r
1301 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
\r
1303 RaisePostBackEvent (eventArgument);
\r
1306 // TODO: This is prolly obsolete
\r
1307 protected virtual void RaisePostBackEvent (string eventArgument)
\r
1309 int i = eventArgument.IndexOf ('$');
\r
1311 ProcessEvent (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));
\r
1313 ProcessEvent (eventArgument, null);
\r
1316 void ProcessEvent (string eventName, string param)
\r
1318 switch (eventName)
\r
1320 case DataControlCommands.PageCommandName:
\r
1321 int newIndex = -1;
\r
1323 case DataControlCommands.FirstPageCommandArgument:
\r
1326 case DataControlCommands.LastPageCommandArgument:
\r
1327 newIndex = PageCount - 1;
\r
1329 case DataControlCommands.NextPageCommandArgument:
\r
1330 if (PageIndex < PageCount - 1) newIndex = PageIndex + 1;
\r
1332 case DataControlCommands.PreviousPageCommandArgument:
\r
1333 if (PageIndex > 0) newIndex = PageIndex - 1;
\r
1336 newIndex = int.Parse (param) - 1;
\r
1339 ShowPage (newIndex);
\r
1342 case DataControlCommands.FirstPageCommandArgument:
\r
1346 case DataControlCommands.LastPageCommandArgument:
\r
1347 ShowPage (PageCount - 1);
\r
1350 case DataControlCommands.NextPageCommandArgument:
\r
1351 if (PageIndex < PageCount - 1)
\r
1352 ShowPage (PageIndex + 1);
\r
1355 case DataControlCommands.PreviousPageCommandArgument:
\r
1356 if (PageIndex > 0)
\r
1357 ShowPage (PageIndex - 1);
\r
1360 case DataControlCommands.EditCommandName:
\r
1361 ChangeMode (DetailsViewMode.Edit);
\r
1364 case DataControlCommands.NewCommandName:
\r
1365 ChangeMode (DetailsViewMode.Insert);
\r
1368 case DataControlCommands.UpdateCommandName:
\r
1369 UpdateItem (param, true);
\r
1372 case DataControlCommands.CancelCommandName:
\r
1376 case DataControlCommands.DeleteCommandName:
\r
1380 case DataControlCommands.InsertCommandName:
\r
1381 InsertItem (true);
\r
1386 void ShowPage (int newIndex)
\r
1388 DetailsViewPageEventArgs args = new DetailsViewPageEventArgs (newIndex);
\r
1389 OnPageIndexChanging (args);
\r
1390 if (!args.Cancel) {
\r
1392 PageIndex = args.NewPageIndex;
\r
1393 OnPageIndexChanged (EventArgs.Empty);
\r
1397 public void ChangeMode (DetailsViewMode newMode)
\r
1399 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (newMode, false);
\r
1400 OnModeChanging (args);
\r
1401 if (!args.Cancel) {
\r
1402 currentMode = args.NewMode;
\r
1403 OnModeChanged (EventArgs.Empty);
\r
1404 RequireBinding ();
\r
1408 void CancelEdit ()
\r
1410 DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (DetailsViewMode.ReadOnly, true);
\r
1411 OnModeChanging (args);
\r
1412 if (!args.Cancel) {
\r
1417 public virtual void UpdateItem (bool causesValidation)
\r
1419 UpdateItem (null, causesValidation);
\r
1422 void UpdateItem (string param, bool causesValidation)
\r
1424 if (causesValidation)
\r
1427 if (currentMode != DetailsViewMode.Edit) throw new NotSupportedException ();
\r
1429 currentEditOldValues = oldEditValues.Values;
\r
1431 currentEditRowKeys = DataKey.Values;
\r
1432 currentEditNewValues = GetRowValues (false, false);
\r
1434 DetailsViewUpdateEventArgs args = new DetailsViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1435 OnItemUpdating (args);
\r
1436 if (!args.Cancel) {
\r
1437 DataSourceView view = GetData ();
\r
1438 if (view == null) throw new HttpException ("The DataSourceView associated to data bound control was null");
\r
1439 view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));
\r
1444 bool UpdateCallback (int recordsAffected, Exception exception)
\r
1446 DetailsViewUpdatedEventArgs dargs = new DetailsViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
\r
1447 OnItemUpdated (dargs);
\r
1449 if (!dargs.KeepInEditMode)
\r
1452 return dargs.ExceptionHandled;
\r
1455 public virtual void InsertItem (bool causesValidation)
\r
1457 InsertItem (null, causesValidation);
\r
1460 void InsertItem (string param, bool causesValidation)
\r
1462 if (causesValidation)
\r
1465 if (currentMode != DetailsViewMode.Insert) throw new NotSupportedException ();
\r
1467 currentEditNewValues = GetRowValues (false, true);
\r
1468 DetailsViewInsertEventArgs args = new DetailsViewInsertEventArgs (param, currentEditNewValues);
\r
1469 OnItemInserting (args);
\r
1470 if (!args.Cancel) {
\r
1471 DataSourceView view = GetData ();
\r
1474 view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));
\r
1479 bool InsertCallback (int recordsAffected, Exception exception)
\r
1481 DetailsViewInsertedEventArgs dargs = new DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
\r
1482 OnItemInserted (dargs);
\r
1484 if (!dargs.KeepInInsertMode)
\r
1487 return dargs.ExceptionHandled;
\r
1490 public virtual void DeleteItem ()
\r
1492 currentEditRowKeys = DataKey == null ? null : DataKey.Values;
\r
1493 currentEditNewValues = GetRowValues (true, true);
\r
1495 DetailsViewDeleteEventArgs args = new DetailsViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);
\r
1496 OnItemDeleting (args);
\r
1498 if (!args.Cancel) {
\r
1499 if (PageIndex == PageCount - 1)
\r
1501 RequireBinding ();
\r
1502 DataSourceView view = GetData ();
\r
1504 view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));
\r
1506 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);
\r
1507 OnItemDeleted (dargs);
\r
1512 bool DeleteCallback (int recordsAffected, Exception exception)
\r
1514 DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);
\r
1515 OnItemDeleted (dargs);
\r
1516 return dargs.ExceptionHandled;
\r
1519 void EndRowEdit ()
\r
1521 ChangeMode (DefaultMode);
\r
1522 oldEditValues = new DataKey (new OrderedDictionary ());
\r
1523 currentEditRowKeys = null;
\r
1524 currentEditOldValues = null;
\r
1525 currentEditNewValues = null;
\r
1526 RequireBinding ();
\r
1529 protected internal override void LoadControlState (object ob)
\r
1531 if (ob == null) return;
\r
1532 object[] state = (object[]) ob;
\r
1533 base.LoadControlState (state[0]);
\r
1534 pageIndex = (int) state[1];
\r
1535 pageCount = (int) state[2];
\r
1536 currentMode = (DetailsViewMode) state[3];
\r
1537 dataKeyNames = (string[]) state[4];
\r
1538 defaultMode = (DetailsViewMode) state[5];
\r
1541 protected internal override object SaveControlState ()
\r
1543 object bstate = base.SaveControlState ();
\r
1544 return new object[] {
\r
1545 bstate, pageIndex, pageCount, currentMode, dataKeyNames, defaultMode
\r
1549 protected override void TrackViewState()
\r
1551 base.TrackViewState();
\r
1552 if (columns != null) ((IStateManager)columns).TrackViewState();
\r
1553 if (pagerSettings != null) ((IStateManager)pagerSettings).TrackViewState();
\r
1554 if (alternatingRowStyle != null) ((IStateManager)alternatingRowStyle).TrackViewState();
\r
1555 if (footerStyle != null) ((IStateManager)footerStyle).TrackViewState();
\r
1556 if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();
\r
1557 if (pagerStyle != null) ((IStateManager)pagerStyle).TrackViewState();
\r
1558 if (rowStyle != null) ((IStateManager)rowStyle).TrackViewState();
\r
1559 if (editRowStyle != null) ((IStateManager)editRowStyle).TrackViewState();
\r
1560 if (insertRowStyle != null) ((IStateManager)insertRowStyle).TrackViewState();
\r
1561 if (emptyDataRowStyle != null) ((IStateManager)emptyDataRowStyle).TrackViewState();
\r
1562 if (key != null) ((IStateManager)key).TrackViewState();
\r
1563 if (autoFieldProperties != null) {
\r
1564 foreach (IStateManager sm in autoFieldProperties)
\r
1565 sm.TrackViewState ();
\r
1569 protected override object SaveViewState()
\r
1571 object[] states = new object [14];
\r
1572 states[0] = base.SaveViewState();
\r
1573 states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());
\r
1574 states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());
\r
1575 states[3] = (alternatingRowStyle == null ? null : ((IStateManager)alternatingRowStyle).SaveViewState());
\r
1576 states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());
\r
1577 states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());
\r
1578 states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());
\r
1579 states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());
\r
1580 states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());
\r
1581 states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());
\r
1582 states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());
\r
1583 states[11] = (key == null ? null : ((IStateManager)key).SaveViewState());
\r
1584 states[12] = (oldEditValues == null ? null : ((IStateManager)oldEditValues).SaveViewState());
\r
1586 if (autoFieldProperties != null) {
\r
1587 object[] data = new object [autoFieldProperties.Length];
\r
1588 bool allNull = true;
\r
1589 for (int n=0; n<data.Length; n++) {
\r
1590 data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();
\r
1591 if (data [n] != null) allNull = false;
\r
1593 if (!allNull) states [13] = data;
\r
1596 for (int i = states.Length - 1; i >= 0; i--) {
\r
1597 if (states [i] != null)
\r
1604 protected override void LoadViewState (object savedState)
\r
1606 if (savedState == null) {
\r
1607 base.LoadViewState (null);
\r
1611 object [] states = (object []) savedState;
\r
1613 if (states[13] != null) {
\r
1614 object[] data = (object[]) states [13];
\r
1615 autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];
\r
1616 for (int n=0; n<data.Length; n++) {
\r
1617 IStateManager p = new AutoGeneratedFieldProperties ();
\r
1618 p.TrackViewState ();
\r
1619 p.LoadViewState (data [n]);
\r
1620 autoFieldProperties [n] = (AutoGeneratedFieldProperties) p;
\r
1624 base.LoadViewState (states[0]);
\r
1625 EnsureChildControls ();
\r
1627 if (states[1] != null) ((IStateManager)Fields).LoadViewState (states[1]);
\r
1628 if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
\r
1629 if (states[3] != null) ((IStateManager)AlternatingRowStyle).LoadViewState (states[3]);
\r
1630 if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);
\r
1631 if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);
\r
1632 if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);
\r
1633 if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);
\r
1634 if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);
\r
1635 if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);
\r
1636 if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
\r
1637 if (states[11] != null) ((IStateManager)DataKey).LoadViewState (states[11]);
\r
1638 if (states[12] != null && oldEditValues != null) ((IStateManager)oldEditValues).LoadViewState (states[12]);
\r
1641 void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)
\r
1643 RaiseCallbackEvent (eventArgs);
\r
1646 string callbackResult;
\r
1647 protected virtual void RaiseCallbackEvent (string eventArgs)
\r
1649 string[] clientData = eventArgs.Split ('|');
\r
1650 pageIndex = int.Parse (clientData[0]);
\r
1651 RequireBinding ();
\r
1653 RaisePostBackEvent (clientData[2]);
\r
1654 EnsureDataBound ();
\r
1656 StringWriter sw = new StringWriter ();
\r
1657 sw.Write (PageIndex.ToString());
\r
1659 HtmlTextWriter writer = new HtmlTextWriter (sw);
\r
1660 RenderGrid (writer);
\r
1661 callbackResult = sw.ToString ();
\r
1664 string ICallbackEventHandler.GetCallbackResult ()
\r
1666 return GetCallbackResult ();
\r
1669 protected virtual string GetCallbackResult ()
\r
1671 return callbackResult;
\r
1675 protected virtual string GetCallbackScript (IButtonControl buttonControl, string argument)
\r
1677 throw new NotImplementedException ();
\r
1680 string ICallbackContainer.GetCallbackScript (IButtonControl control, string argument)
\r
1682 if (EnablePagingCallbacks)
\r
1683 return "javascript:GridView_ClientEvent (\"" + ClientID + "\",\"" + control.CommandName + "$" + control.CommandArgument + "\"); return false;";
\r
1689 protected override void OnPagePreLoad (object sender, EventArgs e)
\r
1691 base.OnPagePreLoad (sender, e);
\r
1694 protected internal override void OnPreRender (EventArgs e)
\r
1696 base.OnPreRender (e);
\r
1698 if (EnablePagingCallbacks)
\r
1700 if (!Page.ClientScript.IsClientScriptIncludeRegistered (typeof(GridView), "GridView.js")) {
\r
1701 string url = Page.ClientScript.GetWebResourceUrl (typeof(GridView), "GridView.js");
\r
1702 Page.ClientScript.RegisterClientScriptInclude (typeof(GridView), "GridView.js", url);
\r
1705 string cgrid = ClientID + "_data";
\r
1706 string script = string.Format ("var {0} = new Object ();\n", cgrid);
\r
1707 script += string.Format ("{0}.pageIndex = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (PageIndex));
\r
1708 script += string.Format ("{0}.uid = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (UniqueID));
\r
1709 Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
\r
1711 // Make sure the basic script infrastructure is rendered
\r
1712 Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");
\r
1713 Page.ClientScript.GetPostBackClientHyperlink (this, "");
\r
1717 protected internal override void Render (HtmlTextWriter writer)
\r
1719 if (EnablePagingCallbacks)
\r
1720 base.RenderBeginTag (writer);
\r
1722 writer.RenderBeginTag (HtmlTextWriterTag.Div);
\r
1724 RenderGrid (writer);
\r
1726 if (EnablePagingCallbacks)
\r
1727 base.RenderEndTag (writer);
\r
1729 writer.RenderEndTag ();
\r
1732 void RenderGrid (HtmlTextWriter writer)
\r
1734 table.GridLines = GridLines;
\r
1735 table.ControlStyle.MergeWith (ControlStyle);
\r
1736 table.RenderBeginTag (writer);
\r
1738 foreach (DetailsViewRow row in table.Rows)
\r
1740 switch (row.RowType) {
\r
1741 case DataControlRowType.Header:
\r
1742 if (headerStyle != null)headerStyle.AddAttributesToRender (writer, row);
\r
1744 case DataControlRowType.Footer:
\r
1745 if (footerStyle != null) footerStyle.AddAttributesToRender (writer, row);
\r
1747 case DataControlRowType.Pager:
\r
1748 if (pagerStyle != null) pagerStyle.AddAttributesToRender (writer, row);
\r
1750 case DataControlRowType.EmptyDataRow:
\r
1751 if (emptyDataRowStyle != null) emptyDataRowStyle.AddAttributesToRender (writer, row);
\r
1754 if (rowStyle != null) rowStyle.AddAttributesToRender (writer, row);
\r
1758 if ((row.RowState & DataControlRowState.Alternate) != 0 && alternatingRowStyle != null)
\r
1759 alternatingRowStyle.AddAttributesToRender (writer, row);
\r
1760 if ((row.RowState & DataControlRowState.Edit) != 0 && editRowStyle != null)
\r
1761 editRowStyle.AddAttributesToRender (writer, row);
\r
1762 if ((row.RowState & DataControlRowState.Insert) != 0 && insertRowStyle != null)
\r
1763 insertRowStyle.AddAttributesToRender (writer, row);
\r
1765 if (row == commandRow && commandRowStyle != null)
\r
1766 commandRowStyle.AddAttributesToRender (writer, row);
\r
1768 row.RenderBeginTag (writer);
\r
1770 for (int n=0; n<row.Cells.Count; n++) {
\r
1771 DataControlFieldCell fcell = row.Cells[n] as DataControlFieldCell;
\r
1772 if (fcell != null && fcell.ContainingField != null) {
\r
1773 if (n == 0 && fcell.ContainingField.ShowHeader) {
\r
1774 if (fieldHeaderStyle != null)
\r
1775 fieldHeaderStyle.AddAttributesToRender (writer, fcell);
\r
1776 fcell.ContainingField.HeaderStyle.AddAttributesToRender (writer, fcell);
\r
1779 fcell.ContainingField.ItemStyle.AddAttributesToRender (writer, fcell);
\r
1781 row.Cells[n].Render (writer);
\r
1783 row.RenderEndTag (writer);
\r
1785 table.RenderEndTag (writer);
\r
1790 PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)
\r
1792 PostBackOptions pbo = new PostBackOptions (this, control.CommandName + "$" + control.CommandArgument);
\r