Merge pull request #4621 from alexanderkyte/strdup_env
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / DetailsView.cs
index b583f91707fe673b4f1a4ada4f8cb9fd96229bb2..af981d0994395f7fb944f5e24164f85185df9482 100644 (file)
-//\r
-// System.Web.UI.WebControls.DetailsView.cs\r
-//\r
-// Authors:\r
-//     Lluis Sanchez Gual (lluis@novell.com)\r
-//\r
-// (C) 2005 Novell, Inc (http://www.novell.com)\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-\r
-#if NET_2_0\r
-\r
-using System;\r
-using System.Collections;\r
-using System.Collections.Specialized;\r
-using System.ComponentModel;\r
-using System.Web.UI;\r
-using System.Security.Permissions;\r
-using System.Text;\r
-using System.IO;\r
-using System.Reflection;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
-       [SupportsEventValidation]\r
-       [ToolboxDataAttribute ("<{0}:DetailsView runat=\"server\" Width=\"125px\" Height=\"50px\"></{0}:DetailsView>")]\r
-       [DesignerAttribute ("System.Web.UI.Design.WebControls.DetailsViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]\r
-       [ControlValuePropertyAttribute ("SelectedValue")]\r
-       [DefaultEventAttribute ("PageIndexChanging")]\r
-       [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]\r
-       [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]\r
-       public class DetailsView: CompositeDataBoundControl, ICallbackEventHandler, ICallbackContainer, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer\r
-       {\r
-               object dataItem;\r
-               \r
-               Table table;\r
-               DetailsViewRowCollection rows;\r
-               DetailsViewRow headerRow;\r
-               DetailsViewRow footerRow;\r
-               DetailsViewRow bottomPagerRow;\r
-               DetailsViewRow topPagerRow;\r
-               \r
-               IOrderedDictionary currentEditRowKeys;\r
-               IOrderedDictionary currentEditNewValues;\r
-               IOrderedDictionary currentEditOldValues;\r
-               \r
-               ITemplate pagerTemplate;\r
-               ITemplate emptyDataTemplate;\r
-               ITemplate headerTemplate;\r
-               ITemplate footerTemplate;\r
-               \r
-               PropertyDescriptor[] cachedKeyProperties;\r
-               readonly string[] emptyKeys = new string[0];\r
-               readonly string unhandledEventExceptionMessage = "The DetailsView '{0}' fired event {1} which wasn't handled.";\r
-               \r
-               // View state\r
-               DataControlFieldCollection columns;\r
-               PagerSettings pagerSettings;\r
-               \r
-               TableItemStyle alternatingRowStyle;\r
-               TableItemStyle editRowStyle;\r
-               TableItemStyle insertRowStyle;\r
-               TableItemStyle emptyDataRowStyle;\r
-               TableItemStyle footerStyle;\r
-               TableItemStyle headerStyle;\r
-               TableItemStyle pagerStyle;\r
-               TableItemStyle rowStyle;\r
-               TableItemStyle commandRowStyle;\r
-               TableItemStyle fieldHeaderStyle;\r
-               \r
-               IOrderedDictionary _keyTable;\r
-               DataKey key;\r
-               DataKey oldEditValues;\r
-               AutoGeneratedFieldProperties[] autoFieldProperties;\r
-               \r
-               private static readonly object PageIndexChangedEvent = new object();\r
-               private static readonly object PageIndexChangingEvent = new object();\r
-               private static readonly object ItemCommandEvent = new object();\r
-               private static readonly object ItemCreatedEvent = new object();\r
-               private static readonly object ItemDeletedEvent = new object();\r
-               private static readonly object ItemDeletingEvent = new object();\r
-               private static readonly object ItemInsertedEvent = new object();\r
-               private static readonly object ItemInsertingEvent = new object();\r
-               private static readonly object ModeChangingEvent = new object();\r
-               private static readonly object ModeChangedEvent = new object();\r
-               private static readonly object ItemUpdatedEvent = new object();\r
-               private static readonly object ItemUpdatingEvent = new object();\r
-               \r
-               // Control state\r
-               int pageIndex;\r
-               DetailsViewMode currentMode = DetailsViewMode.ReadOnly; \r
-               bool hasCurrentMode;\r
-               int pageCount;\r
-               \r
-               public DetailsView ()\r
-               {\r
-                       rows = new DetailsViewRowCollection (new ArrayList ());\r
-               }\r
-               \r
-               public event EventHandler PageIndexChanged {\r
-                       add { Events.AddHandler (PageIndexChangedEvent, value); }\r
-                       remove { Events.RemoveHandler (PageIndexChangedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewPageEventHandler PageIndexChanging {\r
-                       add { Events.AddHandler (PageIndexChangingEvent, value); }\r
-                       remove { Events.RemoveHandler (PageIndexChangingEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewCommandEventHandler ItemCommand {\r
-                       add { Events.AddHandler (ItemCommandEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemCommandEvent, value); }\r
-               }\r
-               \r
-               public event EventHandler ItemCreated {\r
-                       add { Events.AddHandler (ItemCreatedEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemCreatedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewDeletedEventHandler ItemDeleted {\r
-                       add { Events.AddHandler (ItemDeletedEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemDeletedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewDeleteEventHandler ItemDeleting {\r
-                       add { Events.AddHandler (ItemDeletingEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemDeletingEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewInsertedEventHandler ItemInserted {\r
-                       add { Events.AddHandler (ItemInsertedEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemInsertedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewInsertEventHandler ItemInserting {\r
-                       add { Events.AddHandler (ItemInsertingEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemInsertingEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewModeEventHandler ModeChanging {\r
-                       add { Events.AddHandler (ModeChangingEvent, value); }\r
-                       remove { Events.RemoveHandler (ModeChangingEvent, value); }\r
-               }\r
-               \r
-               public event EventHandler ModeChanged {\r
-                       add { Events.AddHandler (ModeChangedEvent, value); }\r
-                       remove { Events.RemoveHandler (ModeChangedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewUpdatedEventHandler ItemUpdated {\r
-                       add { Events.AddHandler (ItemUpdatedEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemUpdatedEvent, value); }\r
-               }\r
-               \r
-               public event DetailsViewUpdateEventHandler ItemUpdating {\r
-                       add { Events.AddHandler (ItemUpdatingEvent, value); }\r
-                       remove { Events.RemoveHandler (ItemUpdatingEvent, value); }\r
-               }\r
-               \r
-               protected virtual void OnPageIndexChanged (EventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewPageEventHandler eh = (DetailsViewPageEventHandler) Events [PageIndexChangingEvent];\r
-                               if (eh != null) {\r
-                                       eh (this, e);\r
-                                       return;\r
-                               }\r
-                       }\r
-                       if (!IsBoundUsingDataSourceID)\r
-                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "PageIndexChanging"));\r
-               }\r
-               \r
-               protected virtual void OnItemCommand (DetailsViewCommandEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewCommandEventHandler eh = (DetailsViewCommandEventHandler) Events [ItemCommandEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnItemCreated (EventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               EventHandler eh = (EventHandler) Events [ItemCreatedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnItemDeleted (DetailsViewDeletedEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewDeletedEventHandler eh = (DetailsViewDeletedEventHandler) Events [ItemDeletedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnItemInserted (DetailsViewInsertedEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewInsertedEventHandler eh = (DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnItemInserting (DetailsViewInsertEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewInsertEventHandler eh = (DetailsViewInsertEventHandler) Events [ItemInsertingEvent];\r
-                               if (eh != null) {\r
-                                       eh (this, e);\r
-                                       return;\r
-                               }\r
-                       }\r
-                       if (!IsBoundUsingDataSourceID)\r
-                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemInserting"));\r
-               }\r
-               \r
-               protected virtual void OnItemDeleting (DetailsViewDeleteEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewDeleteEventHandler eh = (DetailsViewDeleteEventHandler) Events [ItemDeletingEvent];\r
-                               if (eh != null) {\r
-                                       eh (this, e);\r
-                                       return;\r
-                               }\r
-                       }\r
-                       if (!IsBoundUsingDataSourceID)\r
-                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemDeleting"));\r
-               }\r
-               \r
-               protected virtual void OnModeChanged (EventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               EventHandler eh = (EventHandler) Events [ModeChangedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnModeChanging (DetailsViewModeEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewModeEventHandler eh = (DetailsViewModeEventHandler) Events [ModeChangingEvent];\r
-                               if (eh != null) {\r
-                                       eh (this, e);\r
-                                       return;\r
-                               }\r
-                       }\r
-                       if (!IsBoundUsingDataSourceID)\r
-                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ModeChanging"));\r
-               }\r
-               \r
-               protected virtual void OnItemUpdated (DetailsViewUpdatedEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewUpdatedEventHandler eh = (DetailsViewUpdatedEventHandler) Events [ItemUpdatedEvent];\r
-                               if (eh != null) eh (this, e);\r
-                       }\r
-               }\r
-               \r
-               protected virtual void OnItemUpdating (DetailsViewUpdateEventArgs e)\r
-               {\r
-                       if (Events != null) {\r
-                               DetailsViewUpdateEventHandler eh = (DetailsViewUpdateEventHandler) Events [ItemUpdatingEvent];\r
-                               if (eh != null) {\r
-                                       eh (this, e);\r
-                                       return;\r
-                               }\r
-                       }\r
-                       if (!IsBoundUsingDataSourceID)\r
-                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemUpdating"));\r
-               }\r
-               \r
-               \r
-               [WebCategoryAttribute ("Paging")]\r
-               [DefaultValueAttribute (false)]\r
-               public virtual bool AllowPaging {\r
-                       get {\r
-                               object ob = ViewState ["AllowPaging"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return false;\r
-                       }\r
-                       set {\r
-                               ViewState ["AllowPaging"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               [DefaultValueAttribute (null)]\r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle AlternatingRowStyle {\r
-                       get {\r
-                               if (alternatingRowStyle == null) {\r
-                                       alternatingRowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               alternatingRowStyle.TrackViewState();\r
-                               }\r
-                               return alternatingRowStyle;\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Behavior")]\r
-               [DefaultValueAttribute (false)]\r
-               public virtual bool AutoGenerateEditButton {\r
-                       get {\r
-                               object ob = ViewState ["AutoGenerateEditButton"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return false;\r
-                       }\r
-                       set {\r
-                               ViewState ["AutoGenerateEditButton"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Behavior")]\r
-               [DefaultValueAttribute (false)]\r
-               public virtual bool AutoGenerateDeleteButton {\r
-                       get {\r
-                               object ob = ViewState ["AutoGenerateDeleteButton"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return false;\r
-                       }\r
-                       set {\r
-                               ViewState ["AutoGenerateDeleteButton"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Behavior")]\r
-               [DefaultValueAttribute (false)]\r
-               public virtual bool AutoGenerateInsertButton {\r
-                       get {\r
-                               object ob = ViewState ["AutoGenerateInsertButton"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return false;\r
-                       }\r
-                       set {\r
-                               ViewState ["AutoGenerateInsertButton"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Behavior")]\r
-               [DefaultValueAttribute (true)]\r
-               public virtual bool AutoGenerateRows {\r
-                       get {\r
-                               object ob = ViewState ["AutoGenerateRows"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return true;\r
-                       }\r
-                       set {\r
-                               ViewState ["AutoGenerateRows"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               [UrlPropertyAttribute]\r
-               [WebCategoryAttribute ("Appearance")]\r
-               [DefaultValueAttribute ("")]\r
-               [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]\r
-               public virtual string BackImageUrl {\r
-                       get {\r
-                               if (ControlStyleCreated)\r
-                                       return ((TableStyle) ControlStyle).BackImageUrl;\r
-                               return String.Empty;\r
-                       }\r
-                       set {\r
-                               ((TableStyle) ControlStyle).BackImageUrl = value;\r
-                       }\r
-               }\r
-\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual DetailsViewRow BottomPagerRow {\r
-                       get {\r
-                               EnsureDataBound ();\r
-                               return bottomPagerRow;\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Accessibility")]\r
-               [DefaultValueAttribute ("")]\r
-               [LocalizableAttribute (true)]\r
-               public virtual string Caption {\r
-                       get {\r
-                               object ob = ViewState ["Caption"];\r
-                               if (ob != null) return (string) ob;\r
-                               return string.Empty;\r
-                       }\r
-                       set {\r
-                               ViewState ["Caption"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               [WebCategoryAttribute ("Accessibility")]\r
-               [DefaultValueAttribute (TableCaptionAlign.NotSet)]\r
-               public virtual TableCaptionAlign CaptionAlign\r
-               {\r
-                       get {\r
-                               object o = ViewState ["CaptionAlign"];\r
-                               if(o != null) return (TableCaptionAlign) o;\r
-                               return TableCaptionAlign.NotSet;\r
-                       }\r
-                       set {\r
-                               ViewState ["CaptionAlign"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Layout")]\r
-               [DefaultValueAttribute (-1)]\r
-               public virtual int CellPadding\r
-               {\r
-                       get {\r
-                               if (ControlStyleCreated)\r
-                                       return ((TableStyle) ControlStyle).CellPadding;\r
-                               return -1;\r
-                       }\r
-                       set {\r
-                               ((TableStyle) ControlStyle).CellPadding = value;\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Layout")]\r
-               [DefaultValueAttribute (0)]\r
-               public virtual int CellSpacing\r
-               {\r
-                       get {\r
-                               if (ControlStyleCreated)\r
-                                       return ((TableStyle) ControlStyle).CellSpacing;\r
-                               return 0;\r
-                       }\r
-                       set {\r
-                               ((TableStyle) ControlStyle).CellSpacing = value;\r
-                       }\r
-               }\r
-               \r
-               [DefaultValueAttribute (null)]\r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle CommandRowStyle {\r
-                       get {\r
-                               if (commandRowStyle == null) {\r
-                                       commandRowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               commandRowStyle.TrackViewState();\r
-                               }\r
-                               return commandRowStyle;\r
-                       }\r
-               }\r
-\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public DetailsViewMode CurrentMode {\r
-                       get {\r
-                               return hasCurrentMode ? currentMode : DefaultMode;\r
-                       }\r
-                       private set {\r
-                               hasCurrentMode = true;\r
-                               currentMode = value;\r
-                       }\r
-               }\r
-\r
-               DetailsViewMode defaultMode = DetailsViewMode.ReadOnly;\r
-               [DefaultValueAttribute (DetailsViewMode.ReadOnly)]\r
-               [WebCategoryAttribute ("Behavior")]\r
-               public virtual DetailsViewMode DefaultMode {\r
-                       get {\r
-                               return defaultMode;\r
-                       }\r
-                       set {\r
-                               defaultMode = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-       \r
-               [EditorAttribute ("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]\r
-               [MergablePropertyAttribute (false)]\r
-               [PersistenceModeAttribute (PersistenceMode.InnerProperty)]\r
-               [DefaultValueAttribute (null)]\r
-               [WebCategoryAttribute ("Misc")]\r
-               public virtual DataControlFieldCollection Fields {\r
-                       get {\r
-                               if (columns == null) {\r
-                                       columns = new DataControlFieldCollection ();\r
-                                       columns.FieldsChanged += new EventHandler (OnFieldsChanged);\r
-                                       if (IsTrackingViewState)\r
-                                               ((IStateManager)columns).TrackViewState ();\r
-                               }\r
-                               return columns;\r
-                       }\r
-               }\r
-\r
-               string[] dataKeyNames = null;\r
-\r
-               [DefaultValueAttribute (null)]\r
-               [WebCategoryAttribute ("Data")]\r
-               [TypeConverter (typeof(StringArrayConverter))]\r
-               [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]\r
-               public virtual string[] DataKeyNames\r
-               {\r
-                       get {\r
-                               if (dataKeyNames == null)\r
-                                       return emptyKeys;\r
-                               else\r
-                                       return dataKeyNames;\r
-                       }\r
-                       set {\r
-                               dataKeyNames = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               IOrderedDictionary KeyTable {\r
-                       get {\r
-                               if (_keyTable == null) {\r
-                                       _keyTable = new OrderedDictionary (DataKeyNames.Length);\r
-                               }\r
-                               return _keyTable;\r
-                       }\r
-               }\r
-\r
-               [BrowsableAttribute (false)]\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               public virtual DataKey DataKey {\r
-                       get {\r
-                               if (key == null) {\r
-                                       key = new DataKey (KeyTable);\r
-                               }\r
-                               return key;\r
-                       }\r
-               }\r
-\r
-               DataKey OldEditValues {\r
-                       get {\r
-                               if (oldEditValues == null) {\r
-                                       oldEditValues = new DataKey (new OrderedDictionary ());\r
-                               }\r
-                               return oldEditValues;\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               [DefaultValueAttribute (null)]\r
-               public TableItemStyle EditRowStyle {\r
-                       get {\r
-                               if (editRowStyle == null) {\r
-                                       editRowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               editRowStyle.TrackViewState();\r
-                               }\r
-                               return editRowStyle;\r
-                       }\r
-               }\r
-               \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               [DefaultValueAttribute (null)]\r
-               public TableItemStyle EmptyDataRowStyle {\r
-                       get {\r
-                               if (emptyDataRowStyle == null) {\r
-                                       emptyDataRowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               emptyDataRowStyle.TrackViewState();\r
-                               }\r
-                               return emptyDataRowStyle;\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue (null)]\r
-               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [Browsable (false)]\r
-               public virtual ITemplate EmptyDataTemplate {\r
-                       get { return emptyDataTemplate; }\r
-                       set { emptyDataTemplate = value; RequireBinding (); }\r
-               }\r
-               \r
-               [LocalizableAttribute (true)]\r
-               [WebCategoryAttribute ("Appearance")]\r
-               [DefaultValueAttribute ("")]\r
-               public virtual string EmptyDataText {\r
-                       get {\r
-                               object ob = ViewState ["EmptyDataText"];\r
-                               if (ob != null) return (string) ob;\r
-                               return string.Empty;\r
-                       }\r
-                       set {\r
-                               ViewState ["EmptyDataText"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Behavior")]\r
-               [DefaultValueAttribute (false)]\r
-               public virtual bool EnablePagingCallbacks {\r
-                       get {\r
-                               object ob = ViewState ["EnablePagingCallbacks"];\r
-                               if (ob != null) return (bool) ob;\r
-                               return false;\r
-                       }\r
-                       set {\r
-                               ViewState ["EnablePagingCallbacks"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DefaultValue (null)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle FieldHeaderStyle {\r
-                       get {\r
-                               if (fieldHeaderStyle == null) {\r
-                                       fieldHeaderStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               fieldHeaderStyle.TrackViewState();\r
-                               }\r
-                               return fieldHeaderStyle;\r
-                       }\r
-               }\r
-               \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual DetailsViewRow FooterRow {\r
-                       get {\r
-                               EnsureChildControls ();\r
-                               return footerRow;\r
-                       }\r
-               }\r
-       \r
-               [DefaultValue (null)]\r
-               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [Browsable (false)]\r
-               public virtual ITemplate FooterTemplate {\r
-                       get { return footerTemplate; }\r
-                       set { footerTemplate = value; RequireBinding (); }\r
-               }\r
-\r
-               [LocalizableAttribute (true)]\r
-               [WebCategoryAttribute ("Appearance")]\r
-               [DefaultValueAttribute ("")]\r
-               public virtual string FooterText {\r
-                       get {\r
-                               object ob = ViewState ["FooterText"];\r
-                               if (ob != null) return (string) ob;\r
-                               return string.Empty;\r
-                       }\r
-                       set {\r
-                               ViewState ["FooterText"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DefaultValue (null)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle FooterStyle {\r
-                       get {\r
-                               if (footerStyle == null) {\r
-                                       footerStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               footerStyle.TrackViewState();\r
-                               }\r
-                               return footerStyle;\r
-                       }\r
-               }\r
-               \r
-               [WebCategoryAttribute ("Appearance")]\r
-               [DefaultValueAttribute (GridLines.Both)]\r
-               public virtual GridLines GridLines {\r
-                       get {\r
-                               if (ControlStyleCreated)\r
-                                       return ((TableStyle) ControlStyle).GridLines;\r
-                               return GridLines.Both;\r
-                       }\r
-                       set {\r
-                               ((TableStyle) ControlStyle).GridLines = value;\r
-                       }\r
-               }\r
-\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual DetailsViewRow HeaderRow {\r
-                       get {\r
-                               EnsureChildControls ();\r
-                               return headerRow;\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DefaultValue (null)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle HeaderStyle {\r
-                       get {\r
-                               if (headerStyle == null) {\r
-                                       headerStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               headerStyle.TrackViewState();\r
-                               }\r
-                               return headerStyle;\r
-                       }\r
-               }\r
-               \r
-               [DefaultValue (null)]\r
-               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [Browsable (false)]\r
-               public virtual ITemplate HeaderTemplate {\r
-                       get { return headerTemplate; }\r
-                       set { headerTemplate = value; RequireBinding (); }\r
-               }\r
-\r
-               [LocalizableAttribute (true)]\r
-               [WebCategoryAttribute ("Appearance")]\r
-               [DefaultValueAttribute ("")]\r
-               public virtual string HeaderText {\r
-                       get {\r
-                               object ob = ViewState ["HeaderText"];\r
-                               if (ob != null) return (string) ob;\r
-                               return string.Empty;\r
-                       }\r
-                       set {\r
-                               ViewState ["HeaderText"] = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-               \r
-               [Category ("Layout")]\r
-               [DefaultValueAttribute (HorizontalAlign.NotSet)]\r
-               public virtual HorizontalAlign HorizontalAlign {\r
-                       get {\r
-                               if (ControlStyleCreated)\r
-                                       return ((TableStyle) ControlStyle).HorizontalAlign;\r
-                               return HorizontalAlign.NotSet;\r
-                       }\r
-                       set {\r
-                               ((TableStyle) ControlStyle).HorizontalAlign = value;\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               [DefaultValueAttribute (null)]\r
-               public TableItemStyle InsertRowStyle {\r
-                       get {\r
-                               if (insertRowStyle == null) {\r
-                                       insertRowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               insertRowStyle.TrackViewState();\r
-                               }\r
-                               return insertRowStyle;\r
-                       }\r
-               }\r
-               \r
-               [BrowsableAttribute (false)]\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               public virtual int PageCount {\r
-                       get {\r
-                               return pageCount;\r
-                       }\r
-               }\r
-\r
-               [WebCategoryAttribute ("Paging")]\r
-               [BindableAttribute (true, BindingDirection.OneWay)]\r
-               [DefaultValueAttribute (0)]\r
-               public virtual int PageIndex {\r
-                       get {\r
-                               return pageIndex;\r
-                       }\r
-                       set {\r
-                               if (value < 0)\r
-                                       throw new ArgumentOutOfRangeException ("PageIndex must be non-negative");\r
-                               if (value == pageIndex)\r
-                                       return;\r
-                               pageIndex = value;\r
-                               RequireBinding ();\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Paging")]\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]\r
-               [NotifyParentPropertyAttribute (true)]\r
-               [PersistenceModeAttribute (PersistenceMode.InnerProperty)]\r
-               public virtual PagerSettings PagerSettings {\r
-                       get {\r
-                               if (pagerSettings == null) {\r
-                                       pagerSettings = new PagerSettings (this);\r
-                                       if (IsTrackingViewState)\r
-                                               ((IStateManager)pagerSettings).TrackViewState ();\r
-                               }\r
-                               return pagerSettings;\r
-                       }\r
-               }\r
-       \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               public TableItemStyle PagerStyle {\r
-                       get {\r
-                               if (pagerStyle == null) {\r
-                                       pagerStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               pagerStyle.TrackViewState();\r
-                               }\r
-                               return pagerStyle;\r
-                       }\r
-               }\r
-               \r
-               \r
-               [DefaultValue (null)]\r
-               [TemplateContainer (typeof (DetailsView), BindingDirection.OneWay)]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [Browsable (false)]\r
-               public virtual ITemplate PagerTemplate {\r
-                       get { return pagerTemplate; }\r
-                       set { pagerTemplate = value; RequireBinding (); }\r
-               }\r
-               \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual DetailsViewRowCollection Rows {\r
-                       get {\r
-                               EnsureChildControls ();\r
-                               return rows;\r
-                       }\r
-               }\r
-               \r
-               [WebCategoryAttribute ("Styles")]\r
-               [PersistenceMode (PersistenceMode.InnerProperty)]\r
-               [NotifyParentProperty (true)]\r
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]\r
-               [DefaultValue (null)]\r
-               public TableItemStyle RowStyle {\r
-                       get {\r
-                               if (rowStyle == null) {\r
-                                       rowStyle = new TableItemStyle ();\r
-                                       if (IsTrackingViewState)\r
-                                               rowStyle.TrackViewState();\r
-                               }\r
-                               return rowStyle;\r
-                       }\r
-               }\r
-\r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public object SelectedValue {\r
-                       get { return DataKey.Value; }\r
-               }\r
-               \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual DetailsViewRow TopPagerRow {\r
-                       get {\r
-                               EnsureDataBound ();\r
-                               return topPagerRow;\r
-                       }\r
-               }\r
-       \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual object DataItem {\r
-                       get {\r
-                               EnsureDataBound ();\r
-                               return dataItem;\r
-                       }\r
-               }\r
-               \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public int DataItemCount {\r
-                       get { return PageCount; }\r
-               }               \r
-       \r
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
-               [BrowsableAttribute (false)]\r
-               public virtual int DataItemIndex {\r
-                       get { return PageIndex; }\r
-               }               \r
-       \r
-               int IDataItemContainer.DisplayIndex {\r
-                       get { return PageIndex; }\r
-               }\r
-\r
-               int IDataItemContainer.DataItemIndex {\r
-                       get { return DataItemIndex; }\r
-               }\r
-       \r
-               public virtual bool IsBindableType (Type type)\r
-               {\r
-                       return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);\r
-               }\r
-               \r
-               protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()\r
-               {\r
-                       DataSourceSelectArguments arg = new DataSourceSelectArguments ();\r
-                       DataSourceView view = GetData ();\r
-                       if (AllowPaging && view.CanPage) {\r
-                               arg.StartRowIndex = PageIndex;\r
-                               if (view.CanRetrieveTotalRowCount) {\r
-                                       arg.RetrieveTotalRowCount = true;\r
-                                       arg.MaximumRows = 1;\r
-                               }\r
-                               else {\r
-                                       arg.MaximumRows = -1;\r
-                               }\r
-                       }\r
-                       return arg;\r
-               }\r
-               \r
-               protected virtual ICollection CreateFieldSet (object dataItem, bool useDataSource)\r
-               {\r
-                       ArrayList fields = new ArrayList ();\r
-                       \r
-                       if (AutoGenerateRows) {\r
-                               if (useDataSource) {\r
-                                       if (dataItem != null)\r
-                                               fields.AddRange (CreateAutoGeneratedRows (dataItem));\r
-                               } else {\r
-                                       if (autoFieldProperties != null) {\r
-                                               foreach (AutoGeneratedFieldProperties props in autoFieldProperties)\r
-                                                       fields.Add (CreateAutoGeneratedRow (props));\r
-                                       }\r
-                               }\r
-                       }\r
-                       \r
-                       fields.AddRange (Fields);\r
-                       \r
-                       if (AutoGenerateEditButton || AutoGenerateDeleteButton || AutoGenerateInsertButton) {\r
-                               CommandField field = new CommandField ();\r
-                               field.ShowEditButton = AutoGenerateEditButton;\r
-                               field.ShowDeleteButton = AutoGenerateDeleteButton;\r
-                               field.ShowInsertButton = AutoGenerateInsertButton;\r
-                               fields.Add (field);\r
-                       }\r
-                       \r
-                       return fields;\r
-               }\r
-               \r
-               protected virtual ICollection CreateAutoGeneratedRows (object dataItem)\r
-               {\r
-                       if (dataItem == null)\r
-                               return null;\r
-\r
-                       ArrayList list = new ArrayList ();\r
-                       autoFieldProperties = CreateAutoFieldProperties (dataItem);\r
-                       foreach (AutoGeneratedFieldProperties props in autoFieldProperties)\r
-                               list.Add (CreateAutoGeneratedRow (props));\r
-                       return list;\r
-               }\r
-               \r
-               protected virtual AutoGeneratedField CreateAutoGeneratedRow (AutoGeneratedFieldProperties fieldProperties)\r
-               {\r
-                       return new AutoGeneratedField (fieldProperties);\r
-               }\r
-               \r
-               AutoGeneratedFieldProperties[] CreateAutoFieldProperties (object dataItem)\r
-               {\r
-                       if (IsBindableType (dataItem.GetType ()))\r
-                       {\r
-                               AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();\r
-                               ((IStateManager) field).TrackViewState ();\r
-                               field.Name = "Item";\r
-                               field.DataField = BoundField.ThisExpression;\r
-                               field.Type = dataItem.GetType ();\r
-                               return new AutoGeneratedFieldProperties [] { field };\r
-                       }\r
-\r
-                       PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem, false);\r
-\r
-                       if (props != null && props.Count > 0) {\r
-                               ArrayList retVal = new ArrayList ();\r
-                               foreach (PropertyDescriptor current in props) {\r
-                                       if (IsBindableType (current.PropertyType)) {\r
-                                               AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();\r
-                                               ((IStateManager) field).TrackViewState ();\r
-                                               field.Name = current.Name;\r
-                                               field.DataField = current.Name;\r
-                                               for (int i = 0; i < DataKeyNames.Length; i++) {\r
-                                                       if (string.Compare (DataKeyNames [i], current.Name, StringComparison.InvariantCultureIgnoreCase) == 0) {\r
-                                                               field.IsReadOnly = true;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                               field.Type = current.PropertyType;\r
-                                               retVal.Add (field);\r
-                                       }\r
-                               }\r
-                               if (retVal.Count > 0)\r
-                                       return (AutoGeneratedFieldProperties []) retVal.ToArray (typeof (AutoGeneratedFieldProperties));\r
-                       }\r
-                       throw new HttpException (String.Format ("DetailsView with id '{0}' did not have any properties or attributes from which to generate fields.  Ensure that your data source has content.", ID));\r
-               }\r
-               \r
-               protected virtual DetailsViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)\r
-               {\r
-                       DetailsViewRow row;\r
-                       if (rowType == DataControlRowType.Pager)\r
-                               row = new DetailsViewPagerRow (rowIndex, rowType, rowState);\r
-                       else\r
-                               row = new DetailsViewRow (rowIndex, rowType, rowState);\r
-                       OnItemCreated (EventArgs.Empty);\r
-                       return row;\r
-               }\r
-               \r
-               void RequireBinding ()\r
-               {\r
-                       if (Initialized) {\r
-                               RequiresDataBinding = true;\r
-                       }\r
-               }\r
-               \r
-               protected virtual Table CreateTable ()\r
-               {\r
-                       return new ContainedTable (this);\r
-               }\r
-\r
-               protected override Style CreateControlStyle ()\r
-               {\r
-                       TableStyle style = new TableStyle ();\r
-                       style.GridLines = GridLines.Both;\r
-                       style.CellSpacing = 0;\r
-                       return style;\r
-               }\r
-               \r
-               protected override int CreateChildControls (IEnumerable data, bool dataBinding)\r
-               {\r
-                       PagedDataSource dataSource;\r
-\r
-                       if (dataBinding) {\r
-                               DataSourceView view = GetData ();\r
-                               dataSource = new PagedDataSource ();\r
-                               dataSource.DataSource = data;\r
-                               \r
-                               if (AllowPaging) {\r
-                                       dataSource.AllowPaging = true;\r
-                                       dataSource.PageSize = 1;\r
-                                       dataSource.CurrentPageIndex = PageIndex;\r
-                                       if (view.CanPage) {\r
-                                               dataSource.AllowServerPaging = true;\r
-                                               if (SelectArguments.RetrieveTotalRowCount)\r
-                                                       dataSource.VirtualCount = SelectArguments.TotalRowCount;\r
-                                       }\r
-                               }\r
-                               \r
-                               pageCount = dataSource.DataSourceCount;\r
-                       }\r
-                       else\r
-                       {\r
-                               dataSource = new PagedDataSource ();\r
-                               dataSource.DataSource = data;\r
-                               if (AllowPaging) {\r
-                                       dataSource.AllowPaging = true;\r
-                                       dataSource.PageSize = 1;\r
-                                       dataSource.CurrentPageIndex = PageIndex;\r
-                               }\r
-                       }\r
-\r
-                       bool showPager = AllowPaging && (PageCount > 1);\r
-                       \r
-                       Controls.Clear ();\r
-                       table = CreateTable ();\r
-                       Controls.Add (table);\r
-                               \r
-                       ArrayList list = new ArrayList ();\r
-                       \r
-                       // Gets the current data item\r
-                       \r
-                       IEnumerator e = dataSource.GetEnumerator (); \r
-                       if (e.MoveNext ())\r
-                               dataItem = e.Current;\r
-                       else\r
-                               dataItem = null;\r
-                       \r
-                       // Creates the set of fields to show\r
-\r
-                       ICollection fieldCollection = CreateFieldSet (dataItem, dataBinding && dataItem != null);\r
-                       DataControlField[] fields = new DataControlField [fieldCollection.Count];\r
-                       fieldCollection.CopyTo (fields, 0);\r
-\r
-                       foreach (DataControlField field in fields) {\r
-                               field.Initialize (false, this);\r
-                               if (EnablePagingCallbacks)\r
-                                       field.ValidateSupportsCallback ();\r
-                       }\r
-\r
-                       // Main table creation\r
-                       \r
-                       headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);\r
-                       DataControlFieldCell headerCell = new DataControlFieldCell (null);\r
-                       headerCell.ColumnSpan = 2;\r
-                       if (headerTemplate != null)\r
-                               headerTemplate.InstantiateIn (headerCell);\r
-                       else\r
-                               headerCell.Text = HeaderText;\r
-                       headerRow.Cells.Add (headerCell);\r
-                       table.Rows.Add (headerRow);\r
-                       \r
-                       if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {\r
-                               topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);\r
-                               InitializePager (topPagerRow, dataSource);\r
-                               table.Rows.Add (topPagerRow);\r
-                       }\r
-                       \r
-                       if (dataSource.Count > 0) {\r
-                               foreach (DataControlField field in fields) {\r
-                                       DataControlRowState rstate = GetRowState (list.Count);\r
-                                       DetailsViewRow row = CreateRow (PageIndex, DataControlRowType.DataRow, rstate);\r
-                                       InitializeRow (row, field);\r
-                                       table.Rows.Add (row);\r
-                                       list.Add (row);\r
-                               }\r
-                       } else {\r
-                               table.Rows.Add (CreateEmptyrRow ());\r
-                       }\r
-\r
-                       rows = new DetailsViewRowCollection (list);\r
-\r
-                       footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);\r
-                       DataControlFieldCell footerCell = new DataControlFieldCell (null);\r
-                       footerCell.ColumnSpan = 2;\r
-                       if (footerTemplate != null)\r
-                               footerTemplate.InstantiateIn (footerCell);\r
-                       else\r
-                               footerCell.Text = FooterText;\r
-                       footerRow.Cells.Add (footerCell);\r
-                       table.Rows.Add (footerRow);\r
-                       \r
-                       if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {\r
-                               bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);\r
-                               InitializePager (bottomPagerRow, dataSource);\r
-                               table.Rows.Add (bottomPagerRow);\r
-                       }\r
-                       \r
-                       if (dataBinding)\r
-                               DataBind (false);\r
-                       \r
-                       return dataSource.DataSourceCount;\r
-               }\r
-\r
-               protected override void EnsureDataBound ()\r
-               {\r
-                       base.EnsureDataBound ();\r
-               }\r
-               \r
-               DataControlRowState GetRowState (int index)\r
-               {\r
-                       DataControlRowState rstate = (index % 2) == 0 ? DataControlRowState.Normal : DataControlRowState.Alternate;\r
-                       if (CurrentMode == DetailsViewMode.Edit) rstate |= DataControlRowState.Edit;\r
-                       else if (CurrentMode == DetailsViewMode.Insert) rstate |= DataControlRowState.Insert;\r
-                       return rstate;\r
-               }\r
-               \r
-               protected virtual void InitializePager (DetailsViewRow row, PagedDataSource dataSource)\r
-               {\r
-                       TableCell cell = new TableCell ();\r
-                       cell.ColumnSpan = 2;\r
-                       \r
-                       if (pagerTemplate != null)\r
-                               pagerTemplate.InstantiateIn (cell);\r
-                       else\r
-                               cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));\r
-                       \r
-                       row.Cells.Add (cell);\r
-               }\r
-               \r
-               DetailsViewRow CreateEmptyrRow ()\r
-               {\r
-                       DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);\r
-                       TableCell cell = new TableCell ();\r
-                       \r
-                       if (emptyDataTemplate != null)\r
-                               emptyDataTemplate.InstantiateIn (cell);\r
-                       else\r
-                               cell.Text = EmptyDataText;\r
-                       \r
-                       row.Cells.Add (cell);\r
-                       return row;\r
-               }\r
-               \r
-               protected virtual void InitializeRow (DetailsViewRow row, DataControlField field)\r
-               {\r
-                       row.ContainingField = field;\r
-                       DataControlFieldCell cell;\r
-                       \r
-                       if (field.ShowHeader) {\r
-                               cell = new DataControlFieldCell (field);\r
-                               row.Cells.Add (cell);\r
-                               field.InitializeCell (cell, DataControlCellType.Header, row.RowState, row.RowIndex);\r
-                       }\r
-                       \r
-                       cell = new DataControlFieldCell (field);\r
-                       if (!field.ShowHeader)\r
-                               cell.ColumnSpan = 2;\r
-                       row.Cells.Add (cell);\r
-                       field.InitializeCell (cell, DataControlCellType.DataCell, row.RowState, row.RowIndex);\r
-\r
-                       if (CurrentMode == DetailsViewMode.Insert && !field.InsertVisible)\r
-                               row.Visible = false;\r
-               }\r
-               \r
-               void FillRowDataKey (object dataItem)\r
-               {\r
-                       KeyTable.Clear ();\r
-\r
-                       if (cachedKeyProperties == null) {\r
-                               PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);\r
-                               cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];\r
-                               for (int n=0; n<DataKeyNames.Length; n++) { \r
-                                       PropertyDescriptor p = props.Find (DataKeyNames [n], true);\r
-                                       if (p == null)\r
-                                               throw new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());\r
-                                       cachedKeyProperties [n] = p;\r
-                               }\r
-                       }\r
-                       \r
-                       foreach (PropertyDescriptor p in cachedKeyProperties)\r
-                               KeyTable [p.Name] = p.GetValue (dataItem);\r
-               }\r
-               \r
-               IOrderedDictionary GetRowValues (bool includeReadOnlyFields, bool includePrimaryKey)\r
-               {\r
-                       OrderedDictionary dic = new OrderedDictionary ();\r
-                       ExtractRowValues (dic, includeReadOnlyFields, includePrimaryKey);\r
-                       return dic;\r
-               }\r
-               \r
-               protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeReadOnlyFields, bool includePrimaryKey)\r
-               {\r
-                       foreach (DetailsViewRow row in Rows) {\r
-                               if (row.Cells.Count < 1) continue;\r
-                               DataControlFieldCell c = row.Cells[row.Cells.Count-1] as DataControlFieldCell;\r
-                               if (c != null)\r
-                                       c.ContainingField.ExtractValuesFromCell (fieldValues, c, row.RowState, includeReadOnlyFields);\r
-                       }\r
-                       if (!includePrimaryKey && DataKeyNames != null)\r
-                               foreach (string key in DataKeyNames)\r
-                                       fieldValues.Remove (key);\r
-               }\r
-               \r
-               protected override HtmlTextWriterTag TagKey {\r
-                       get {\r
-                               if (EnablePagingCallbacks)\r
-                                       return HtmlTextWriterTag.Div;\r
-                               else\r
-                                       return HtmlTextWriterTag.Table;\r
-                       }\r
-               }\r
-               \r
-               public sealed override void DataBind ()\r
-               {\r
-                       if (CurrentMode == DetailsViewMode.Insert) {\r
-                               RequiresDataBinding = false;\r
-                               PerformDataBinding (new object [] { null });\r
-                               MarkAsDataBound ();\r
-                               return;\r
-                       }\r
-                       \r
-                       cachedKeyProperties = null;\r
-                       base.DataBind ();\r
-                       \r
-                       if (dataItem != null) {\r
-                               if (CurrentMode == DetailsViewMode.Edit)\r
-                                       oldEditValues = new DataKey (GetRowValues (false, true));\r
-                               FillRowDataKey (dataItem);\r
-                               key = new DataKey (KeyTable);\r
-                       }\r
-               }\r
-               \r
-               protected internal override void PerformDataBinding (IEnumerable data)\r
-               {\r
-                       base.PerformDataBinding (data);\r
-               }\r
-\r
-               protected internal virtual void PrepareControlHierarchy ()\r
-               {\r
-                       if (table == null)\r
-                               return;\r
-\r
-                       table.Caption = Caption;\r
-                       table.CaptionAlign = CaptionAlign;\r
-\r
-                       // set visible for header and footer\r
-                       TableCell headerCell = (TableCell) HeaderRow.Controls [0];\r
-                       HeaderRow.Visible = headerCell.Text.Length > 0 || headerCell.Controls.Count > 0;\r
-                       TableCell footerCell = (TableCell) FooterRow.Controls [0];\r
-                       FooterRow.Visible = footerCell.Text.Length > 0 || footerCell.Controls.Count > 0;\r
-\r
-                       foreach (DetailsViewRow row in table.Rows) {\r
-                               switch (row.RowType) {\r
-                               case DataControlRowType.Header:\r
-                                       if (headerStyle != null && !headerStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (headerStyle);\r
-                                       break;\r
-                               case DataControlRowType.Footer:\r
-                                       if (footerStyle != null && !footerStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (footerStyle);\r
-                                       break;\r
-                               case DataControlRowType.Pager:\r
-                                       if (pagerStyle != null && !pagerStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (pagerStyle);\r
-                                       break;\r
-                               case DataControlRowType.EmptyDataRow:\r
-                                       if (emptyDataRowStyle != null && !emptyDataRowStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (emptyDataRowStyle);\r
-                                       break;\r
-                               case DataControlRowType.DataRow:\r
-                                       if (rowStyle != null && !rowStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (rowStyle);\r
-                                       if ((row.RowState & DataControlRowState.Alternate) != 0 && alternatingRowStyle != null && !alternatingRowStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (alternatingRowStyle);\r
-                                       break;\r
-                               default:\r
-                                       break;\r
-                               }\r
-\r
-                               if (row.ContainingField is CommandField) {\r
-                                       if (commandRowStyle != null && !commandRowStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (commandRowStyle);\r
-                               }\r
-                               else {\r
-                                       if ((row.RowState & DataControlRowState.Edit) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)\r
-                                               row.ControlStyle.CopyFrom (editRowStyle);\r
-                                       if ((row.RowState & DataControlRowState.Insert) != 0) {\r
-                                               if (insertRowStyle != null && !insertRowStyle.IsEmpty)\r
-                                                       row.ControlStyle.CopyFrom (insertRowStyle);\r
-                                               else if (editRowStyle != null && !editRowStyle.IsEmpty)\r
-                                                       row.ControlStyle.CopyFrom (editRowStyle);\r
-                                       }\r
-                               }\r
-\r
-                               for (int n = 0; n < row.Cells.Count; n++) {\r
-                                       DataControlFieldCell fcell = row.Cells [n] as DataControlFieldCell;\r
-                                       if (fcell != null && fcell.ContainingField != null) {\r
-                                               DataControlField field = fcell.ContainingField;\r
-                                               if (n == 0 && field.ShowHeader) {\r
-                                                       if (fieldHeaderStyle != null && !fieldHeaderStyle.IsEmpty)\r
-                                                               fcell.ControlStyle.CopyFrom (fieldHeaderStyle);\r
-                                                       if (field.HeaderStyleCreated && !field.HeaderStyle.IsEmpty)\r
-                                                               fcell.ControlStyle.CopyFrom (field.HeaderStyle);\r
-                                               }\r
-                                               else {\r
-                                                       if (field.ControlStyleCreated && !field.ControlStyle.IsEmpty)\r
-                                                               foreach (Control c in fcell.Controls) {\r
-                                                                       WebControl wc = c as WebControl;\r
-                                                                       if (wc != null)\r
-                                                                               wc.ControlStyle.MergeWith (field.ControlStyle);\r
-                                                               }\r
-                                                       if (field.ItemStyleCreated && !field.ItemStyle.IsEmpty)\r
-                                                               fcell.ControlStyle.CopyFrom (field.ItemStyle);\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               protected internal override void OnInit (EventArgs e)\r
-               {\r
-                       Page.RegisterRequiresControlState (this);\r
-                       base.OnInit (e);\r
-               }\r
-               \r
-               void OnFieldsChanged (object sender, EventArgs args)\r
-               {\r
-                       RequireBinding ();\r
-               }\r
-               \r
-               protected override void OnDataSourceViewChanged (object sender, EventArgs e)\r
-               {\r
-                       base.OnDataSourceViewChanged (sender, e);\r
-                       RequireBinding ();\r
-               }\r
-               \r
-               protected override bool OnBubbleEvent (object source, EventArgs e)\r
-               {\r
-                       DetailsViewCommandEventArgs args = e as DetailsViewCommandEventArgs;\r
-                       if (args != null) {\r
-                               ProcessCommand (args);\r
-                               return true;\r
-                       }\r
-                       return base.OnBubbleEvent (source, e);\r
-               }\r
-\r
-               void ProcessCommand (DetailsViewCommandEventArgs args) {\r
-                       OnItemCommand (args);\r
-                       ProcessEvent (args.CommandName, args.CommandArgument as string);\r
-               }\r
-\r
-               void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)\r
-               {\r
-                       RaisePostBackEvent (eventArgument);\r
-               }\r
-\r
-               // TODO: This is prolly obsolete\r
-               protected virtual void RaisePostBackEvent (string eventArgument)\r
-               {\r
-                       int i = eventArgument.IndexOf ('$');\r
-                       CommandEventArgs arg;\r
-                       if (i != -1)\r
-                               arg = new CommandEventArgs (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));\r
-                       else\r
-                               arg = new CommandEventArgs (eventArgument, null);\r
-                       ProcessCommand (new DetailsViewCommandEventArgs (this, arg));\r
-               }\r
-               \r
-               void ProcessEvent (string eventName, string param)\r
-               {\r
-                       switch (eventName)\r
-                       {\r
-                       case DataControlCommands.PageCommandName:\r
-                               int newIndex = -1;\r
-                               switch (param) {\r
-                               case DataControlCommands.FirstPageCommandArgument:\r
-                                       newIndex = 0;\r
-                                       break;\r
-                               case DataControlCommands.LastPageCommandArgument:\r
-                                       newIndex = PageCount - 1;\r
-                                       break;\r
-                               case DataControlCommands.NextPageCommandArgument:\r
-                                       newIndex = PageIndex + 1;\r
-                                       break;\r
-                               case DataControlCommands.PreviousPageCommandArgument:\r
-                                       newIndex = PageIndex - 1;\r
-                                       break;\r
-                               default:\r
-                                       int paramIndex = 0;\r
-                                       int.TryParse (param, out paramIndex);\r
-                                       newIndex = paramIndex - 1;\r
-                                       break;\r
-                               }\r
-                               ShowPage (newIndex);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.FirstPageCommandArgument:\r
-                               ShowPage (0);\r
-                               break;\r
-\r
-                       case DataControlCommands.LastPageCommandArgument:\r
-                               ShowPage (PageCount - 1);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.NextPageCommandArgument:\r
-                               if (PageIndex < PageCount - 1)\r
-                                       ShowPage (PageIndex + 1);\r
-                               break;\r
-\r
-                       case DataControlCommands.PreviousPageCommandArgument:\r
-                               if (PageIndex > 0)\r
-                                       ShowPage (PageIndex - 1);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.EditCommandName:\r
-                               ProcessChangeMode (DetailsViewMode.Edit);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.NewCommandName:\r
-                               ProcessChangeMode (DetailsViewMode.Insert);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.UpdateCommandName:\r
-                               UpdateItem (param, true);\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.CancelCommandName:\r
-                               CancelEdit ();\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.DeleteCommandName:\r
-                               DeleteItem ();\r
-                               break;\r
-                                       \r
-                       case DataControlCommands.InsertCommandName:\r
-                               InsertItem (true);\r
-                               break;\r
-                       }\r
-               }\r
-               \r
-               void ShowPage (int newIndex)\r
-               {\r
-                       DetailsViewPageEventArgs args = new DetailsViewPageEventArgs (newIndex);\r
-                       OnPageIndexChanging (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-                       \r
-                       if (args.NewPageIndex < 0 || args.NewPageIndex >= PageCount)\r
-                               return;\r
-                       EndRowEdit (false);\r
-                       PageIndex = args.NewPageIndex;\r
-                       OnPageIndexChanged (EventArgs.Empty);\r
-               }\r
-               \r
-               public void ChangeMode (DetailsViewMode newMode)\r
-               {\r
-                       CurrentMode = newMode;\r
-                       RequireBinding ();\r
-               }\r
-\r
-               void ProcessChangeMode (DetailsViewMode newMode)\r
-               {\r
-                       DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (newMode, false);\r
-                       OnModeChanging (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-\r
-                       ChangeMode (args.NewMode);\r
-\r
-                       OnModeChanged (EventArgs.Empty);\r
-               }\r
-\r
-               void CancelEdit ()\r
-               {\r
-                       DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (DetailsViewMode.ReadOnly, true);\r
-                       OnModeChanging (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-\r
-                       EndRowEdit ();\r
-               }\r
-\r
-               public virtual void UpdateItem (bool causesValidation)\r
-               {\r
-                       UpdateItem (null, causesValidation);\r
-               }\r
-               \r
-               void UpdateItem (string param, bool causesValidation)\r
-               {\r
-                       if (causesValidation && Page != null)\r
-                               Page.Validate ();\r
-                       \r
-                       if (CurrentMode != DetailsViewMode.Edit) throw new HttpException ();\r
-\r
-                       currentEditOldValues = OldEditValues.Values;\r
-\r
-                       currentEditRowKeys = DataKey.Values;\r
-                       currentEditNewValues = GetRowValues (false, false);\r
-                       \r
-                       DetailsViewUpdateEventArgs args = new DetailsViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);\r
-                       OnItemUpdating (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-                       \r
-                       DataSourceView view = GetData ();\r
-                       if (view == null)\r
-                               throw new HttpException ("The DataSourceView associated to data bound control was null");\r
-                       view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));\r
-               }\r
-\r
-               bool UpdateCallback (int recordsAffected, Exception exception)\r
-               {\r
-                       DetailsViewUpdatedEventArgs dargs = new DetailsViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);\r
-                       OnItemUpdated (dargs);\r
-\r
-                       if (!dargs.KeepInEditMode)                              \r
-                               EndRowEdit ();\r
-\r
-                       return dargs.ExceptionHandled;\r
-               }\r
-\r
-               public virtual void InsertItem (bool causesValidation)\r
-               {\r
-                       InsertItem (null, causesValidation);\r
-               }\r
-               \r
-               void InsertItem (string param, bool causesValidation)\r
-               {\r
-                       if (causesValidation && Page != null)\r
-                               Page.Validate ();\r
-                       \r
-                       if (CurrentMode != DetailsViewMode.Insert) throw new HttpException ();\r
-                       \r
-                       currentEditNewValues = GetRowValues (false, true);\r
-                       DetailsViewInsertEventArgs args = new DetailsViewInsertEventArgs (param, currentEditNewValues);\r
-                       OnItemInserting (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-\r
-                       DataSourceView view = GetData ();\r
-                       if (view == null)\r
-                               throw new HttpException ("The DataSourceView associated to data bound control was null");\r
-                       view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));\r
-               }\r
-               \r
-               bool InsertCallback (int recordsAffected, Exception exception)\r
-               {\r
-                       DetailsViewInsertedEventArgs dargs = new DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);\r
-                       OnItemInserted (dargs);\r
-\r
-                       if (!dargs.KeepInInsertMode)                            \r
-                               EndRowEdit ();\r
-\r
-                       return dargs.ExceptionHandled;\r
-               }\r
-\r
-               public virtual void DeleteItem ()\r
-               {\r
-                       currentEditRowKeys = DataKey.Values;\r
-                       currentEditNewValues = GetRowValues (true, true);\r
-                       \r
-                       DetailsViewDeleteEventArgs args = new DetailsViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);\r
-                       OnItemDeleting (args);\r
-\r
-                       if (args.Cancel || !IsBoundUsingDataSourceID)\r
-                               return;\r
-\r
-                       DataSourceView view = GetData ();\r
-                       if (view != null)\r
-                               view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));\r
-                       else {\r
-                               DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);\r
-                               OnItemDeleted (dargs);\r
-                       }\r
-                       if (PageIndex == PageCount - 1)\r
-                               PageIndex --;\r
-                       RequireBinding ();\r
-               }\r
-\r
-               bool DeleteCallback (int recordsAffected, Exception exception)\r
-               {\r
-                       DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);\r
-                       OnItemDeleted (dargs);\r
-                       return dargs.ExceptionHandled;\r
-               }\r
-               \r
-               void EndRowEdit ()\r
-               {\r
-                       EndRowEdit (true);\r
-               }\r
-\r
-               void EndRowEdit (bool switchToDefaultMode) {\r
-                       if (switchToDefaultMode)\r
-                               ChangeMode (DefaultMode);\r
-                       oldEditValues = new DataKey (new OrderedDictionary ());\r
-                       currentEditRowKeys = null;\r
-                       currentEditOldValues = null;\r
-                       currentEditNewValues = null;\r
-                       RequireBinding ();\r
-               }\r
-\r
-               protected internal override void LoadControlState (object ob)\r
-               {\r
-                       if (ob == null) return;\r
-                       object[] state = (object[]) ob;\r
-                       base.LoadControlState (state[0]);\r
-                       pageIndex = (int) state[1];\r
-                       pageCount = (int) state[2];\r
-                       CurrentMode = (DetailsViewMode) state[3];\r
-                       dataKeyNames = (string[]) state[4];\r
-                       defaultMode = (DetailsViewMode) state[5];\r
-                       if (state [6] != null)\r
-                               ((IStateManager) DataKey).LoadViewState (state [6]);\r
-                       if (state [7] != null)\r
-                               ((IStateManager) OldEditValues).LoadViewState (state [7]);\r
-               }\r
-               \r
-               protected internal override object SaveControlState ()\r
-               {\r
-                       object bstate = base.SaveControlState ();\r
-                       return new object[] {\r
-                               bstate, \r
-                               pageIndex, \r
-                               pageCount, \r
-                               CurrentMode, \r
-                               dataKeyNames, \r
-                               defaultMode,\r
-                               (key == null ? null : ((IStateManager)key).SaveViewState()),\r
-                               (oldEditValues == null ? null : ((IStateManager) oldEditValues).SaveViewState ())\r
-                                       };\r
-               }\r
-               \r
-               protected override void TrackViewState()\r
-               {\r
-                       base.TrackViewState();\r
-                       if (columns != null) ((IStateManager)columns).TrackViewState();\r
-                       if (pagerSettings != null) ((IStateManager)pagerSettings).TrackViewState();\r
-                       if (alternatingRowStyle != null) ((IStateManager)alternatingRowStyle).TrackViewState();\r
-                       if (footerStyle != null) ((IStateManager)footerStyle).TrackViewState();\r
-                       if (headerStyle != null) ((IStateManager)headerStyle).TrackViewState();\r
-                       if (pagerStyle != null) ((IStateManager)pagerStyle).TrackViewState();\r
-                       if (rowStyle != null) ((IStateManager)rowStyle).TrackViewState();\r
-                       if (editRowStyle != null) ((IStateManager)editRowStyle).TrackViewState();\r
-                       if (insertRowStyle != null) ((IStateManager)insertRowStyle).TrackViewState();\r
-                       if (emptyDataRowStyle != null) ((IStateManager)emptyDataRowStyle).TrackViewState();\r
-                       if (key != null) ((IStateManager)key).TrackViewState();\r
-                       if (autoFieldProperties != null) {\r
-                               foreach (IStateManager sm in autoFieldProperties)\r
-                                       sm.TrackViewState ();\r
-                       }\r
-                       if (ControlStyleCreated)\r
-                               ControlStyle.TrackViewState ();\r
-               }\r
-\r
-               protected override object SaveViewState()\r
-               {\r
-                       object[] states = new object [13];\r
-                       states[0] = base.SaveViewState();\r
-                       states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());\r
-                       states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());\r
-                       states[3] = (alternatingRowStyle == null ? null : ((IStateManager)alternatingRowStyle).SaveViewState());\r
-                       states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());\r
-                       states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());\r
-                       states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());\r
-                       states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());\r
-                       states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());\r
-                       states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());\r
-                       states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());\r
-                       \r
-                       if (autoFieldProperties != null) {\r
-                               object[] data = new object [autoFieldProperties.Length];\r
-                               bool allNull = true;\r
-                               for (int n=0; n<data.Length; n++) {\r
-                                       data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();\r
-                                       if (data [n] != null) allNull = false;\r
-                               }\r
-                               if (!allNull) states [11] = data;\r
-                       }\r
-                       if (ControlStyleCreated)\r
-                               states [12] = ControlStyle.SaveViewState ();\r
-\r
-                       for (int i = states.Length - 1; i >= 0; i--) {\r
-                               if (states [i] != null)\r
-                                       return states;\r
-                       }\r
-\r
-                       return null;\r
-               }\r
-\r
-               protected override void LoadViewState (object savedState)\r
-               {\r
-                       if (savedState == null) {\r
-                               base.LoadViewState (null);\r
-                               return;\r
-                       }\r
-\r
-                       object [] states = (object []) savedState;\r
-                       \r
-                       if (states[11] != null) {\r
-                               object[] data = (object[]) states [11];\r
-                               autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];\r
-                               for (int n=0; n<data.Length; n++) {\r
-                                       IStateManager p = new AutoGeneratedFieldProperties ();\r
-                                       p.TrackViewState ();\r
-                                       p.LoadViewState (data [n]);\r
-                                       autoFieldProperties [n] = (AutoGeneratedFieldProperties) p;\r
-                               }\r
-                       }\r
-\r
-                       base.LoadViewState (states[0]);\r
-                       \r
-                       if (states[1] != null) ((IStateManager)Fields).LoadViewState (states[1]);\r
-                       if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);\r
-                       if (states[3] != null) ((IStateManager)AlternatingRowStyle).LoadViewState (states[3]);\r
-                       if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);\r
-                       if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);\r
-                       if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);\r
-                       if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);\r
-                       if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);\r
-                       if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);\r
-                       if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);\r
-                       if (states [12] != null)\r
-                               ControlStyle.LoadViewState (states [12]);\r
-               }\r
-               \r
-               void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)\r
-               {\r
-                       RaiseCallbackEvent (eventArgs);\r
-               }\r
-               \r
-               protected virtual void RaiseCallbackEvent (string eventArgs)\r
-               {\r
-                       string[] clientData = eventArgs.Split ('|');\r
-                       PageIndex = int.Parse (clientData[0]);\r
-                       \r
-                       RaisePostBackEvent (clientData[1]);\r
-                       DataBind ();\r
-               }\r
-\r
-               string ICallbackEventHandler.GetCallbackResult ()\r
-               {\r
-                       return GetCallbackResult ();\r
-               }\r
-\r
-               protected virtual string GetCallbackResult ()\r
-               {\r
-                       PrepareControlHierarchy ();\r
-\r
-                       StringWriter sw = new StringWriter ();\r
-                       sw.Write (PageIndex.ToString () + '|');\r
-\r
-                       HtmlTextWriter writer = new HtmlTextWriter (sw);\r
-                       RenderGrid (writer);\r
-                       return sw.ToString ();\r
-               }\r
-\r
-               protected virtual string GetCallbackScript (IButtonControl buttonControl, string argument)\r
-               {\r
-                       if (EnablePagingCallbacks)\r
-                               return "javascript:DetailsView_ClientEvent (\"" + ClientID + "\",\"" + buttonControl.CommandName + "$" + buttonControl.CommandArgument + "\"); return false;";\r
-                       else\r
-                               return null;\r
-               }\r
-               \r
-               string ICallbackContainer.GetCallbackScript (IButtonControl control, string argument)\r
-               {\r
-                       return GetCallbackScript (control, argument);\r
-               }\r
-\r
-               protected override void OnPagePreLoad (object sender, EventArgs e)\r
-               {\r
-                       base.OnPagePreLoad (sender, e);\r
-\r
-                       if (Page.IsPostBack && EnablePagingCallbacks) {\r
-                               int page;\r
-                               if (int.TryParse (Page.Request.Form [ClientID + "_Page"], out page))\r
-                                       PageIndex = page;\r
-                       }\r
-               }\r
-               \r
-               protected internal override void OnPreRender (EventArgs e)\r
-               {\r
-                       base.OnPreRender (e);\r
-                       \r
-                       if (EnablePagingCallbacks)\r
-                       {\r
-                               if (!Page.ClientScript.IsClientScriptIncludeRegistered (typeof(DetailsView), "DetailsView.js")) {\r
-                                       string url = Page.ClientScript.GetWebResourceUrl (typeof(DetailsView), "DetailsView.js");\r
-                                       Page.ClientScript.RegisterClientScriptInclude (typeof(DetailsView), "DetailsView.js", url);\r
-                               }\r
-                               Page.ClientScript.RegisterHiddenField (ClientID + "_Page", PageIndex.ToString ());\r
-                               \r
-                               string cgrid = ClientID + "_data";\r
-                               string script = string.Format ("var {0} = new Object ();\n", cgrid);\r
-                               script += string.Format ("{0}.pageIndex = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (PageIndex));\r
-                               script += string.Format ("{0}.uid = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (UniqueID));\r
-                               Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);\r
-                               \r
-                               // Make sure the basic script infrastructure is rendered\r
-                               Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");\r
-                               Page.ClientScript.GetPostBackClientHyperlink (this, "");\r
-                       }\r
-               }\r
-               \r
-               protected internal override void Render (HtmlTextWriter writer)\r
-               {\r
-                       PrepareControlHierarchy ();\r
-\r
-                       if (EnablePagingCallbacks)\r
-                               writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID + "_div");\r
-                       writer.RenderBeginTag (HtmlTextWriterTag.Div);\r
-\r
-                       RenderGrid (writer);\r
-\r
-                       writer.RenderEndTag ();\r
-               }\r
-               \r
-               void RenderGrid (HtmlTextWriter writer)\r
-               {\r
-                       if (table == null)\r
-                               return;\r
-\r
-                       table.Render (writer);\r
-               }\r
-\r
-               PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)\r
-               {\r
-                       if (control == null)\r
-                               throw new ArgumentNullException ("control");\r
-\r
-                       if (control.CausesValidation)\r
-                               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
-\r
-                       PostBackOptions options = new PostBackOptions (this);\r
-                       options.Argument = control.CommandName + "$" + control.CommandArgument;\r
-                       options.RequiresJavaScriptProtocol = true;\r
-\r
-                       return options;\r
-               }\r
-       }\r
-}\r
-\r
-#endif\r
+//
+// System.Web.UI.WebControls.DetailsView.cs
+//
+// Authors:
+//     Lluis Sanchez Gual (lluis@novell.com)
+//
+// (C) 2005-2010 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.Web.UI;
+using System.Security.Permissions;
+using System.Text;
+using System.IO;
+using System.Reflection;
+
+namespace System.Web.UI.WebControls
+{
+       [SupportsEventValidation]
+       [ToolboxDataAttribute ("<{0}:DetailsView runat=\"server\" Width=\"125px\" Height=\"50px\"></{0}:DetailsView>")]
+       [DesignerAttribute ("System.Web.UI.Design.WebControls.DetailsViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+       [ControlValuePropertyAttribute ("SelectedValue")]
+       [DefaultEventAttribute ("PageIndexChanging")]
+       [DataKeyProperty ("DataKey")]
+       [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       public class DetailsView: CompositeDataBoundControl, ICallbackEventHandler, ICallbackContainer, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer
+               , IDataBoundItemControl, IDataBoundControl, IFieldControl
+       {
+               object dataItem;
+               
+               Table table;
+               DetailsViewRowCollection rows;
+               DetailsViewRow headerRow;
+               DetailsViewRow footerRow;
+               DetailsViewRow bottomPagerRow;
+               DetailsViewRow topPagerRow;
+               
+               IOrderedDictionary currentEditRowKeys;
+               IOrderedDictionary currentEditNewValues;
+               IOrderedDictionary currentEditOldValues;
+               
+               ITemplate pagerTemplate;
+               ITemplate emptyDataTemplate;
+               ITemplate headerTemplate;
+               ITemplate footerTemplate;
+               
+               PropertyDescriptor[] cachedKeyProperties;
+               readonly string[] emptyKeys = new string[0];
+               readonly string unhandledEventExceptionMessage = "The DetailsView '{0}' fired event {1} which wasn't handled.";
+               
+               // View state
+               DataControlFieldCollection columns;
+               PagerSettings pagerSettings;
+               
+               TableItemStyle alternatingRowStyle;
+               TableItemStyle editRowStyle;
+               TableItemStyle insertRowStyle;
+               TableItemStyle emptyDataRowStyle;
+               TableItemStyle footerStyle;
+               TableItemStyle headerStyle;
+               TableItemStyle pagerStyle;
+               TableItemStyle rowStyle;
+               TableItemStyle commandRowStyle;
+               TableItemStyle fieldHeaderStyle;
+               
+               IOrderedDictionary _keyTable;
+               DataKey key;
+               DataKey oldEditValues;
+               AutoGeneratedFieldProperties[] autoFieldProperties;
+               
+               static readonly object PageIndexChangedEvent = new object();
+               static readonly object PageIndexChangingEvent = new object();
+               static readonly object ItemCommandEvent = new object();
+               static readonly object ItemCreatedEvent = new object();
+               static readonly object ItemDeletedEvent = new object();
+               static readonly object ItemDeletingEvent = new object();
+               static readonly object ItemInsertedEvent = new object();
+               static readonly object ItemInsertingEvent = new object();
+               static readonly object ModeChangingEvent = new object();
+               static readonly object ModeChangedEvent = new object();
+               static readonly object ItemUpdatedEvent = new object();
+               static readonly object ItemUpdatingEvent = new object();
+               
+               // Control state
+               int pageIndex;
+               DetailsViewMode currentMode = DetailsViewMode.ReadOnly; 
+               bool hasCurrentMode;
+               int pageCount;
+               
+               public DetailsView ()
+               {
+                       rows = new DetailsViewRowCollection (new ArrayList ());
+               }
+               
+               public event EventHandler PageIndexChanged {
+                       add { Events.AddHandler (PageIndexChangedEvent, value); }
+                       remove { Events.RemoveHandler (PageIndexChangedEvent, value); }
+               }
+               
+               public event DetailsViewPageEventHandler PageIndexChanging {
+                       add { Events.AddHandler (PageIndexChangingEvent, value); }
+                       remove { Events.RemoveHandler (PageIndexChangingEvent, value); }
+               }
+               
+               public event DetailsViewCommandEventHandler ItemCommand {
+                       add { Events.AddHandler (ItemCommandEvent, value); }
+                       remove { Events.RemoveHandler (ItemCommandEvent, value); }
+               }
+               
+               public event EventHandler ItemCreated {
+                       add { Events.AddHandler (ItemCreatedEvent, value); }
+                       remove { Events.RemoveHandler (ItemCreatedEvent, value); }
+               }
+               
+               public event DetailsViewDeletedEventHandler ItemDeleted {
+                       add { Events.AddHandler (ItemDeletedEvent, value); }
+                       remove { Events.RemoveHandler (ItemDeletedEvent, value); }
+               }
+               
+               public event DetailsViewDeleteEventHandler ItemDeleting {
+                       add { Events.AddHandler (ItemDeletingEvent, value); }
+                       remove { Events.RemoveHandler (ItemDeletingEvent, value); }
+               }
+               
+               public event DetailsViewInsertedEventHandler ItemInserted {
+                       add { Events.AddHandler (ItemInsertedEvent, value); }
+                       remove { Events.RemoveHandler (ItemInsertedEvent, value); }
+               }
+               
+               public event DetailsViewInsertEventHandler ItemInserting {
+                       add { Events.AddHandler (ItemInsertingEvent, value); }
+                       remove { Events.RemoveHandler (ItemInsertingEvent, value); }
+               }
+               
+               public event DetailsViewModeEventHandler ModeChanging {
+                       add { Events.AddHandler (ModeChangingEvent, value); }
+                       remove { Events.RemoveHandler (ModeChangingEvent, value); }
+               }
+               
+               public event EventHandler ModeChanged {
+                       add { Events.AddHandler (ModeChangedEvent, value); }
+                       remove { Events.RemoveHandler (ModeChangedEvent, value); }
+               }
+               
+               public event DetailsViewUpdatedEventHandler ItemUpdated {
+                       add { Events.AddHandler (ItemUpdatedEvent, value); }
+                       remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
+               }
+               
+               public event DetailsViewUpdateEventHandler ItemUpdating {
+                       add { Events.AddHandler (ItemUpdatingEvent, value); }
+                       remove { Events.RemoveHandler (ItemUpdatingEvent, value); }
+               }
+               
+               protected virtual void OnPageIndexChanged (EventArgs e)
+               {
+                       if (Events != null) {
+                               EventHandler eh = (EventHandler) Events [PageIndexChangedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnPageIndexChanging (DetailsViewPageEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewPageEventHandler eh = (DetailsViewPageEventHandler) Events [PageIndexChangingEvent];
+                               if (eh != null) {
+                                       eh (this, e);
+                                       return;
+                               }
+                       }
+                       if (!IsBoundUsingDataSourceID)
+                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "PageIndexChanging"));
+               }
+               
+               protected virtual void OnItemCommand (DetailsViewCommandEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewCommandEventHandler eh = (DetailsViewCommandEventHandler) Events [ItemCommandEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemCreated (EventArgs e)
+               {
+                       if (Events != null) {
+                               EventHandler eh = (EventHandler) Events [ItemCreatedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemDeleted (DetailsViewDeletedEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewDeletedEventHandler eh = (DetailsViewDeletedEventHandler) Events [ItemDeletedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemInserted (DetailsViewInsertedEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewInsertedEventHandler eh = (DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemInserting (DetailsViewInsertEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewInsertEventHandler eh = (DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
+                               if (eh != null) {
+                                       eh (this, e);
+                                       return;
+                               }
+                       }
+                       if (!IsBoundUsingDataSourceID)
+                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemInserting"));
+               }
+               
+               protected virtual void OnItemDeleting (DetailsViewDeleteEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewDeleteEventHandler eh = (DetailsViewDeleteEventHandler) Events [ItemDeletingEvent];
+                               if (eh != null) {
+                                       eh (this, e);
+                                       return;
+                               }
+                       }
+                       if (!IsBoundUsingDataSourceID)
+                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemDeleting"));
+               }
+               
+               protected virtual void OnModeChanged (EventArgs e)
+               {
+                       if (Events != null) {
+                               EventHandler eh = (EventHandler) Events [ModeChangedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnModeChanging (DetailsViewModeEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewModeEventHandler eh = (DetailsViewModeEventHandler) Events [ModeChangingEvent];
+                               if (eh != null) {
+                                       eh (this, e);
+                                       return;
+                               }
+                       }
+                       if (!IsBoundUsingDataSourceID)
+                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ModeChanging"));
+               }
+               
+               protected virtual void OnItemUpdated (DetailsViewUpdatedEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewUpdatedEventHandler eh = (DetailsViewUpdatedEventHandler) Events [ItemUpdatedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemUpdating (DetailsViewUpdateEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewUpdateEventHandler eh = (DetailsViewUpdateEventHandler) Events [ItemUpdatingEvent];
+                               if (eh != null) {
+                                       eh (this, e);
+                                       return;
+                               }
+                       }
+                       if (!IsBoundUsingDataSourceID)
+                               throw new HttpException (String.Format (unhandledEventExceptionMessage, ID, "ItemUpdating"));
+               }
+               
+               DataBoundControlMode IDataBoundItemControl.Mode {
+                       get {
+                               switch (CurrentMode) {
+                                       case DetailsViewMode.ReadOnly:
+                                               return DataBoundControlMode.ReadOnly;
+
+                                       case DetailsViewMode.Edit:
+                                               return DataBoundControlMode.Edit;
+
+                                       case DetailsViewMode.Insert:
+                                               return DataBoundControlMode.Insert;
+
+                                       default:
+                                               throw new InvalidOperationException (String.Format ("Unsupported CurrentMode value '{0}'", CurrentMode));
+                               }
+                       }
+               }
+
+               IDataSource IDataBoundControl.DataSourceObject {
+                       get { return base.DataSourceObject; }
+               }
+
+               IAutoFieldGenerator IFieldControl.FieldsGenerator {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+                       
+                       set {
+                               throw new NotImplementedException ();
+                       }
+               }
+               [WebCategoryAttribute ("Paging")]
+               [DefaultValueAttribute (false)]
+               public virtual bool AllowPaging {
+                       get {
+                               object ob = ViewState ["AllowPaging"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["AllowPaging"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               [DefaultValueAttribute (null)]
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle AlternatingRowStyle {
+                       get {
+                               if (alternatingRowStyle == null) {
+                                       alternatingRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               alternatingRowStyle.TrackViewState();
+                               }
+                               return alternatingRowStyle;
+                       }
+               }
+
+               [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (false)]
+               public virtual bool AutoGenerateEditButton {
+                       get {
+                               object ob = ViewState ["AutoGenerateEditButton"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["AutoGenerateEditButton"] = value;
+                               RequireBinding ();
+                       }
+               }
+
+               [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (false)]
+               public virtual bool AutoGenerateDeleteButton {
+                       get {
+                               object ob = ViewState ["AutoGenerateDeleteButton"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["AutoGenerateDeleteButton"] = value;
+                               RequireBinding ();
+                       }
+               }
+
+               [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (false)]
+               public virtual bool AutoGenerateInsertButton {
+                       get {
+                               object ob = ViewState ["AutoGenerateInsertButton"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["AutoGenerateInsertButton"] = value;
+                               RequireBinding ();
+                       }
+               }
+
+               [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (true)]
+               public virtual bool AutoGenerateRows {
+                       get {
+                               object ob = ViewState ["AutoGenerateRows"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return true;
+                       }
+                       set {
+                               ViewState ["AutoGenerateRows"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               [UrlPropertyAttribute]
+               [WebCategoryAttribute ("Appearance")]
+               [DefaultValueAttribute ("")]
+               [EditorAttribute ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
+               public virtual string BackImageUrl {
+                       get {
+                               if (ControlStyleCreated)
+                                       return ((TableStyle) ControlStyle).BackImageUrl;
+                               return String.Empty;
+                       }
+                       set {
+                               ((TableStyle) ControlStyle).BackImageUrl = value;
+                       }
+               }
+
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual DetailsViewRow BottomPagerRow {
+                       get {
+                               EnsureChildControls ();
+                               return bottomPagerRow;
+                       }
+               }
+       
+               [WebCategoryAttribute ("Accessibility")]
+               [DefaultValueAttribute ("")]
+               [LocalizableAttribute (true)]
+               public virtual string Caption {
+                       get {
+                               object ob = ViewState ["Caption"];
+                               if (ob != null)
+                                       return (string) ob;
+                               return String.Empty;
+                       }
+                       set {
+                               ViewState ["Caption"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               [WebCategoryAttribute ("Accessibility")]
+               [DefaultValueAttribute (TableCaptionAlign.NotSet)]
+               public virtual TableCaptionAlign CaptionAlign {
+                       get {
+                               object o = ViewState ["CaptionAlign"];
+                               if(o != null)
+                                       return (TableCaptionAlign) o;
+                               return TableCaptionAlign.NotSet;
+                       }
+                       set {
+                               ViewState ["CaptionAlign"] = value;
+                               RequireBinding ();
+                       }
+               }
+
+               [WebCategoryAttribute ("Layout")]
+               [DefaultValueAttribute (-1)]
+               public virtual int CellPadding {
+                       get {
+                               if (ControlStyleCreated)
+                                       return ((TableStyle) ControlStyle).CellPadding;
+                               return -1;
+                       }
+                       set { ((TableStyle) ControlStyle).CellPadding = value; }
+               }
+
+               [WebCategoryAttribute ("Layout")]
+               [DefaultValueAttribute (0)]
+               public virtual int CellSpacing {
+                       get {
+                               if (ControlStyleCreated)
+                                       return ((TableStyle) ControlStyle).CellSpacing;
+                               return 0;
+                       }
+                       set { ((TableStyle) ControlStyle).CellSpacing = value; }
+               }
+               
+               [DefaultValueAttribute (null)]
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle CommandRowStyle {
+                       get {
+                               if (commandRowStyle == null) {
+                                       commandRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               commandRowStyle.TrackViewState();
+                               }
+                               return commandRowStyle;
+                       }
+               }
+
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public DetailsViewMode CurrentMode {
+                       get { return hasCurrentMode ? currentMode : DefaultMode; }
+
+                       private set {
+                               hasCurrentMode = true;
+                               currentMode = value;
+                       }
+               }
+
+               DetailsViewMode defaultMode = DetailsViewMode.ReadOnly;
+               [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
+               [WebCategoryAttribute ("Behavior")]
+               public virtual DetailsViewMode DefaultMode {
+                       get { return defaultMode; }
+                       set {
+                               defaultMode = value;
+                               RequireBinding ();
+                       }
+               }
+       
+               [EditorAttribute ("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
+               [MergablePropertyAttribute (false)]
+               [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
+               [DefaultValueAttribute (null)]
+               [WebCategoryAttribute ("Misc")]
+               public virtual DataControlFieldCollection Fields {
+                       get {
+                               if (columns == null) {
+                                       columns = new DataControlFieldCollection ();
+                                       columns.FieldsChanged += new EventHandler (OnFieldsChanged);
+                                       if (IsTrackingViewState)
+                                               ((IStateManager)columns).TrackViewState ();
+                               }
+                               return columns;
+                       }
+               }
+
+               string[] dataKeyNames = null;
+
+               [DefaultValueAttribute (null)]
+               [WebCategoryAttribute ("Data")]
+               [TypeConverter (typeof(StringArrayConverter))]
+               [EditorAttribute ("System.Web.UI.Design.WebControls.DataFieldEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
+               public virtual string[] DataKeyNames {
+                       get {
+                               if (dataKeyNames == null)
+                                       return emptyKeys;
+                               else
+                                       return dataKeyNames;
+                       }
+                       set {
+                               dataKeyNames = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               IOrderedDictionary KeyTable {
+                       get {
+                               if (_keyTable == null)
+                                       _keyTable = new OrderedDictionary (DataKeyNames.Length);
+                               return _keyTable;
+                       }
+               }
+
+               [BrowsableAttribute (false)]
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               public virtual DataKey DataKey {
+                       get {
+                               if (key == null)
+                                       key = new DataKey (KeyTable);
+                               return key;
+                       }
+               }
+
+               DataKey OldEditValues {
+                       get {
+                               if (oldEditValues == null)
+                                       oldEditValues = new DataKey (new OrderedDictionary ());
+                               return oldEditValues;
+                       }
+               }
+
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [DefaultValueAttribute (null)]
+               public TableItemStyle EditRowStyle {
+                       get {
+                               if (editRowStyle == null) {
+                                       editRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               editRowStyle.TrackViewState();
+                               }
+                               return editRowStyle;
+                       }
+               }
+               
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [DefaultValueAttribute (null)]
+               public TableItemStyle EmptyDataRowStyle {
+                       get {
+                               if (emptyDataRowStyle == null) {
+                                       emptyDataRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               emptyDataRowStyle.TrackViewState();
+                               }
+                               return emptyDataRowStyle;
+                       }
+               }
+               
+               [DefaultValue (null)]
+               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [Browsable (false)]
+               public virtual ITemplate EmptyDataTemplate {
+                       get { return emptyDataTemplate; }
+                       set { emptyDataTemplate = value; }
+               }
+               
+               [LocalizableAttribute (true)]
+               [WebCategoryAttribute ("Appearance")]
+               [DefaultValueAttribute ("")]
+               public virtual string EmptyDataText {
+                       get {
+                               object ob = ViewState ["EmptyDataText"];
+                               if (ob != null)
+                                       return (string) ob;
+                               return String.Empty;
+                       }
+                       set {
+                               ViewState ["EmptyDataText"] = value;
+                               RequireBinding ();
+                       }
+               }
+       
+               [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (false)]
+               public virtual bool EnablePagingCallbacks {
+                       get {
+                               object ob = ViewState ["EnablePagingCallbacks"];
+                               if (ob != null)
+                                       return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["EnablePagingCallbacks"] = value;
+                               RequireBinding ();
+                       }
+               }
+       
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle FieldHeaderStyle {
+                       get {
+                               if (fieldHeaderStyle == null) {
+                                       fieldHeaderStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               fieldHeaderStyle.TrackViewState();
+                               }
+                               return fieldHeaderStyle;
+                       }
+               }
+               
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual DetailsViewRow FooterRow {
+                       get {
+                               EnsureChildControls ();
+                               return footerRow;
+                       }
+               }
+       
+               [DefaultValue (null)]
+               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [Browsable (false)]
+               public virtual ITemplate FooterTemplate {
+                       get { return footerTemplate; }
+                       set { footerTemplate = value; }
+               }
+
+               [LocalizableAttribute (true)]
+               [WebCategoryAttribute ("Appearance")]
+               [DefaultValueAttribute ("")]
+               public virtual string FooterText {
+                       get {
+                               object ob = ViewState ["FooterText"];
+                               if (ob != null)
+                                       return (string) ob;
+                               return String.Empty;
+                       }
+                       set {
+                               ViewState ["FooterText"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle FooterStyle {
+                       get {
+                               if (footerStyle == null) {
+                                       footerStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               footerStyle.TrackViewState();
+                               }
+                               return footerStyle;
+                       }
+               }
+               
+               [WebCategoryAttribute ("Appearance")]
+               [DefaultValueAttribute (GridLines.Both)]
+               public virtual GridLines GridLines {
+                       get {
+                               if (ControlStyleCreated)
+                                       return ((TableStyle) ControlStyle).GridLines;
+                               return GridLines.Both;
+                       }
+                       set { ((TableStyle) ControlStyle).GridLines = value; }
+               }
+
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual DetailsViewRow HeaderRow {
+                       get {
+                               EnsureChildControls ();
+                               return headerRow;
+                       }
+               }
+       
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle HeaderStyle {
+                       get {
+                               if (headerStyle == null) {
+                                       headerStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               headerStyle.TrackViewState();
+                               }
+                               return headerStyle;
+                       }
+               }
+               
+               [DefaultValue (null)]
+               [TemplateContainer (typeof(DetailsView), BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [Browsable (false)]
+               public virtual ITemplate HeaderTemplate {
+                       get { return headerTemplate; }
+                       set { headerTemplate = value; }
+               }
+
+               [LocalizableAttribute (true)]
+               [WebCategoryAttribute ("Appearance")]
+               [DefaultValueAttribute ("")]
+               public virtual string HeaderText {
+                       get {
+                               object ob = ViewState ["HeaderText"];
+                               if (ob != null)
+                                       return (string) ob;
+                               return String.Empty;
+                       }
+                       set {
+                               ViewState ["HeaderText"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
+               [Category ("Layout")]
+               [DefaultValueAttribute (HorizontalAlign.NotSet)]
+               public virtual HorizontalAlign HorizontalAlign {
+                       get {
+                               if (ControlStyleCreated)
+                                       return ((TableStyle) ControlStyle).HorizontalAlign;
+                               return HorizontalAlign.NotSet;
+                       }
+                       set { ((TableStyle) ControlStyle).HorizontalAlign = value; }
+               }
+
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [DefaultValueAttribute (null)]
+               public TableItemStyle InsertRowStyle {
+                       get {
+                               if (insertRowStyle == null) {
+                                       insertRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               insertRowStyle.TrackViewState();
+                               }
+                               return insertRowStyle;
+                       }
+               }
+               
+               [BrowsableAttribute (false)]
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               public virtual int PageCount {
+                       get { return pageCount; }
+                       private set { pageCount = value; }
+               }
+
+               [WebCategoryAttribute ("Paging")]
+               [BindableAttribute (true, BindingDirection.OneWay)]
+               [DefaultValueAttribute (0)]
+               public virtual int PageIndex {
+                       get {
+                               if (CurrentMode == DetailsViewMode.Insert)
+                                       return -1;
+                               return pageIndex;
+                       }
+                       set {
+                               if (value < -1)
+                                       throw new ArgumentOutOfRangeException ("PageIndex must be non-negative");
+                               if (pageIndex == value || value == -1)
+                                       return;
+                               pageIndex = value;
+                               RequireBinding ();
+                       }
+               }
+       
+               [WebCategoryAttribute ("Paging")]
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Content)]
+               [NotifyParentPropertyAttribute (true)]
+               [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
+               public virtual PagerSettings PagerSettings {
+                       get {
+                               if (pagerSettings == null) {
+                                       pagerSettings = new PagerSettings (this);
+                                       if (IsTrackingViewState)
+                                               ((IStateManager)pagerSettings).TrackViewState ();
+                               }
+                               return pagerSettings;
+                       }
+               }
+       
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               public TableItemStyle PagerStyle {
+                       get {
+                               if (pagerStyle == null) {
+                                       pagerStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               pagerStyle.TrackViewState();
+                               }
+                               return pagerStyle;
+                       }
+               }
+               
+               
+               [DefaultValue (null)]
+               [TemplateContainer (typeof (DetailsView), BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [Browsable (false)]
+               public virtual ITemplate PagerTemplate {
+                       get { return pagerTemplate; }
+                       set { pagerTemplate = value; }
+               }
+               
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual DetailsViewRowCollection Rows {
+                       get {
+                               EnsureChildControls ();
+                               return rows;
+                       }
+               }
+
+               [BrowsableAttribute(false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public IAutoFieldGenerator RowsGenerator {
+                       get;
+                       set;
+               }
+
+               [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
+               [DefaultValue (null)]
+               public TableItemStyle RowStyle {
+                       get {
+                               if (rowStyle == null) {
+                                       rowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               rowStyle.TrackViewState();
+                               }
+                               return rowStyle;
+                       }
+               }
+
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public object SelectedValue {
+                       get { return DataKey.Value; }
+               }
+               
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual DetailsViewRow TopPagerRow {
+                       get {
+                               EnsureChildControls ();
+                               return topPagerRow;
+                       }
+               }
+       
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual object DataItem {
+                       get {
+                               return dataItem;
+                       }
+               }
+               
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public int DataItemCount {
+                       get { return PageCount; }
+               }               
+       
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public virtual int DataItemIndex {
+                       get { return PageIndex; }
+               }               
+       
+               int IDataItemContainer.DisplayIndex {
+                       get { return PageIndex; }
+               }
+
+               int IDataItemContainer.DataItemIndex {
+                       get { return DataItemIndex; }
+               }
+
+               [MonoTODO ("Make use of it in the code")]
+               [DefaultValue (true)]
+               public virtual bool EnableModelValidation {
+                       get;
+                       set;
+               }
+
+               public virtual bool IsBindableType (Type type)
+               {
+                       return type.IsPrimitive || type == typeof (string) || type == typeof (DateTime) || type == typeof (Guid) || type == typeof (Decimal);
+               }
+               
+               protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
+               {
+                       DataSourceSelectArguments arg = new DataSourceSelectArguments ();
+                       DataSourceView view = GetData ();
+                       if (AllowPaging && view.CanPage) {
+                               arg.StartRowIndex = PageIndex;
+                               if (view.CanRetrieveTotalRowCount) {
+                                       arg.RetrieveTotalRowCount = true;
+                                       arg.MaximumRows = 1;
+                               } else
+                                       arg.MaximumRows = -1;
+                       }
+                       return arg;
+               }
+               
+               protected virtual ICollection CreateFieldSet (object dataItem, bool useDataSource)
+               {
+                       bool autoGenerate = AutoGenerateRows;
+                       
+                       if (autoGenerate) {
+                               IAutoFieldGenerator fieldGenerator = RowsGenerator;
+                               if (fieldGenerator != null)
+                                       return fieldGenerator.GenerateFields (this);
+                       }
+                       
+                       ArrayList fields = new ArrayList ();
+                       
+                       if (AutoGenerateRows) {
+                               if (useDataSource) {
+                                       if (dataItem != null)
+                                               fields.AddRange (CreateAutoGeneratedRows (dataItem));
+                               } else {
+                                       if (autoFieldProperties != null) {
+                                               foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
+                                                       fields.Add (CreateAutoGeneratedRow (props));
+                                       }
+                               }
+                       }
+                       
+                       fields.AddRange (Fields);
+                       
+                       if (AutoGenerateEditButton || AutoGenerateDeleteButton || AutoGenerateInsertButton) {
+                               CommandField field = new CommandField ();
+                               field.ShowEditButton = AutoGenerateEditButton;
+                               field.ShowDeleteButton = AutoGenerateDeleteButton;
+                               field.ShowInsertButton = AutoGenerateInsertButton;
+                               fields.Add (field);
+                       }
+                       
+                       return fields;
+               }
+               
+               protected virtual ICollection CreateAutoGeneratedRows (object dataItem)
+               {
+                       if (dataItem == null)
+                               return null;
+
+                       ArrayList list = new ArrayList ();
+                       autoFieldProperties = CreateAutoFieldProperties (dataItem);
+                       foreach (AutoGeneratedFieldProperties props in autoFieldProperties)
+                               list.Add (CreateAutoGeneratedRow (props));
+                       return list;
+               }
+               
+               protected virtual AutoGeneratedField CreateAutoGeneratedRow (AutoGeneratedFieldProperties fieldProperties)
+               {
+                       return new AutoGeneratedField (fieldProperties);
+               }
+               
+               AutoGeneratedFieldProperties[] CreateAutoFieldProperties (object dataItem)
+               {
+                       if (IsBindableType (dataItem.GetType ())) {
+                               AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
+                               ((IStateManager) field).TrackViewState ();
+                               field.Name = "Item";
+                               field.DataField = BoundField.ThisExpression;
+                               field.Type = dataItem.GetType ();
+                               return new AutoGeneratedFieldProperties [] { field };
+                       }
+
+                       PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem, false);
+
+                       if (props != null && props.Count > 0) {
+                               ArrayList retVal = new ArrayList ();
+                               foreach (PropertyDescriptor current in props) {
+                                       if (IsBindableType (current.PropertyType)) {
+                                               AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties ();
+                                               ((IStateManager) field).TrackViewState ();
+                                               field.Name = current.Name;
+                                               field.DataField = current.Name;
+                                               for (int i = 0; i < DataKeyNames.Length; i++) {
+                                                       if (string.Compare (DataKeyNames [i], current.Name, StringComparison.InvariantCultureIgnoreCase) == 0) {
+                                                               field.IsReadOnly = true;
+                                                               break;
+                                                       }
+                                               }
+                                               field.Type = current.PropertyType;
+                                               retVal.Add (field);
+                                       }
+                               }
+                               if (retVal.Count > 0)
+                                       return (AutoGeneratedFieldProperties []) retVal.ToArray (typeof (AutoGeneratedFieldProperties));
+                       }
+                       throw new HttpException (String.Format ("DetailsView with id '{0}' did not have any properties or attributes from which to generate fields.  Ensure that your data source has content.", ID));
+               }
+               
+               protected virtual DetailsViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
+               {
+                       DetailsViewRow row;
+                       if (rowType == DataControlRowType.Pager)
+                               row = new DetailsViewPagerRow (rowIndex, rowType, rowState);
+                       else
+                               row = new DetailsViewRow (rowIndex, rowType, rowState);
+                       return row;
+               }
+               
+               void RequireBinding ()
+               {
+                       if (Initialized)
+                               RequiresDataBinding = true;
+               }
+               
+               protected virtual Table CreateTable ()
+               {
+                       return new ContainedTable (this);
+               }
+
+               protected override Style CreateControlStyle ()
+               {
+                       TableStyle style = new TableStyle ();
+                       style.GridLines = GridLines.Both;
+                       style.CellSpacing = 0;
+                       return style;
+               }
+               
+               protected override int CreateChildControls (IEnumerable dataSource, bool dataBinding)
+               {
+                       PagedDataSource pagedDataSource = new PagedDataSource ();
+                       pagedDataSource.DataSource = CurrentMode != DetailsViewMode.Insert ? dataSource : null;
+                       pagedDataSource.AllowPaging = AllowPaging;
+                       pagedDataSource.PageSize = 1;
+                       pagedDataSource.CurrentPageIndex = PageIndex;
+
+                       if (dataBinding && CurrentMode != DetailsViewMode.Insert) {
+                               DataSourceView view = GetData ();
+                               if (view != null && view.CanPage) {
+                                       pagedDataSource.AllowServerPaging = true;
+                                       if (SelectArguments.RetrieveTotalRowCount)
+                                               pagedDataSource.VirtualCount = SelectArguments.TotalRowCount;
+                               }
+                       }
+
+                       bool showPager = AllowPaging && (pagedDataSource.PageCount > 1);
+
+                       Controls.Clear ();
+                       table = CreateTable ();
+                       Controls.Add (table);
+                       headerRow = null;
+                       footerRow = null;
+                       topPagerRow = null;
+                       bottomPagerRow = null;
+                       ArrayList list = new ArrayList ();
+
+                       // Gets the current data item
+
+                       if (AllowPaging) {
+                               PageCount = pagedDataSource.DataSourceCount;
+                               if (PageIndex >= PageCount && PageCount > 0)
+                                       pageIndex = pagedDataSource.CurrentPageIndex = PageCount - 1;
+                               if (pagedDataSource.DataSource != null) {
+                                       IEnumerator e = pagedDataSource.GetEnumerator ();
+                                       if (e.MoveNext ())
+                                               dataItem = e.Current;
+                               }
+                       } else {
+                               int page = 0;
+                               object lastItem = null;
+                               if (pagedDataSource.DataSource != null) {
+                                       IEnumerator e = pagedDataSource.GetEnumerator ();
+                                       for (; e.MoveNext (); page++) {
+                                               lastItem = e.Current;
+                                               if (page == PageIndex)
+                                                       dataItem = e.Current;
+                                       }
+                               }
+                               PageCount = page;
+                               if (PageIndex >= PageCount && PageCount > 0) {
+                                       pageIndex = PageCount - 1;
+                                       dataItem = lastItem;
+                               }
+                       }
+
+                       if (PageCount == 0 && CurrentMode != DetailsViewMode.Insert) {
+                               DetailsViewRow row = CreateEmptyRow ();
+                               if (row != null) {
+                                       table.Rows.Add (row);
+                                       list.Add (row);
+                               }
+                       } else {
+                               // Creates the set of fields to show
+
+                               ICollection fieldCollection = CreateFieldSet (dataItem, dataBinding && dataItem != null);
+                               DataControlField [] fields = new DataControlField [fieldCollection.Count];
+                               fieldCollection.CopyTo (fields, 0);
+
+                               foreach (DataControlField field in fields) {
+                                       field.Initialize (false, this);
+                                       if (EnablePagingCallbacks)
+                                               field.ValidateSupportsCallback ();
+                               }
+
+                               // Main table creation
+
+                               headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
+                               DataControlFieldCell headerCell = new DataControlFieldCell (null);
+                               headerCell.ColumnSpan = 2;
+                               if (headerTemplate != null)
+                                       headerTemplate.InstantiateIn (headerCell);
+                               else if (!String.IsNullOrEmpty (HeaderText))
+                                       headerCell.Text = HeaderText;
+                               else
+                                       headerRow.Visible = false;
+                               headerRow.Cells.Add (headerCell);
+                               table.Rows.Add (headerRow);
+
+                               if (showPager && PagerSettings.Position == PagerPosition.Top ||
+                                               PagerSettings.Position == PagerPosition.TopAndBottom) {
+                                       topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
+                                       InitializePager (topPagerRow, pagedDataSource);
+                                       table.Rows.Add (topPagerRow);
+                               }
+
+                               foreach (DataControlField field in fields) {
+                                       DataControlRowState rstate = GetRowState (list.Count);
+                                       DetailsViewRow row = CreateRow (PageIndex, DataControlRowType.DataRow, rstate);
+                                       InitializeRow (row, field);
+                                       table.Rows.Add (row);
+                                       list.Add (row);
+                               }
+
+                               footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);
+                               DataControlFieldCell footerCell = new DataControlFieldCell (null);
+                               footerCell.ColumnSpan = 2;
+                               if (footerTemplate != null)
+                                       footerTemplate.InstantiateIn (footerCell);
+                               else if (!String.IsNullOrEmpty (FooterText))
+                                       footerCell.Text = FooterText;
+                               else
+                                       footerRow.Visible = false;
+                               footerRow.Cells.Add (footerCell);
+                               table.Rows.Add (footerRow);
+
+                               if (showPager && PagerSettings.Position == PagerPosition.Bottom ||
+                                               PagerSettings.Position == PagerPosition.TopAndBottom) {
+                                       bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
+                                       InitializePager (bottomPagerRow, pagedDataSource);
+                                       table.Rows.Add (bottomPagerRow);
+                               }
+                       }
+                       
+                       rows = new DetailsViewRowCollection (list);
+
+                       if (dataBinding)
+                               DataBind (false);
+                       
+                       OnItemCreated (EventArgs.Empty);
+
+                       return PageCount;
+               }
+
+               protected override void EnsureDataBound ()
+               {
+                       if (CurrentMode == DetailsViewMode.Insert) {
+                               if (RequiresDataBinding) {
+                                       OnDataBinding (EventArgs.Empty);
+                                       RequiresDataBinding = false;
+                                       InternalPerformDataBinding (null);
+                                       MarkAsDataBound ();
+                                       OnDataBound (EventArgs.Empty);
+                               }
+                       } else
+                               base.EnsureDataBound ();
+               }
+               
+               DataControlRowState GetRowState (int index)
+               {
+                       DataControlRowState rstate = (index % 2) == 0 ? DataControlRowState.Normal : DataControlRowState.Alternate;
+                       if (CurrentMode == DetailsViewMode.Edit)
+                               rstate |= DataControlRowState.Edit;
+                       else if (CurrentMode == DetailsViewMode.Insert)
+                               rstate |= DataControlRowState.Insert;
+                       return rstate;
+               }
+               
+               protected virtual void InitializePager (DetailsViewRow row, PagedDataSource pagedDataSource)
+               {
+                       TableCell cell = new TableCell ();
+                       cell.ColumnSpan = 2;
+                       
+                       if (pagerTemplate != null)
+                               pagerTemplate.InstantiateIn (cell);
+                       else
+                               cell.Controls.Add (PagerSettings.CreatePagerControl (pagedDataSource.CurrentPageIndex, pagedDataSource.PageCount));
+                       
+                       row.Cells.Add (cell);
+               }
+               
+               DetailsViewRow CreateEmptyRow ()
+               {
+                       TableCell cell = new TableCell ();
+
+                       if (emptyDataTemplate != null)
+                               emptyDataTemplate.InstantiateIn (cell);
+                       else if (!String.IsNullOrEmpty (EmptyDataText))
+                               cell.Text = EmptyDataText;
+                       else
+                               return null;
+                       
+                       DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
+                       row.Cells.Add (cell);
+                       return row;
+               }
+               
+               protected virtual void InitializeRow (DetailsViewRow row, DataControlField field)
+               {
+                       if (!field.Visible) {
+                               row.Visible = false;
+                               return;
+                       }
+                       
+                       row.ContainingField = field;
+                       DataControlFieldCell cell;
+                       
+                       if (field.ShowHeader) {
+                               cell = new DataControlFieldCell (field);
+                               row.Cells.Add (cell);
+                               field.InitializeCell (cell, DataControlCellType.Header, row.RowState, row.RowIndex);
+                       }
+                       
+                       cell = new DataControlFieldCell (field);
+                       if (!field.ShowHeader)
+                               cell.ColumnSpan = 2;
+                       row.Cells.Add (cell);
+                       field.InitializeCell (cell, DataControlCellType.DataCell, row.RowState, row.RowIndex);
+
+                       if (CurrentMode == DetailsViewMode.Insert && !field.InsertVisible)
+                               row.Visible = false;
+               }
+               
+               void FillRowDataKey (object dataItem)
+               {
+                       KeyTable.Clear ();
+
+                       if (cachedKeyProperties == null) {
+                               PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
+                               cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];
+                               for (int n=0; n<DataKeyNames.Length; n++) { 
+                                       PropertyDescriptor p = props.Find (DataKeyNames [n], true);
+                                       if (p == null)
+                                               throw new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());
+                                       cachedKeyProperties [n] = p;
+                               }
+                       }
+                       
+                       foreach (PropertyDescriptor p in cachedKeyProperties)
+                               KeyTable [p.Name] = p.GetValue (dataItem);
+               }
+               
+               IOrderedDictionary GetRowValues (bool includeReadOnlyFields, bool includePrimaryKey)
+               {
+                       OrderedDictionary dic = new OrderedDictionary ();
+                       ExtractRowValues (dic, includeReadOnlyFields, includePrimaryKey);
+                       return dic;
+               }
+               
+               protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeReadOnlyFields, bool includeKeys)
+               {
+                       foreach (DetailsViewRow row in Rows) {
+                               if (row.Cells.Count < 1)
+                                       continue;
+                               DataControlFieldCell c = row.Cells[row.Cells.Count-1] as DataControlFieldCell;
+                               if (c != null)
+                                       c.ContainingField.ExtractValuesFromCell (fieldValues, c, row.RowState, includeReadOnlyFields);
+                       }
+                       if (!includeKeys && DataKeyNames != null)
+                               foreach (string key in DataKeyNames)
+                                       fieldValues.Remove (key);
+               }
+               
+               protected override HtmlTextWriterTag TagKey {
+                       get {
+                               if (EnablePagingCallbacks)
+                                       return HtmlTextWriterTag.Div;
+                               else
+                                       return HtmlTextWriterTag.Table;
+                       }
+               }
+               
+               public sealed override void DataBind ()
+               {
+                       cachedKeyProperties = null;
+                       base.DataBind ();
+                       
+                       if (dataItem != null) {
+                               if (CurrentMode == DetailsViewMode.Edit)
+                                       oldEditValues = new DataKey (GetRowValues (false, true));
+                               FillRowDataKey (dataItem);
+                               key = new DataKey (KeyTable);
+                       }
+               }
+               
+               protected internal override void PerformDataBinding (IEnumerable data)
+               {
+                       base.PerformDataBinding (data);
+               }
+
+               protected internal virtual void PrepareControlHierarchy ()
+               {
+                       if (table == null)
+                               return;
+
+                       table.Caption = Caption;
+                       table.CaptionAlign = CaptionAlign;
+
+                       foreach (DetailsViewRow row in table.Rows) {
+                               switch (row.RowType) {
+                                       case DataControlRowType.Header:
+                                               if (headerStyle != null && !headerStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (headerStyle);
+                                               break;
+                                       case DataControlRowType.Footer:
+                                               if (footerStyle != null && !footerStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (footerStyle);
+                                               break;
+                                       case DataControlRowType.Pager:
+                                               if (pagerStyle != null && !pagerStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (pagerStyle);
+                                               break;
+                                       case DataControlRowType.EmptyDataRow:
+                                               if (emptyDataRowStyle != null && !emptyDataRowStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (emptyDataRowStyle);
+                                               break;
+                                       case DataControlRowType.DataRow:
+                                               if (rowStyle != null && !rowStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (rowStyle);
+                                               if ((row.RowState & DataControlRowState.Alternate) != 0 && alternatingRowStyle != null && !alternatingRowStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (alternatingRowStyle);
+                                               break;
+                                       default:
+                                               break;
+                               }
+
+                               if (row.ContainingField is CommandField) {
+                                       if (commandRowStyle != null && !commandRowStyle.IsEmpty)
+                                               row.ControlStyle.CopyFrom (commandRowStyle);
+                               } else {
+                                       if ((row.RowState & DataControlRowState.Edit) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)
+                                               row.ControlStyle.CopyFrom (editRowStyle);
+                                       if ((row.RowState & DataControlRowState.Insert) != 0) {
+                                               if (insertRowStyle != null && !insertRowStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (insertRowStyle);
+                                               else if (editRowStyle != null && !editRowStyle.IsEmpty)
+                                                       row.ControlStyle.CopyFrom (editRowStyle);
+                                       }
+                               }
+
+                               for (int n = 0; n < row.Cells.Count; n++) {
+                                       DataControlFieldCell fcell = row.Cells [n] as DataControlFieldCell;
+                                       if (fcell != null && fcell.ContainingField != null) {
+                                               DataControlField field = fcell.ContainingField;
+                                               if (n == 0 && field.ShowHeader) {
+                                                       if (fieldHeaderStyle != null && !fieldHeaderStyle.IsEmpty)
+                                                               fcell.ControlStyle.CopyFrom (fieldHeaderStyle);
+                                                       if (field.HeaderStyleCreated && !field.HeaderStyle.IsEmpty)
+                                                               fcell.ControlStyle.CopyFrom (field.HeaderStyle);
+                                               } else {
+                                                       if (field.ControlStyleCreated && !field.ControlStyle.IsEmpty) {
+                                                               foreach (Control c in fcell.Controls) {
+                                                                       WebControl wc = c as WebControl;
+                                                                       if (wc != null)
+                                                                               wc.ControlStyle.MergeWith (field.ControlStyle);
+                                                               }
+                                                       }
+                                                       
+                                                       if (field.ItemStyleCreated && !field.ItemStyle.IsEmpty)
+                                                               fcell.ControlStyle.CopyFrom (field.ItemStyle);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               protected internal override void OnInit (EventArgs e)
+               {
+                       Page page = Page;
+                       if (page != null)
+                               page.RegisterRequiresControlState (this);
+                       base.OnInit (e);
+               }
+               
+               void OnFieldsChanged (object sender, EventArgs args)
+               {
+                       RequireBinding ();
+               }
+               
+               protected override void OnDataSourceViewChanged (object sender, EventArgs e)
+               {
+                       base.OnDataSourceViewChanged (sender, e);
+                       RequireBinding ();
+               }
+               
+               protected override bool OnBubbleEvent (object source, EventArgs e)
+               {
+                       DetailsViewCommandEventArgs args = e as DetailsViewCommandEventArgs;
+                       if (args != null) {
+                               bool causesValidation = false;
+                               IButtonControl button = args.CommandSource as IButtonControl;
+                               if (button != null && button.CausesValidation) {
+                                       Page.Validate (button.ValidationGroup);
+                                       causesValidation = true;
+                               }
+                               ProcessCommand (args, causesValidation);
+                               return true;
+                       }
+                       return base.OnBubbleEvent (source, e);
+               }
+
+               void ProcessCommand (DetailsViewCommandEventArgs args, bool causesValidation) {
+                       OnItemCommand (args);
+                       ProcessEvent (args.CommandName, args.CommandArgument as string, causesValidation);
+               }
+
+               void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
+               {
+                       RaisePostBackEvent (eventArgument);
+               }
+
+               // TODO: This is prolly obsolete
+               protected virtual void RaisePostBackEvent (string eventArgument)
+               {
+                       ValidateEvent (UniqueID, eventArgument);
+                       int i = eventArgument.IndexOf ('$');
+                       CommandEventArgs arg;
+                       if (i != -1)
+                               arg = new CommandEventArgs (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));
+                       else
+                               arg = new CommandEventArgs (eventArgument, null);
+                       ProcessCommand (new DetailsViewCommandEventArgs (this, arg), false);
+               }
+
+               void ProcessEvent (string eventName, string param, bool causesValidation)
+               {
+                       switch (eventName) {
+                               case DataControlCommands.PageCommandName:
+                                       int newIndex = -1;
+                                       switch (param) {
+                                               case DataControlCommands.FirstPageCommandArgument:
+                                                       newIndex = 0;
+                                                       break;
+                                               case DataControlCommands.LastPageCommandArgument:
+                                                       newIndex = PageCount - 1;
+                                                       break;
+                                               case DataControlCommands.NextPageCommandArgument:
+                                                       newIndex = PageIndex + 1;
+                                                       break;
+                                               case DataControlCommands.PreviousPageCommandArgument:
+                                                       newIndex = PageIndex - 1;
+                                                       break;
+                                               default:
+                                                       int paramIndex = 0;
+                                                       int.TryParse (param, out paramIndex);
+                                                       newIndex = paramIndex - 1;
+                                                       break;
+                                       }
+                                       SetPageIndex (newIndex);
+                                       break;
+                                       
+                               case DataControlCommands.FirstPageCommandArgument:
+                                       SetPageIndex (0);
+                                       break;
+
+                               case DataControlCommands.LastPageCommandArgument:
+                                       SetPageIndex (PageCount - 1);
+                                       break;
+                                       
+                               case DataControlCommands.NextPageCommandArgument:
+                                       if (PageIndex < PageCount - 1)
+                                               SetPageIndex (PageIndex + 1);
+                                       break;
+
+                               case DataControlCommands.PreviousPageCommandArgument:
+                                       if (PageIndex > 0)
+                                               SetPageIndex (PageIndex - 1);
+                                       break;
+                                       
+                               case DataControlCommands.EditCommandName:
+                                       ProcessChangeMode (DetailsViewMode.Edit);
+                                       break;
+                                       
+                               case DataControlCommands.NewCommandName:
+                                       ProcessChangeMode (DetailsViewMode.Insert);
+                                       break;
+                                       
+                               case DataControlCommands.UpdateCommandName:
+                                       UpdateItem (param, causesValidation);
+                                       break;
+                                       
+                               case DataControlCommands.CancelCommandName:
+                                       CancelEdit ();
+                                       break;
+                                       
+                               case DataControlCommands.DeleteCommandName:
+                                       DeleteItem ();
+                                       break;
+                                       
+                               case DataControlCommands.InsertCommandName:
+                                       InsertItem (causesValidation);
+                                       break;
+                       }
+               }
+               public
+               void SetPageIndex (int index)
+               {
+                       DetailsViewPageEventArgs args = new DetailsViewPageEventArgs (index);
+                       OnPageIndexChanging (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+                       
+                       if (args.NewPageIndex < 0 || args.NewPageIndex >= PageCount)
+                               return;
+                       EndRowEdit (false);
+                       PageIndex = args.NewPageIndex;
+                       OnPageIndexChanged (EventArgs.Empty);
+               }
+               
+               public void ChangeMode (DetailsViewMode newMode)
+               {
+                       CurrentMode = newMode;
+                       RequireBinding ();
+               }
+
+               void ProcessChangeMode (DetailsViewMode newMode)
+               {
+                       DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (newMode, false);
+                       OnModeChanging (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+
+                       ChangeMode (args.NewMode);
+
+                       OnModeChanged (EventArgs.Empty);
+               }
+
+               void CancelEdit ()
+               {
+                       DetailsViewModeEventArgs args = new DetailsViewModeEventArgs (DetailsViewMode.ReadOnly, true);
+                       OnModeChanging (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+
+                       EndRowEdit ();
+               }
+
+               public virtual void UpdateItem (bool causesValidation)
+               {
+                       UpdateItem (null, causesValidation);
+               }
+               
+               void UpdateItem (string param, bool causesValidation)
+               {
+                       if (causesValidation && Page != null && !Page.IsValid)
+                               return;
+                       
+                       if (CurrentMode != DetailsViewMode.Edit)
+                               throw new HttpException ();
+
+                       currentEditOldValues = OldEditValues.Values;
+
+                       currentEditRowKeys = DataKey.Values;
+                       currentEditNewValues = GetRowValues (false, false);
+                       
+                       DetailsViewUpdateEventArgs args = new DetailsViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
+                       OnItemUpdating (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+                       
+                       DataSourceView view = GetData ();
+                       if (view == null)
+                               throw new HttpException ("The DataSourceView associated to data bound control was null");
+                       view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));
+               }
+
+               bool UpdateCallback (int recordsAffected, Exception exception)
+               {
+                       DetailsViewUpdatedEventArgs dargs = new DetailsViewUpdatedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
+                       OnItemUpdated (dargs);
+
+                       if (!dargs.KeepInEditMode)                              
+                               EndRowEdit ();
+
+                       return dargs.ExceptionHandled;
+               }
+
+               public virtual void InsertItem (bool causesValidation)
+               {
+                       InsertItem (null, causesValidation);
+               }
+               
+               void InsertItem (string param, bool causesValidation)
+               {
+                       if (causesValidation && Page != null && !Page.IsValid)
+                               return;
+                       
+                       if (CurrentMode != DetailsViewMode.Insert)
+                               throw new HttpException ();
+                       
+                       currentEditNewValues = GetRowValues (false, true);
+                       DetailsViewInsertEventArgs args = new DetailsViewInsertEventArgs (param, currentEditNewValues);
+                       OnItemInserting (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+
+                       DataSourceView view = GetData ();
+                       if (view == null)
+                               throw new HttpException ("The DataSourceView associated to data bound control was null");
+                       view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));
+               }
+               
+               bool InsertCallback (int recordsAffected, Exception exception)
+               {
+                       DetailsViewInsertedEventArgs dargs = new DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
+                       OnItemInserted (dargs);
+
+                       if (!dargs.KeepInInsertMode)                            
+                               EndRowEdit ();
+
+                       return dargs.ExceptionHandled;
+               }
+
+               public virtual void DeleteItem ()
+               {
+                       currentEditRowKeys = DataKey.Values;
+                       currentEditNewValues = GetRowValues (true, false);
+                       
+                       DetailsViewDeleteEventArgs args = new DetailsViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);
+                       OnItemDeleting (args);
+
+                       if (args.Cancel || !IsBoundUsingDataSourceID)
+                               return;
+
+                       DataSourceView view = GetData ();
+                       if (view != null)
+                               view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));
+                       else {
+                               DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);
+                               OnItemDeleted (dargs);
+                       }
+                       if (PageIndex > 0 && PageIndex == PageCount - 1)
+                               PageIndex --;
+                       RequireBinding ();
+               }
+
+               bool DeleteCallback (int recordsAffected, Exception exception)
+               {
+                       DetailsViewDeletedEventArgs dargs = new DetailsViewDeletedEventArgs (recordsAffected, exception, currentEditRowKeys, currentEditNewValues);
+                       OnItemDeleted (dargs);
+                       return dargs.ExceptionHandled;
+               }
+               
+               void EndRowEdit ()
+               {
+                       EndRowEdit (true);
+               }
+
+               void EndRowEdit (bool switchToDefaultMode)
+               {
+                       if (switchToDefaultMode)
+                               ChangeMode (DefaultMode);
+                       oldEditValues = new DataKey (new OrderedDictionary ());
+                       currentEditRowKeys = null;
+                       currentEditOldValues = null;
+                       currentEditNewValues = null;
+                       RequireBinding ();
+               }
+
+               protected internal override void LoadControlState (object savedState)
+               {
+                       if (savedState == null)
+                               return;
+                       object[] state = (object[]) savedState;
+                       base.LoadControlState (state[0]);
+                       pageIndex = (int) state[1];
+                       pageCount = (int) state[2];
+                       CurrentMode = (DetailsViewMode) state[3];
+                       dataKeyNames = (string[]) state[4];
+                       defaultMode = (DetailsViewMode) state[5];
+                       if (state [6] != null)
+                               ((IStateManager) DataKey).LoadViewState (state [6]);
+                       if (state [7] != null)
+                               ((IStateManager) OldEditValues).LoadViewState (state [7]);
+               }
+               
+               protected internal override object SaveControlState ()
+               {
+                       object bstate = base.SaveControlState ();
+                       return new object[] {
+                               bstate, 
+                               pageIndex, 
+                               pageCount, 
+                               CurrentMode, 
+                               dataKeyNames, 
+                               defaultMode,
+                               (key == null ? null : ((IStateManager)key).SaveViewState()),
+                               (oldEditValues == null ? null : ((IStateManager) oldEditValues).SaveViewState ())
+                       };
+               }
+               
+               protected override void TrackViewState()
+               {
+                       base.TrackViewState();
+                       if (columns != null)
+                               ((IStateManager)columns).TrackViewState();
+                       if (pagerSettings != null)
+                               ((IStateManager)pagerSettings).TrackViewState();
+                       if (alternatingRowStyle != null)
+                               ((IStateManager)alternatingRowStyle).TrackViewState();
+                       if (footerStyle != null)
+                               ((IStateManager)footerStyle).TrackViewState();
+                       if (headerStyle != null)
+                               ((IStateManager)headerStyle).TrackViewState();
+                       if (pagerStyle != null)
+                               ((IStateManager)pagerStyle).TrackViewState();
+                       if (rowStyle != null)
+                               ((IStateManager)rowStyle).TrackViewState();
+                       if (editRowStyle != null)
+                               ((IStateManager)editRowStyle).TrackViewState();
+                       if (insertRowStyle != null)
+                               ((IStateManager)insertRowStyle).TrackViewState();
+                       if (emptyDataRowStyle != null)
+                               ((IStateManager)emptyDataRowStyle).TrackViewState();
+                       if (key != null)
+                               ((IStateManager)key).TrackViewState();
+                       if (autoFieldProperties != null) {
+                               foreach (IStateManager sm in autoFieldProperties)
+                                       sm.TrackViewState ();
+                       }
+                       if (ControlStyleCreated)
+                               ControlStyle.TrackViewState ();
+               }
+
+               protected override object SaveViewState()
+               {
+                       object[] states = new object [13];
+                       states[0] = base.SaveViewState();
+                       states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());
+                       states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());
+                       states[3] = (alternatingRowStyle == null ? null : ((IStateManager)alternatingRowStyle).SaveViewState());
+                       states[4] = (footerStyle == null ? null : ((IStateManager)footerStyle).SaveViewState());
+                       states[5] = (headerStyle == null ? null : ((IStateManager)headerStyle).SaveViewState());
+                       states[6] = (pagerStyle == null ? null : ((IStateManager)pagerStyle).SaveViewState());
+                       states[7] = (rowStyle == null ? null : ((IStateManager)rowStyle).SaveViewState());
+                       states[8] = (insertRowStyle == null ? null : ((IStateManager)insertRowStyle).SaveViewState());
+                       states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());
+                       states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());
+                       
+                       if (autoFieldProperties != null) {
+                               object[] data = new object [autoFieldProperties.Length];
+                               bool allNull = true;
+                               for (int n=0; n<data.Length; n++) {
+                                       data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();
+                                       if (data [n] != null) allNull = false;
+                               }
+                               if (!allNull) states [11] = data;
+                       }
+                       if (ControlStyleCreated)
+                               states [12] = ControlStyle.SaveViewState ();
+
+                       for (int i = states.Length - 1; i >= 0; i--) {
+                               if (states [i] != null)
+                                       return states;
+                       }
+
+                       return null;
+               }
+
+               protected override void LoadViewState (object savedState)
+               {
+                       if (savedState == null) {
+                               base.LoadViewState (null);
+                               return;
+                       }
+
+                       object [] states = (object []) savedState;
+                       
+                       if (states[11] != null) {
+                               object[] data = (object[]) states [11];
+                               autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];
+                               for (int n=0; n<data.Length; n++) {
+                                       IStateManager p = new AutoGeneratedFieldProperties ();
+                                       p.TrackViewState ();
+                                       p.LoadViewState (data [n]);
+                                       autoFieldProperties [n] = (AutoGeneratedFieldProperties) p;
+                               }
+                       }
+
+                       base.LoadViewState (states[0]);
+                       
+                       if (states[1] != null) ((IStateManager)Fields).LoadViewState (states[1]);
+                       if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
+                       if (states[3] != null) ((IStateManager)AlternatingRowStyle).LoadViewState (states[3]);
+                       if (states[4] != null) ((IStateManager)FooterStyle).LoadViewState (states[4]);
+                       if (states[5] != null) ((IStateManager)HeaderStyle).LoadViewState (states[5]);
+                       if (states[6] != null) ((IStateManager)PagerStyle).LoadViewState (states[6]);
+                       if (states[7] != null) ((IStateManager)RowStyle).LoadViewState (states[7]);
+                       if (states[8] != null) ((IStateManager)InsertRowStyle).LoadViewState (states[8]);
+                       if (states[9] != null) ((IStateManager)EditRowStyle).LoadViewState (states[9]);
+                       if (states[10] != null) ((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
+                       if (states [12] != null)
+                               ControlStyle.LoadViewState (states [12]);
+               }
+               
+               void ICallbackEventHandler.RaiseCallbackEvent (string eventArgument)
+               {
+                       RaiseCallbackEvent (eventArgument);
+               }
+               
+               protected virtual void RaiseCallbackEvent (string eventArgument)
+               {
+                       string[] clientData = eventArgument.Split ('|');
+                       PageIndex = int.Parse (clientData[0]);
+                       
+                       RaisePostBackEvent (clientData[1]);
+                       DataBind ();
+               }
+
+               string ICallbackEventHandler.GetCallbackResult ()
+               {
+                       return GetCallbackResult ();
+               }
+
+               protected virtual string GetCallbackResult ()
+               {
+                       PrepareControlHierarchy ();
+
+                       StringWriter sw = new StringWriter ();
+                       sw.Write (PageIndex.ToString () + '|');
+
+                       HtmlTextWriter writer = new HtmlTextWriter (sw);
+                       RenderGrid (writer);
+                       return sw.ToString ();
+               }
+
+               protected virtual string GetCallbackScript (IButtonControl buttonControl, string argument)
+               {
+                       if (EnablePagingCallbacks) {
+                               Page page = Page;
+                               if (page != null)
+                                       page.ClientScript.RegisterForEventValidation (UniqueID, argument);
+                               return "javascript:DetailsView_ClientEvent (\"" + ClientID + "\",\"" + buttonControl.CommandName + "$" + buttonControl.CommandArgument + "\"); return false;";
+                       } else
+                               return null;
+               }
+               
+               string ICallbackContainer.GetCallbackScript (IButtonControl control, string argument)
+               {
+                       return GetCallbackScript (control, argument);
+               }
+
+               protected override void OnPagePreLoad (object sender, EventArgs e)
+               {
+                       base.OnPagePreLoad (sender, e);
+
+                       if (Page.IsPostBack && EnablePagingCallbacks) {
+                               int page;
+                               if (int.TryParse (Page.Request.Form [ClientID + "_Page"], out page))
+                                       PageIndex = page;
+                       }
+               }
+
+               const string onPreRenderScript = @"var {0} = new Object ();
+{0}.pageIndex = {1};
+{0}.uid = {2};
+{0}.form = {3};
+";
+               protected internal override void OnPreRender (EventArgs e)
+               {
+                       base.OnPreRender (e);
+
+                       Page page = Page;
+                       if (EnablePagingCallbacks && page != null) {
+                               ClientScriptManager scriptManager = page.ClientScript;
+                               if (!scriptManager.IsClientScriptIncludeRegistered (typeof(DetailsView), "DetailsView.js")) {
+                                       string url = scriptManager.GetWebResourceUrl (typeof(DetailsView), "DetailsView.js");
+                                       scriptManager.RegisterClientScriptInclude (typeof(DetailsView), "DetailsView.js", url);
+                               }
+                               scriptManager.RegisterHiddenField (ClientID + "_Page", PageIndex.ToString ());
+                               
+                               string cgrid = ClientID + "_data";
+                               string script = String.Format (onPreRenderScript,
+                                                              cgrid,
+                                                              ClientScriptManager.GetScriptLiteral (PageIndex),
+                                                              ClientScriptManager.GetScriptLiteral (UniqueID),
+                                                              page.theForm);
+                               
+                               scriptManager.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
+                               
+                               // Make sure the basic script infrastructure is rendered
+                               scriptManager.GetCallbackEventReference (this, "null", String.Empty, "null");
+                               scriptManager.GetPostBackClientHyperlink (this, String.Empty, true);
+                       }
+               }
+               
+               protected internal override void Render (HtmlTextWriter writer)
+               {
+                       PrepareControlHierarchy ();
+
+                       if (EnablePagingCallbacks)
+                               writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID + "_div");
+                       writer.RenderBeginTag (HtmlTextWriterTag.Div);
+
+                       RenderGrid (writer);
+
+                       writer.RenderEndTag ();
+               }
+               
+               void RenderGrid (HtmlTextWriter writer)
+               {
+                       if (table == null)
+                               return;
+
+                       table.Render (writer);
+               }
+
+               PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)
+               {
+                       if (control == null)
+                               throw new ArgumentNullException ("control");
+
+                       if (control.CausesValidation)
+                               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.");
+
+                       PostBackOptions options = new PostBackOptions (this);
+                       options.Argument = control.CommandName + "$" + control.CommandArgument;
+                       options.RequiresJavaScriptProtocol = true;
+
+                       return options;
+               }
+       }
+}