2006-10-30 Igor Zelmanovich <igorz@mainsoft.com>
authorIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Mon, 30 Oct 2006 14:19:11 +0000 (14:19 -0000)
committerIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Mon, 30 Oct 2006 14:19:11 +0000 (14:19 -0000)
* FormFiew.cs: fixed: PageIndex, rendering.

svn path=/trunk/mcs/; revision=67131

mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web/System.Web.UI.WebControls/FormView.cs
mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web/Test/System.Web.UI.WebControls/FormViewTest.cs

index 1219b3607beba850e3ac3635c2b32ce64d0a9be6..d0ea9cd7a7d1380b11100ad91f1b1844044843c8 100644 (file)
 
        * FormView.cs: fixed: IPostBackContainer.GetPostBackOptions method.
 
+2006-10-30 Igor Zelmanovich <igorz@mainsoft.com>
+
+       * FormFiew.cs: fixed: PageIndex, rendering.
+
 2006-10-30 Igor Zelmanovich <igorz@mainsoft.com>
 
        * DropDownList.cs: fixed: rendering "name" attribute".
index ed03c31207731e3c1f9c112ba85e548269ca42cc..5e45c04087cbe07de99ceef99c56c203b13b662e 100644 (file)
-//
-// System.Web.UI.WebControls.FormView.cs
-//
-// Authors:
-//     Lluis Sanchez Gual (lluis@novell.com)
-//
-// (C) 2005 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.
-//
-
-#if NET_2_0
-
-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]
-       [DesignerAttribute ("System.Web.UI.Design.WebControls.FormViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
-       [ControlValuePropertyAttribute ("SelectedValue")]
-       [DefaultEventAttribute ("PageIndexChanging")]
-       [AspNetHostingPermissionAttribute (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
-       [AspNetHostingPermissionAttribute (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
-       public class FormView: CompositeDataBoundControl, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer
-       {
-               object dataItem;
-               
-               Table table;
-               FormViewRow headerRow;
-               FormViewRow footerRow;
-               FormViewRow bottomPagerRow;
-               FormViewRow topPagerRow;
-               FormViewRow itemRow;
-               
-               IOrderedDictionary currentEditRowKeys;
-               IOrderedDictionary currentEditNewValues;
-               IOrderedDictionary currentEditOldValues;
-               
-               ITemplate pagerTemplate;
-               ITemplate emptyDataTemplate;
-               ITemplate headerTemplate;
-               ITemplate footerTemplate;
-               ITemplate editItemTemplate;
-               ITemplate insertItemTemplate;
-               ITemplate itemTemplate;
-               
-               PropertyDescriptor[] cachedKeyProperties;
-               readonly string[] emptyKeys = new string[0];
-               
-               // View state
-               PagerSettings pagerSettings;
-               
-               TableItemStyle editRowStyle;
-               TableItemStyle insertRowStyle;
-               TableItemStyle emptyDataRowStyle;
-               TableItemStyle footerStyle;
-               TableItemStyle headerStyle;
-               TableItemStyle pagerStyle;
-               TableItemStyle rowStyle;
-               
-               DataKey key;
-               DataKey oldEditValues;
-               
-               private static readonly object PageIndexChangedEvent = new object();
-               private static readonly object PageIndexChangingEvent = new object();
-               private static readonly object ItemCommandEvent = new object();
-               private static readonly object ItemCreatedEvent = new object();
-               private static readonly object ItemDeletedEvent = new object();
-               private static readonly object ItemDeletingEvent = new object();
-               private static readonly object ItemInsertedEvent = new object();
-               private static readonly object ItemInsertingEvent = new object();
-               private static readonly object ModeChangingEvent = new object();
-               private static readonly object ModeChangedEvent = new object();
-               private static readonly object ItemUpdatedEvent = new object();
-               private static readonly object ItemUpdatingEvent = new object();
-               
-               // Control state
-               int pageIndex;
-               FormViewMode currentMode = FormViewMode.ReadOnly; 
-               bool hasCurrentMode;
-               int pageCount = 0;
-               
-               public FormView ()
-               {
-                       key = new DataKey (new OrderedDictionary ());
-               }
-               
-               public event EventHandler PageIndexChanged {
-                       add { Events.AddHandler (PageIndexChangedEvent, value); }
-                       remove { Events.RemoveHandler (PageIndexChangedEvent, value); }
-               }
-               
-               public event FormViewPageEventHandler PageIndexChanging {
-                       add { Events.AddHandler (PageIndexChangingEvent, value); }
-                       remove { Events.RemoveHandler (PageIndexChangingEvent, value); }
-               }
-               
-               public event FormViewCommandEventHandler 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 FormViewDeletedEventHandler ItemDeleted {
-                       add { Events.AddHandler (ItemDeletedEvent, value); }
-                       remove { Events.RemoveHandler (ItemDeletedEvent, value); }
-               }
-               
-               public event FormViewDeleteEventHandler ItemDeleting {
-                       add { Events.AddHandler (ItemDeletingEvent, value); }
-                       remove { Events.RemoveHandler (ItemDeletingEvent, value); }
-               }
-               
-               public event FormViewInsertedEventHandler ItemInserted {
-                       add { Events.AddHandler (ItemInsertedEvent, value); }
-                       remove { Events.RemoveHandler (ItemInsertedEvent, value); }
-               }
-               
-               public event FormViewInsertEventHandler ItemInserting {
-                       add { Events.AddHandler (ItemInsertingEvent, value); }
-                       remove { Events.RemoveHandler (ItemInsertingEvent, value); }
-               }
-               
-               public event FormViewModeEventHandler 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 FormViewUpdatedEventHandler ItemUpdated {
-                       add { Events.AddHandler (ItemUpdatedEvent, value); }
-                       remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
-               }
-               
-               public event FormViewUpdateEventHandler 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 (FormViewPageEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewPageEventHandler eh = (FormViewPageEventHandler) Events [PageIndexChangingEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemCommand (FormViewCommandEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewCommandEventHandler eh = (FormViewCommandEventHandler) 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 (FormViewDeletedEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewDeletedEventHandler eh = (FormViewDeletedEventHandler) Events [ItemDeletedEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemInserted (FormViewInsertedEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewInsertedEventHandler eh = (FormViewInsertedEventHandler) Events [ItemInsertedEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemInserting (FormViewInsertEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewInsertEventHandler eh = (FormViewInsertEventHandler) Events [ItemInsertingEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemDeleting (FormViewDeleteEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewDeleteEventHandler eh = (FormViewDeleteEventHandler) Events [ItemDeletingEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnModeChanged (EventArgs e)
-               {
-                       if (Events != null) {
-                               EventHandler eh = (EventHandler) Events [ModeChangedEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnModeChanging (FormViewModeEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewModeEventHandler eh = (FormViewModeEventHandler) Events [ModeChangingEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemUpdated (FormViewUpdatedEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewUpdatedEventHandler eh = (FormViewUpdatedEventHandler) Events [ItemUpdatedEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               protected virtual void OnItemUpdating (FormViewUpdateEventArgs e)
-               {
-                       if (Events != null) {
-                               FormViewUpdateEventHandler eh = (FormViewUpdateEventHandler) Events [ItemUpdatingEvent];
-                               if (eh != null) eh (this, e);
-                       }
-               }
-               
-               
-               [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 ();
-                       }
-               }
-               
-               [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 FormViewRow BottomPagerRow {
-                       get {
-                               EnsureDataBound ();
-                               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;
-                       }
-               }
-               
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               [BrowsableAttribute (false)]
-               public FormViewMode CurrentMode {
-                       get {
-                               return hasCurrentMode ? currentMode : DefaultMode;
-                       }
-                       private set {
-                               hasCurrentMode = true;
-                               currentMode = value;
-                       }
-               }
-
-               FormViewMode defaultMode;
-
-               [DefaultValueAttribute (FormViewMode.ReadOnly)]
-               [WebCategoryAttribute ("Behavior")]
-               public virtual FormViewMode DefaultMode {
-                       get {
-                               return defaultMode;
-                       }
-                       set {
-                               defaultMode = value;
-                               RequireBinding ();
-                       }
-               }
-
-               string[] dataKeyNames;
-               [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;
-                               return dataKeyNames;
-                       }
-                       set {
-                               dataKeyNames = value;
-                               RequireBinding ();
-                       }
-               }
-               
-               [BrowsableAttribute (false)]
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               public virtual DataKey DataKey {
-                       get {
-                               EnsureDataBound ();
-                               return key;
-                       }
-               }
-
-               [DefaultValue (null)]
-               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate EditItemTemplate {
-                       get { return editItemTemplate; }
-                       set { editItemTemplate = value; RequireBinding (); }
-               }
-
-               [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(FormView), BindingDirection.OneWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate EmptyDataTemplate {
-                       get { return emptyDataTemplate; }
-                       set { emptyDataTemplate = value; RequireBinding (); }
-               }
-               
-               [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 ();
-                       }
-               }
-       
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               [BrowsableAttribute (false)]
-               public virtual FormViewRow FooterRow {
-                       get {
-                               EnsureChildControls ();
-                               return footerRow;
-                       }
-               }
-       
-               [DefaultValue (null)]
-               [TemplateContainer (typeof(FormView), BindingDirection.OneWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate FooterTemplate {
-                       get { return footerTemplate; }
-                       set { footerTemplate = value; RequireBinding (); }
-               }
-
-               [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.None)]
-               public virtual GridLines GridLines {
-                       get {
-                               if (ControlStyleCreated)
-                                       return ((TableStyle) ControlStyle).GridLines;
-                               return GridLines.None;
-                       }
-                       set {
-                               ((TableStyle) ControlStyle).GridLines = value;
-                       }
-               }
-
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               [BrowsableAttribute (false)]
-               public virtual FormViewRow 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(FormView), BindingDirection.OneWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate HeaderTemplate {
-                       get { return headerTemplate; }
-                       set { headerTemplate = value; RequireBinding (); }
-               }
-
-               [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;
-                       }
-               }
-
-               [DefaultValue (null)]
-               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate InsertItemTemplate {
-                       get { return insertItemTemplate; }
-                       set { insertItemTemplate = value; RequireBinding (); }
-               }
-
-               [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;
-                       }
-               }
-
-               [DefaultValue (null)]
-               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate ItemTemplate {
-                       get { return itemTemplate; }
-                       set { itemTemplate = value; RequireBinding (); }
-               }
-               
-               [BrowsableAttribute (false)]
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               public virtual int PageCount {
-                       get {
-                               if (pageCount != 0) return pageCount;
-                               EnsureDataBound ();
-                               return pageCount;
-                       }
-               }
-
-               [WebCategoryAttribute ("Paging")]
-               [BindableAttribute (true, BindingDirection.OneWay)]
-               [DefaultValueAttribute (0)]
-               public virtual int PageIndex {
-                       get {
-                               return pageIndex;
-                       }
-                       set {
-                               if (pageIndex == value)
-                                       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)]
-               /* DataControlPagerCell isnt specified in the docs */
-               //[TemplateContainer (typeof(DataControlPagerCell), BindingDirection.OneWay)]
-               [PersistenceMode (PersistenceMode.InnerProperty)]
-               [Browsable (false)]
-               public virtual ITemplate PagerTemplate {
-                       get { return pagerTemplate; }
-                       set { pagerTemplate = value; RequireBinding (); }
-               }
-               
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               [BrowsableAttribute (false)]
-               public virtual FormViewRow Row {
-                       get {
-                               EnsureDataBound ();
-                               return itemRow;
-                       }
-               }
-               
-               [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 FormViewRow TopPagerRow {
-                       get {
-                               EnsureDataBound ();
-                               return topPagerRow;
-                       }
-               }
-       
-               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
-               [BrowsableAttribute (false)]
-               public virtual object DataItem {
-                       get {
-                               EnsureDataBound ();
-                               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.DataItemIndex {
-                       get { return DataItemIndex; }
-               }
-       
-               int IDataItemContainer.DisplayIndex {
-                       get { return PageIndex; }
-               }               
-       
-               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 FormViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
-               {
-                       FormViewRow row = new FormViewRow (rowIndex, rowType, rowState);
-                       OnItemCreated (EventArgs.Empty);
-                       return row;
-               }
-               
-               void RequireBinding ()
-               {
-                       if (Initialized) {
-                               pageCount = -1;
-                               RequiresDataBinding = true;
-                       }
-               }
-               
-               protected virtual Table CreateTable ()
-               {
-                       return new ContainedTable (this);
-               }
-
-               [MonoTODO]
-               protected override void EnsureDataBound ()
-               {
-                       base.EnsureDataBound ();
-               }
-       
-               protected override Style CreateControlStyle ()
-               {
-                       TableStyle style = new TableStyle (ViewState);
-                       style.CellSpacing = 0;
-                       return style;
-               }
-               
-               protected override int CreateChildControls (IEnumerable data, bool dataBinding)
-               {
-                       PagedDataSource dataSource = new PagedDataSource ();
-                       dataSource.DataSource = data;
-                       dataSource.AllowPaging = AllowPaging;
-                       dataSource.PageSize = 1;
-                       dataSource.CurrentPageIndex = PageIndex;
-
-                       if (dataBinding) {
-                               DataSourceView view = GetData ();
-                               if (view != null && view.CanPage) {
-                                       dataSource.AllowServerPaging = true;
-                                       if (view.CanRetrieveTotalRowCount)
-                                               dataSource.VirtualCount = SelectArguments.TotalRowCount;
-                               }
-                       }
-
-                       pageCount = dataSource.DataSourceCount;
-                       bool showPager = AllowPaging && (pageCount > 1);
-                       
-                       Controls.Clear ();
-                       table = CreateTable ();
-                       Controls.Add (table);
-
-                       // Gets the current data item
-                       
-                       IEnumerator e = dataSource.GetEnumerator (); 
-                       dataItem = null;
-
-                       if (AllowPaging) {
-                               if (e.MoveNext ())
-                                       dataItem = e.Current;
-                       }
-                       else
-                       for (int page = 0; e.MoveNext (); page++ )
-                               if (page == PageIndex)
-                                       dataItem = e.Current;
-                       
-                       // Main table creation
-                       
-                       if (HeaderText.Length != 0 || headerTemplate != null) {
-                               headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
-                               InitializeRow (headerRow);
-                               table.Rows.Add (headerRow);
-                       }
-                       
-                       if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
-                               topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
-                               InitializePager (topPagerRow, dataSource);
-                               table.Rows.Add (topPagerRow);
-                       }
-
-                       if (pageCount > 0) {
-                               DataControlRowState rstate = GetRowState ();
-                               itemRow = CreateRow (0, DataControlRowType.DataRow, rstate);
-                               InitializeRow (itemRow);
-                               table.Rows.Add (itemRow);
-                               
-                               if (!dataBinding) {
-                                       if (CurrentMode == FormViewMode.Edit)
-                                               oldEditValues = new DataKey (new OrderedDictionary ());
-                                       key = new DataKey (new OrderedDictionary (), DataKeyNames);
-                               }
-                       } else {
-                               switch (CurrentMode) {
-                               case FormViewMode.Edit:
-                                       itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Edit);
-                                       break;
-                               case FormViewMode.Insert:
-                                       itemRow = CreateRow (-1, DataControlRowType.DataRow, DataControlRowState.Insert);
-                                       break;
-                               default:
-                                       itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
-                                       break;
-                               }
-                               table.Rows.Add (itemRow);
-                               InitializeRow (itemRow);
-                       }
-                               
-                       if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {
-                               bottomPagerRow = CreateRow (0, DataControlRowType.Pager, DataControlRowState.Normal);
-                               InitializePager (bottomPagerRow, dataSource);
-                               table.Rows.Add (bottomPagerRow);
-                       }
-
-                       if (FooterText.Length != 0 || footerTemplate != null) {
-                               footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);
-                               InitializeRow (footerRow);
-                               table.Rows.Add (footerRow);
-                       }
-                       
-                       if (dataBinding)
-                               DataBind (false);
-                       
-                       return dataSource.DataSourceCount;
-               }
-               
-               DataControlRowState GetRowState ()
-               {
-                       DataControlRowState rstate = DataControlRowState.Normal;
-                       if (CurrentMode == FormViewMode.Edit) rstate |= DataControlRowState.Edit;
-                       else if (CurrentMode == FormViewMode.Insert) rstate |= DataControlRowState.Insert;
-                       return rstate;
-               }
-               
-               protected virtual void InitializePager (FormViewRow row, PagedDataSource dataSource)
-               {
-                       TableCell cell = new TableCell ();
-                       cell.ColumnSpan = 2;
-
-                       if (pagerTemplate != null)
-                               pagerTemplate.InstantiateIn (cell);
-                       else
-                               cell.Controls.Add (PagerSettings.CreatePagerControl (dataSource.CurrentPageIndex, dataSource.PageCount));
-                       
-                       row.Cells.Add (cell);
-               }
-               
-               protected virtual void InitializeRow (FormViewRow row)
-               {
-                       TableCell cell = new TableCell ();
-                       
-                       if (row.RowType == DataControlRowType.DataRow)
-                       {
-                               if ((row.RowState & DataControlRowState.Edit) != 0) {
-                                       if (editItemTemplate != null)
-                                               editItemTemplate.InstantiateIn (cell);
-                               } else if ((row.RowState & DataControlRowState.Insert) != 0) {
-                                       if (insertItemTemplate != null)
-                                               insertItemTemplate.InstantiateIn (cell);
-                               } else if (itemTemplate != null)
-                                       itemTemplate.InstantiateIn (cell);
-                       }
-                       else if (row.RowType == DataControlRowType.EmptyDataRow)
-                       {
-                               if (emptyDataTemplate != null)
-                                       emptyDataTemplate.InstantiateIn (cell);
-                               else
-                                       cell.Text = EmptyDataText;
-                       }
-                       else if (row.RowType == DataControlRowType.Footer)
-                       {
-                               if (footerTemplate != null)
-                                       footerTemplate.InstantiateIn (cell);
-                               else
-                                       cell.Text = FooterText;
-                       }
-                       else if (row.RowType == DataControlRowType.Header)
-                       {
-                               if (headerTemplate != null)
-                                       headerTemplate.InstantiateIn (cell);
-                               else
-                                       cell.Text = HeaderText;
-                       }
-                       cell.ColumnSpan = 2;
-                       row.Cells.Add (cell);
-               }
-               
-               IOrderedDictionary CreateRowDataKey (object dataItem)
-               {
-                       if (cachedKeyProperties == null) {
-                               PropertyDescriptorCollection props = TypeDescriptor.GetProperties (dataItem);
-                               cachedKeyProperties = new PropertyDescriptor [DataKeyNames.Length];
-                               for (int n=0; n<DataKeyNames.Length; n++) { 
-                                       PropertyDescriptor p = props [DataKeyNames[n]];
-                                       if (p == null)
-                                               new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());
-                                       cachedKeyProperties [n] = p;
-                               }
-                       }
-                       
-                       OrderedDictionary dic = new OrderedDictionary ();
-                       foreach (PropertyDescriptor p in cachedKeyProperties)
-                               dic [p.Name] = p.GetValue (dataItem);
-                       return dic;
-               }
-               
-               IOrderedDictionary GetRowValues (bool includePrimaryKey)
-               {
-                       OrderedDictionary dic = new OrderedDictionary ();
-                       ExtractRowValues (dic, includePrimaryKey);
-                       return dic;
-               }
-               
-               protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeKeys)
-               {
-                       if (Row == null)
-                               return;
-
-                       DataControlRowState rowState = Row.RowState;
-                       IBindableTemplate bt;
-                       
-                       if ((rowState & DataControlRowState.Insert) != 0)
-                               bt = insertItemTemplate as IBindableTemplate; 
-                       else if ((rowState & DataControlRowState.Edit) != 0)
-                               bt = editItemTemplate as IBindableTemplate;
-                       else
-                               return;
-                       
-                       if (bt != null) {
-                               IOrderedDictionary values = bt.ExtractValues (Row.Cells [0]);
-                               foreach (DictionaryEntry e in values) {
-                                       if (includeKeys || Array.IndexOf (DataKeyNames, e.Key) == -1)
-                                               fieldValues [e.Key] = e.Value;
-                               }
-                       }
-               }
-               
-               protected override HtmlTextWriterTag TagKey {
-                       get {
-                               return HtmlTextWriterTag.Table;
-                       }
-               }
-               
-               public sealed override void DataBind ()
-               {
-                       if (CurrentMode == FormViewMode.Insert) {
-                               RequiresDataBinding = false;
-                               PerformDataBinding (new object [] { null });
-                               return;
-                       }
-
-                       cachedKeyProperties = null;
-                       base.DataBind ();
-                       
-                       if (pageCount > 0) {
-                               if (CurrentMode == FormViewMode.Edit)
-                                       oldEditValues = new DataKey (GetRowValues (true));
-                               else
-                                       oldEditValues = new DataKey (new OrderedDictionary ());
-                               key = new DataKey (CreateRowDataKey (dataItem), DataKeyNames);
-                       }
-               }
-               
-               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 (FormViewRow 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.Edit | DataControlRowState.Insert)) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)
-                                               row.ControlStyle.CopyFrom (editRowStyle);
-                                       if ((row.RowState & DataControlRowState.Insert) != 0 && insertRowStyle != null && !insertRowStyle.IsEmpty)
-                                               row.ControlStyle.CopyFrom (insertRowStyle);
-                                       break;
-                               default:
-                                       break;
-                               }
-                       }
-               }
-               
-               protected internal override void OnInit (EventArgs e)
-               {
-                       Page.RegisterRequiresControlState (this);
-                       base.OnInit (e);
-               }
-               
-               protected override bool OnBubbleEvent (object source, EventArgs e)
-               {
-                       FormViewCommandEventArgs args = e as FormViewCommandEventArgs;
-                       if (args != null) {
-                               OnItemCommand (args);
-                               ProcessEvent (args.CommandName, args.CommandArgument as string);
-                               return true;
-                       }
-                       return base.OnBubbleEvent (source, e);
-               }
-               
-                void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
-               {
-                       RaisePostBackEvent (eventArgument);
-               }
-
-               protected virtual void RaisePostBackEvent (string eventArgument)
-               {
-                       int i = eventArgument.IndexOf ('$');
-                       if (i != -1)
-                               ProcessEvent (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));
-                       else
-                               ProcessEvent (eventArgument, null);
-               }
-               
-               void ProcessEvent (string eventName, string param)
-               {
-                       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;
-                               }
-                               ShowPage (newIndex);
-                               break;
-                                       
-                       case DataControlCommands.FirstPageCommandArgument:
-                               ShowPage (0);
-                               break;
-
-                       case DataControlCommands.LastPageCommandArgument:
-                               ShowPage (PageCount - 1);
-                               break;
-                                       
-                       case DataControlCommands.NextPageCommandArgument:
-                               if (PageIndex < PageCount - 1)
-                                       ShowPage (PageIndex + 1);
-                               break;
-
-                       case DataControlCommands.PreviousPageCommandArgument:
-                               if (PageIndex > 0)
-                                       ShowPage (PageIndex - 1);
-                               break;
-                                       
-                       case DataControlCommands.EditCommandName:
-                               ChangeMode (FormViewMode.Edit);
-                               break;
-                                       
-                       case DataControlCommands.NewCommandName:
-                               ChangeMode (FormViewMode.Insert);
-                               break;
-                                       
-                       case DataControlCommands.UpdateCommandName:
-                               UpdateItem (param, true);
-                               break;
-                                       
-                       case DataControlCommands.CancelCommandName:
-                               CancelEdit ();
-                               break;
-                                       
-                       case DataControlCommands.DeleteCommandName:
-                               DeleteItem ();
-                               break;
-                                       
-                       case DataControlCommands.InsertCommandName:
-                               InsertItem (true);
-                               break;
-                       }
-               }
-               
-               void ShowPage (int newIndex)
-               {
-                       FormViewPageEventArgs args = new FormViewPageEventArgs (newIndex);
-                       OnPageIndexChanging (args);
-                       if (!args.Cancel) {
-                               newIndex = args.NewPageIndex;
-                               if (newIndex < 0 || newIndex >= PageCount)
-                                       return;
-                               EndRowEdit (false);
-                               PageIndex = newIndex;
-                               OnPageIndexChanged (EventArgs.Empty);
-                       }
-               }
-               
-               public void ChangeMode (FormViewMode newMode)
-               {
-                       FormViewModeEventArgs args = new FormViewModeEventArgs (newMode, false);
-                       OnModeChanging (args);
-                       if (!args.Cancel) {
-                               CurrentMode = args.NewMode;
-                               OnModeChanged (EventArgs.Empty);
-                               RequireBinding ();
-                       }
-               }
-               
-               void CancelEdit ()
-               {
-                       FormViewModeEventArgs args = new FormViewModeEventArgs (FormViewMode.ReadOnly, true);
-                       OnModeChanging (args);
-                       if (!args.Cancel) {
-                               EndRowEdit ();
-                       }
-               }
-
-               public virtual void UpdateItem (bool causesValidation)
-               {
-                       UpdateItem (null, causesValidation);
-               }
-               
-               void UpdateItem (string param, bool causesValidation)
-               {
-                       if (causesValidation)
-                               Page.Validate ();
-                       
-                       if (CurrentMode != FormViewMode.Edit) throw new NotSupportedException ();
-                       
-                       currentEditOldValues = oldEditValues.Values;
-                       currentEditRowKeys = DataKey.Values;
-                       currentEditNewValues = GetRowValues (false);
-                       
-                       FormViewUpdateEventArgs args = new FormViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);
-                       OnItemUpdating (args);
-                       if (!args.Cancel) {
-                               DataSourceView view = GetData ();
-                               if (view == null)
-                                       throw new HttpException ("The DataSourceView associated to data bound control was null");
-                               if (view.CanUpdate)
-                                       view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));
-                       }
-                       else
-                               EndRowEdit ();
-               }
-
-               bool UpdateCallback (int recordsAffected, Exception exception)
-               {
-                       FormViewUpdatedEventArgs dargs = new FormViewUpdatedEventArgs (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.Validate ();
-                       
-                       if (CurrentMode != FormViewMode.Insert) throw new NotSupportedException ();
-                       
-                       currentEditNewValues = GetRowValues (true);
-                       FormViewInsertEventArgs args = new FormViewInsertEventArgs (param, currentEditNewValues);
-                       OnItemInserting (args);
-                       if (!args.Cancel) {
-                               DataSourceView view = GetData ();
-                               if (view == null)
-                                       throw new HttpException ("The DataSourceView associated to data bound control was null");
-                               if (view.CanInsert)
-                                       view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));
-                       }
-                       else
-                               EndRowEdit ();
-               }
-               
-               bool InsertCallback (int recordsAffected, Exception exception)
-               {
-                       FormViewInsertedEventArgs dargs = new FormViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
-                       OnItemInserted (dargs);
-
-                       if (!dargs.KeepInInsertMode)                            
-                               EndRowEdit ();
-
-                       return dargs.ExceptionHandled;
-               }
-
-               public virtual void DeleteItem ()
-               {
-                       currentEditRowKeys = DataKey.Values;
-                       currentEditNewValues = GetRowValues (true);
-                       
-                       FormViewDeleteEventArgs args = new FormViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);
-                       OnItemDeleting (args);
-
-                       if (!args.Cancel) {
-                               if (PageIndex == PageCount - 1)
-                                       PageIndex --;
-                                       
-                               RequireBinding ();
-                                       
-                               DataSourceView view = GetData ();
-                               if (view != null && view.CanDelete)
-                                       view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));
-                               else {
-                                       FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);
-                                       OnItemDeleted (dargs);
-                               }
-                       }
-               }
-
-               bool DeleteCallback (int recordsAffected, Exception exception)
-               {
-                       FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (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 ob)
-               {
-                       if (ob == null) return;
-                       object[] state = (object[]) ob;
-                       base.LoadControlState (state[0]);
-                       pageIndex = (int) state[1];
-                       pageCount = (int) state[2];
-                       CurrentMode = (FormViewMode) state[3];
-                       defaultMode = (FormViewMode) state[4];
-                       dataKeyNames = (string[]) state[5];
-               }
-               
-               protected internal override object SaveControlState ()
-               {
-                       object bstate = base.SaveControlState ();
-                       return new object[] {
-                               bstate, pageIndex, pageCount, CurrentMode, defaultMode, dataKeyNames
-                       };
-               }
-               
-               protected override void TrackViewState()
-               {
-                       base.TrackViewState();
-                       if (pagerSettings != null) ((IStateManager)pagerSettings).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();
-               }
-
-               protected override object SaveViewState()
-               {
-                       object[] states = new object [14];
-                       states[0] = base.SaveViewState();
-                       states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).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());
-                       states[11] = (key == null ? null : ((IStateManager)key).SaveViewState());
-                       states[12] = (oldEditValues == null ? null : ((IStateManager)oldEditValues).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;
-                       
-                       base.LoadViewState (states[0]);
-                       EnsureChildControls ();
-                       
-                       if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
-                       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[11] != null && DataKey != null) ((IStateManager)DataKey).LoadViewState (states[11]);
-                       if (states[12] != null && oldEditValues != null) ((IStateManager)oldEditValues).LoadViewState (states[12]);
-               }
-               
-               protected internal override void Render (HtmlTextWriter writer)
-               {
-                       PrepareControlHierarchy ();
-                       
-                       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 FormView '" + 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;
-               }
-
-       }
-}
-
-#endif
+//\r
+// System.Web.UI.WebControls.FormView.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
+       [DesignerAttribute ("System.Web.UI.Design.WebControls.FormViewDesigner, " + 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 FormView: CompositeDataBoundControl, IDataItemContainer, INamingContainer, IPostBackEventHandler, IPostBackContainer\r
+       {\r
+               object dataItem;\r
+               \r
+               Table table;\r
+               FormViewRow headerRow;\r
+               FormViewRow footerRow;\r
+               FormViewRow bottomPagerRow;\r
+               FormViewRow topPagerRow;\r
+               FormViewRow itemRow;\r
+               \r
+               IOrderedDictionary currentEditRowKeys;\r
+               IOrderedDictionary currentEditNewValues;\r
+               IOrderedDictionary currentEditOldValues;\r
+               \r
+               ITemplate pagerTemplate;\r
+               ITemplate emptyDataTemplate;\r
+               ITemplate headerTemplate;\r
+               ITemplate footerTemplate;\r
+               ITemplate editItemTemplate;\r
+               ITemplate insertItemTemplate;\r
+               ITemplate itemTemplate;\r
+               \r
+               PropertyDescriptor[] cachedKeyProperties;\r
+               readonly string[] emptyKeys = new string[0];\r
+               \r
+               // View state\r
+               PagerSettings pagerSettings;\r
+               \r
+               TableItemStyle editRowStyle;\r
+               TableItemStyle insertRowStyle;\r
+               TableItemStyle emptyDataRowStyle;\r
+               TableItemStyle footerStyle;\r
+               TableItemStyle headerStyle;\r
+               TableItemStyle pagerStyle;\r
+               TableItemStyle rowStyle;\r
+               \r
+               DataKey key;\r
+               DataKey oldEditValues;\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
+               FormViewMode currentMode = FormViewMode.ReadOnly; \r
+               bool hasCurrentMode;\r
+               int pageCount = 0;\r
+               \r
+               public FormView ()\r
+               {\r
+                       key = new DataKey (new OrderedDictionary ());\r
+               }\r
+               \r
+               public event EventHandler PageIndexChanged {\r
+                       add { Events.AddHandler (PageIndexChangedEvent, value); }\r
+                       remove { Events.RemoveHandler (PageIndexChangedEvent, value); }\r
+               }\r
+               \r
+               public event FormViewPageEventHandler PageIndexChanging {\r
+                       add { Events.AddHandler (PageIndexChangingEvent, value); }\r
+                       remove { Events.RemoveHandler (PageIndexChangingEvent, value); }\r
+               }\r
+               \r
+               public event FormViewCommandEventHandler 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 FormViewDeletedEventHandler ItemDeleted {\r
+                       add { Events.AddHandler (ItemDeletedEvent, value); }\r
+                       remove { Events.RemoveHandler (ItemDeletedEvent, value); }\r
+               }\r
+               \r
+               public event FormViewDeleteEventHandler ItemDeleting {\r
+                       add { Events.AddHandler (ItemDeletingEvent, value); }\r
+                       remove { Events.RemoveHandler (ItemDeletingEvent, value); }\r
+               }\r
+               \r
+               public event FormViewInsertedEventHandler ItemInserted {\r
+                       add { Events.AddHandler (ItemInsertedEvent, value); }\r
+                       remove { Events.RemoveHandler (ItemInsertedEvent, value); }\r
+               }\r
+               \r
+               public event FormViewInsertEventHandler ItemInserting {\r
+                       add { Events.AddHandler (ItemInsertingEvent, value); }\r
+                       remove { Events.RemoveHandler (ItemInsertingEvent, value); }\r
+               }\r
+               \r
+               public event FormViewModeEventHandler 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 FormViewUpdatedEventHandler ItemUpdated {\r
+                       add { Events.AddHandler (ItemUpdatedEvent, value); }\r
+                       remove { Events.RemoveHandler (ItemUpdatedEvent, value); }\r
+               }\r
+               \r
+               public event FormViewUpdateEventHandler 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 (FormViewPageEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewPageEventHandler eh = (FormViewPageEventHandler) Events [PageIndexChangingEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemCommand (FormViewCommandEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewCommandEventHandler eh = (FormViewCommandEventHandler) 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 (FormViewDeletedEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewDeletedEventHandler eh = (FormViewDeletedEventHandler) Events [ItemDeletedEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemInserted (FormViewInsertedEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewInsertedEventHandler eh = (FormViewInsertedEventHandler) Events [ItemInsertedEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemInserting (FormViewInsertEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewInsertEventHandler eh = (FormViewInsertEventHandler) Events [ItemInsertingEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemDeleting (FormViewDeleteEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewDeleteEventHandler eh = (FormViewDeleteEventHandler) Events [ItemDeletingEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\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 (FormViewModeEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewModeEventHandler eh = (FormViewModeEventHandler) Events [ModeChangingEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemUpdated (FormViewUpdatedEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewUpdatedEventHandler eh = (FormViewUpdatedEventHandler) Events [ItemUpdatedEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnItemUpdating (FormViewUpdateEventArgs e)\r
+               {\r
+                       if (Events != null) {\r
+                               FormViewUpdateEventHandler eh = (FormViewUpdateEventHandler) Events [ItemUpdatingEvent];\r
+                               if (eh != null) eh (this, e);\r
+                       }\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
+               [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 FormViewRow 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
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
+               [BrowsableAttribute (false)]\r
+               public FormViewMode CurrentMode {\r
+                       get {\r
+                               return hasCurrentMode ? currentMode : DefaultMode;\r
+                       }\r
+                       private set {\r
+                               hasCurrentMode = true;\r
+                               currentMode = value;\r
+                       }\r
+               }\r
+\r
+               FormViewMode defaultMode;\r
+\r
+               [DefaultValueAttribute (FormViewMode.ReadOnly)]\r
+               [WebCategoryAttribute ("Behavior")]\r
+               public virtual FormViewMode DefaultMode {\r
+                       get {\r
+                               return defaultMode;\r
+                       }\r
+                       set {\r
+                               defaultMode = value;\r
+                               RequireBinding ();\r
+                       }\r
+               }\r
+\r
+               string[] dataKeyNames;\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
+                               return dataKeyNames;\r
+                       }\r
+                       set {\r
+                               dataKeyNames = value;\r
+                               RequireBinding ();\r
+                       }\r
+               }\r
+               \r
+               [BrowsableAttribute (false)]\r
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
+               public virtual DataKey DataKey {\r
+                       get {\r
+                               EnsureDataBound ();\r
+                               return key;\r
+                       }\r
+               }\r
+\r
+               [DefaultValue (null)]\r
+               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
+               [PersistenceMode (PersistenceMode.InnerProperty)]\r
+               [Browsable (false)]\r
+               public virtual ITemplate EditItemTemplate {\r
+                       get { return editItemTemplate; }\r
+                       set { editItemTemplate = value; RequireBinding (); }\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(FormView), 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
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
+               [BrowsableAttribute (false)]\r
+               public virtual FormViewRow FooterRow {\r
+                       get {\r
+                               EnsureChildControls ();\r
+                               return footerRow;\r
+                       }\r
+               }\r
+       \r
+               [DefaultValue (null)]\r
+               [TemplateContainer (typeof(FormView), 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.None)]\r
+               public virtual GridLines GridLines {\r
+                       get {\r
+                               if (ControlStyleCreated)\r
+                                       return ((TableStyle) ControlStyle).GridLines;\r
+                               return GridLines.None;\r
+                       }\r
+                       set {\r
+                               ((TableStyle) ControlStyle).GridLines = value;\r
+                       }\r
+               }\r
+\r
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
+               [BrowsableAttribute (false)]\r
+               public virtual FormViewRow 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(FormView), 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
+               [DefaultValue (null)]\r
+               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
+               [PersistenceMode (PersistenceMode.InnerProperty)]\r
+               [Browsable (false)]\r
+               public virtual ITemplate InsertItemTemplate {\r
+                       get { return insertItemTemplate; }\r
+                       set { insertItemTemplate = value; RequireBinding (); }\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
+               [DefaultValue (null)]\r
+               [TemplateContainer (typeof(FormView), BindingDirection.TwoWay)]\r
+               [PersistenceMode (PersistenceMode.InnerProperty)]\r
+               [Browsable (false)]\r
+               public virtual ITemplate ItemTemplate {\r
+                       get { return itemTemplate; }\r
+                       set { itemTemplate = value; RequireBinding (); }\r
+               }\r
+               \r
+               [BrowsableAttribute (false)]\r
+               [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]\r
+               public virtual int PageCount {\r
+                       get {\r
+                               if (pageCount != 0) return pageCount;\r
+                               EnsureDataBound ();\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 (pageIndex == value)\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
+               /* DataControlPagerCell isnt specified in the docs */\r
+               //[TemplateContainer (typeof(DataControlPagerCell), 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 FormViewRow Row {\r
+                       get {\r
+                               EnsureDataBound ();\r
+                               return itemRow;\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 FormViewRow 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.DataItemIndex {\r
+                       get { return DataItemIndex; }\r
+               }\r
+       \r
+               int IDataItemContainer.DisplayIndex {\r
+                       get { return PageIndex; }\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 FormViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)\r
+               {\r
+                       FormViewRow row = new FormViewRow (rowIndex, rowType, rowState);\r
+                       OnItemCreated (EventArgs.Empty);\r
+                       return row;\r
+               }\r
+               \r
+               void RequireBinding ()\r
+               {\r
+                       if (Initialized) {\r
+                               pageCount = -1;\r
+                               RequiresDataBinding = true;\r
+                       }\r
+               }\r
+               \r
+               protected virtual Table CreateTable ()\r
+               {\r
+                       return new ContainedTable (this);\r
+               }\r
+\r
+               [MonoTODO]\r
+               protected override void EnsureDataBound ()\r
+               {\r
+                       base.EnsureDataBound ();\r
+               }\r
+       \r
+               protected override Style CreateControlStyle ()\r
+               {\r
+                       TableStyle style = new TableStyle (ViewState);\r
+                       style.CellSpacing = 0;\r
+                       return style;\r
+               }\r
+               \r
+               protected override int CreateChildControls (IEnumerable data, bool dataBinding)\r
+               {\r
+                       PagedDataSource dataSource = new PagedDataSource ();\r
+                       dataSource.DataSource = data;\r
+                       dataSource.AllowPaging = AllowPaging;\r
+                       dataSource.PageSize = 1;\r
+                       dataSource.CurrentPageIndex = PageIndex;\r
+\r
+                       if (dataBinding) {\r
+                               DataSourceView view = GetData ();\r
+                               if (view != null && view.CanPage) {\r
+                                       dataSource.AllowServerPaging = true;\r
+                                       if (view.CanRetrieveTotalRowCount)\r
+                                               dataSource.VirtualCount = SelectArguments.TotalRowCount;\r
+                               }\r
+                       }\r
+\r
+                       pageCount = dataSource.DataSourceCount;\r
+                       bool showPager = AllowPaging && (pageCount > 1);\r
+                       \r
+                       Controls.Clear ();\r
+                       table = CreateTable ();\r
+                       Controls.Add (table);\r
+\r
+                       // Gets the current data item\r
+                       \r
+                       IEnumerator e = dataSource.GetEnumerator (); \r
+                       dataItem = null;\r
+\r
+                       if (AllowPaging) {\r
+                               if (e.MoveNext ())\r
+                                       dataItem = e.Current;\r
+                       }\r
+                       else\r
+                       for (int page = 0; e.MoveNext (); page++ )\r
+                               if (page == PageIndex)\r
+                                       dataItem = e.Current;\r
+                       \r
+                       // Main table creation\r
+                       \r
+                       if (HeaderText.Length != 0 || headerTemplate != null) {\r
+                               headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);\r
+                               InitializeRow (headerRow);\r
+                               table.Rows.Add (headerRow);\r
+                       }\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 (pageCount > 0) {\r
+                               DataControlRowState rstate = GetRowState ();\r
+                               itemRow = CreateRow (0, DataControlRowType.DataRow, rstate);\r
+                               InitializeRow (itemRow);\r
+                               table.Rows.Add (itemRow);\r
+                               \r
+                               if (!dataBinding) {\r
+                                       if (CurrentMode == FormViewMode.Edit)\r
+                                               oldEditValues = new DataKey (new OrderedDictionary ());\r
+                                       key = new DataKey (new OrderedDictionary (), DataKeyNames);\r
+                               }\r
+                       } else {\r
+                               switch (CurrentMode) {\r
+                               case FormViewMode.Edit:\r
+                                       itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Edit);\r
+                                       break;\r
+                               case FormViewMode.Insert:\r
+                                       itemRow = CreateRow (-1, DataControlRowType.DataRow, DataControlRowState.Insert);\r
+                                       break;\r
+                               default:\r
+                                       itemRow = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);\r
+                                       break;\r
+                               }\r
+                               table.Rows.Add (itemRow);\r
+                               InitializeRow (itemRow);\r
+                       }\r
+\r
+                       if (FooterText.Length != 0 || footerTemplate != null) {\r
+                               footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);\r
+                               InitializeRow (footerRow);\r
+                               table.Rows.Add (footerRow);\r
+                       }\r
+                       \r
+                       if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {\r
+                               bottomPagerRow = CreateRow (0, 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
+               DataControlRowState GetRowState ()\r
+               {\r
+                       DataControlRowState rstate = DataControlRowState.Normal;\r
+                       if (CurrentMode == FormViewMode.Edit) rstate |= DataControlRowState.Edit;\r
+                       else if (CurrentMode == FormViewMode.Insert) rstate |= DataControlRowState.Insert;\r
+                       return rstate;\r
+               }\r
+               \r
+               protected virtual void InitializePager (FormViewRow 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
+               protected virtual void InitializeRow (FormViewRow row)\r
+               {\r
+                       TableCell cell = new TableCell ();\r
+                       \r
+                       if (row.RowType == DataControlRowType.DataRow)\r
+                       {\r
+                               if ((row.RowState & DataControlRowState.Edit) != 0) {\r
+                                       if (editItemTemplate != null)\r
+                                               editItemTemplate.InstantiateIn (cell);\r
+                               } else if ((row.RowState & DataControlRowState.Insert) != 0) {\r
+                                       if (insertItemTemplate != null)\r
+                                               insertItemTemplate.InstantiateIn (cell);\r
+                               } else if (itemTemplate != null)\r
+                                       itemTemplate.InstantiateIn (cell);\r
+                       }\r
+                       else if (row.RowType == DataControlRowType.EmptyDataRow)\r
+                       {\r
+                               if (emptyDataTemplate != null)\r
+                                       emptyDataTemplate.InstantiateIn (cell);\r
+                               else\r
+                                       cell.Text = EmptyDataText;\r
+                       }\r
+                       else if (row.RowType == DataControlRowType.Footer)\r
+                       {\r
+                               if (footerTemplate != null)\r
+                                       footerTemplate.InstantiateIn (cell);\r
+                               else\r
+                                       cell.Text = FooterText;\r
+                       }\r
+                       else if (row.RowType == DataControlRowType.Header)\r
+                       {\r
+                               if (headerTemplate != null)\r
+                                       headerTemplate.InstantiateIn (cell);\r
+                               else\r
+                                       cell.Text = HeaderText;\r
+                       }\r
+                       cell.ColumnSpan = 2;\r
+                       row.Cells.Add (cell);\r
+               }\r
+               \r
+               IOrderedDictionary CreateRowDataKey (object dataItem)\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 [DataKeyNames[n]];\r
+                                       if (p == null)\r
+                                               new InvalidOperationException ("Property '" + DataKeyNames[n] + "' not found in object of type " + dataItem.GetType());\r
+                                       cachedKeyProperties [n] = p;\r
+                               }\r
+                       }\r
+                       \r
+                       OrderedDictionary dic = new OrderedDictionary ();\r
+                       foreach (PropertyDescriptor p in cachedKeyProperties)\r
+                               dic [p.Name] = p.GetValue (dataItem);\r
+                       return dic;\r
+               }\r
+               \r
+               IOrderedDictionary GetRowValues (bool includePrimaryKey)\r
+               {\r
+                       OrderedDictionary dic = new OrderedDictionary ();\r
+                       ExtractRowValues (dic, includePrimaryKey);\r
+                       return dic;\r
+               }\r
+               \r
+               protected virtual void ExtractRowValues (IOrderedDictionary fieldValues, bool includeKeys)\r
+               {\r
+                       if (Row == null)\r
+                               return;\r
+\r
+                       DataControlRowState rowState = Row.RowState;\r
+                       IBindableTemplate bt;\r
+                       \r
+                       if ((rowState & DataControlRowState.Insert) != 0)\r
+                               bt = insertItemTemplate as IBindableTemplate; \r
+                       else if ((rowState & DataControlRowState.Edit) != 0)\r
+                               bt = editItemTemplate as IBindableTemplate;\r
+                       else\r
+                               return;\r
+                       \r
+                       if (bt != null) {\r
+                               IOrderedDictionary values = bt.ExtractValues (Row.Cells [0]);\r
+                               foreach (DictionaryEntry e in values) {\r
+                                       if (includeKeys || Array.IndexOf (DataKeyNames, e.Key) == -1)\r
+                                               fieldValues [e.Key] = e.Value;\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               protected override HtmlTextWriterTag TagKey {\r
+                       get {\r
+                               return HtmlTextWriterTag.Table;\r
+                       }\r
+               }\r
+               \r
+               public sealed override void DataBind ()\r
+               {\r
+                       if (CurrentMode == FormViewMode.Insert) {\r
+                               RequiresDataBinding = false;\r
+                               PerformDataBinding (new object [] { null });\r
+                               return;\r
+                       }\r
+\r
+                       cachedKeyProperties = null;\r
+                       base.DataBind ();\r
+                       \r
+                       if (pageCount > 0) {\r
+                               if (CurrentMode == FormViewMode.Edit)\r
+                                       oldEditValues = new DataKey (GetRowValues (true));\r
+                               else\r
+                                       oldEditValues = new DataKey (new OrderedDictionary ());\r
+                               key = new DataKey (CreateRowDataKey (dataItem), DataKeyNames);\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
+                       foreach (FormViewRow 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.Edit | DataControlRowState.Insert)) != 0 && editRowStyle != null && !editRowStyle.IsEmpty)\r
+                                               row.ControlStyle.CopyFrom (editRowStyle);\r
+                                       if ((row.RowState & DataControlRowState.Insert) != 0 && insertRowStyle != null && !insertRowStyle.IsEmpty)\r
+                                               row.ControlStyle.CopyFrom (insertRowStyle);\r
+                                       break;\r
+                               default:\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               protected internal override void OnInit (EventArgs e)\r
+               {\r
+                       Page.RegisterRequiresControlState (this);\r
+                       base.OnInit (e);\r
+               }\r
+               \r
+               protected override bool OnBubbleEvent (object source, EventArgs e)\r
+               {\r
+                       FormViewCommandEventArgs args = e as FormViewCommandEventArgs;\r
+                       if (args != null) {\r
+                               OnItemCommand (args);\r
+                               ProcessEvent (args.CommandName, args.CommandArgument as string);\r
+                               return true;\r
+                       }\r
+                       return base.OnBubbleEvent (source, e);\r
+               }\r
+               \r
+                void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
+               {\r
+                       RaisePostBackEvent (eventArgument);\r
+               }\r
+\r
+               protected virtual void RaisePostBackEvent (string eventArgument)\r
+               {\r
+                       int i = eventArgument.IndexOf ('$');\r
+                       if (i != -1)\r
+                               ProcessEvent (eventArgument.Substring (0, i), eventArgument.Substring (i + 1));\r
+                       else\r
+                               ProcessEvent (eventArgument, null);\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
+                               ChangeMode (FormViewMode.Edit);\r
+                               break;\r
+                                       \r
+                       case DataControlCommands.NewCommandName:\r
+                               ChangeMode (FormViewMode.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
+                       FormViewPageEventArgs args = new FormViewPageEventArgs (newIndex);\r
+                       OnPageIndexChanging (args);\r
+                       if (!args.Cancel) {\r
+                               newIndex = args.NewPageIndex;\r
+                               if (newIndex < 0 || newIndex >= PageCount)\r
+                                       return;\r
+                               EndRowEdit (false);\r
+                               PageIndex = newIndex;\r
+                               OnPageIndexChanged (EventArgs.Empty);\r
+                       }\r
+               }\r
+               \r
+               public void ChangeMode (FormViewMode newMode)\r
+               {\r
+                       FormViewModeEventArgs args = new FormViewModeEventArgs (newMode, false);\r
+                       OnModeChanging (args);\r
+                       if (!args.Cancel) {\r
+                               CurrentMode = args.NewMode;\r
+                               OnModeChanged (EventArgs.Empty);\r
+                               RequireBinding ();\r
+                       }\r
+               }\r
+               \r
+               void CancelEdit ()\r
+               {\r
+                       FormViewModeEventArgs args = new FormViewModeEventArgs (FormViewMode.ReadOnly, true);\r
+                       OnModeChanging (args);\r
+                       if (!args.Cancel) {\r
+                               EndRowEdit ();\r
+                       }\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)\r
+                               Page.Validate ();\r
+                       \r
+                       if (currentMode != FormViewMode.Edit) throw new HttpException ("Must be in Edit mode");\r
+                       \r
+                       currentEditOldValues = oldEditValues.Values;\r
+                       currentEditRowKeys = DataKey.Values;\r
+                       currentEditNewValues = GetRowValues (false);\r
+                       \r
+                       FormViewUpdateEventArgs args = new FormViewUpdateEventArgs (param, currentEditRowKeys, currentEditOldValues, currentEditNewValues);\r
+                       OnItemUpdating (args);\r
+                       if (!args.Cancel) {\r
+                               DataSourceView view = GetData ();\r
+                               if (view == null)\r
+                                       throw new HttpException ("The DataSourceView associated to data bound control was null");\r
+                               if (view.CanUpdate)\r
+                                       view.Update (currentEditRowKeys, currentEditNewValues, currentEditOldValues, new DataSourceViewOperationCallback (UpdateCallback));\r
+                       }\r
+                       else\r
+                               EndRowEdit ();\r
+               }\r
+\r
+               bool UpdateCallback (int recordsAffected, Exception exception)\r
+               {\r
+                       FormViewUpdatedEventArgs dargs = new FormViewUpdatedEventArgs (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)\r
+                               Page.Validate ();\r
+                       \r
+                       if (currentMode != FormViewMode.Insert) throw new HttpException ("Must be in Insert mode");\r
+                       \r
+                       currentEditNewValues = GetRowValues (true);\r
+                       FormViewInsertEventArgs args = new FormViewInsertEventArgs (param, currentEditNewValues);\r
+                       OnItemInserting (args);\r
+                       if (!args.Cancel) {\r
+                               DataSourceView view = GetData ();\r
+                               if (view == null)\r
+                                       throw new HttpException ("The DataSourceView associated to data bound control was null");\r
+                               if (view.CanInsert)\r
+                                       view.Insert (currentEditNewValues, new DataSourceViewOperationCallback (InsertCallback));\r
+                       }\r
+                       else\r
+                               EndRowEdit ();\r
+               }\r
+               \r
+               bool InsertCallback (int recordsAffected, Exception exception)\r
+               {\r
+                       FormViewInsertedEventArgs dargs = new FormViewInsertedEventArgs (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);\r
+                       \r
+                       FormViewDeleteEventArgs args = new FormViewDeleteEventArgs (PageIndex, currentEditRowKeys, currentEditNewValues);\r
+                       OnItemDeleting (args);\r
+\r
+                       if (!args.Cancel) {\r
+                               if (PageIndex == PageCount - 1)\r
+                                       PageIndex --;\r
+                                       \r
+                               RequireBinding ();\r
+                                       \r
+                               DataSourceView view = GetData ();\r
+                               if (view != null && view.CanDelete)\r
+                                       view.Delete (currentEditRowKeys, currentEditNewValues, new DataSourceViewOperationCallback (DeleteCallback));\r
+                               else {\r
+                                       FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (0, null, currentEditRowKeys, currentEditNewValues);\r
+                                       OnItemDeleted (dargs);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               bool DeleteCallback (int recordsAffected, Exception exception)\r
+               {\r
+                       FormViewDeletedEventArgs dargs = new FormViewDeletedEventArgs (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
+               {\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 = (FormViewMode) state[3];\r
+                       defaultMode = (FormViewMode) state[4];\r
+                       dataKeyNames = (string[]) state[5];\r
+               }\r
+               \r
+               protected internal override object SaveControlState ()\r
+               {\r
+                       object bstate = base.SaveControlState ();\r
+                       return new object[] {\r
+                               bstate, pageIndex, pageCount, CurrentMode, defaultMode, dataKeyNames\r
+                       };\r
+               }\r
+               \r
+               protected override void TrackViewState()\r
+               {\r
+                       base.TrackViewState();\r
+                       if (pagerSettings != null) ((IStateManager)pagerSettings).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
+               }\r
+\r
+               protected override object SaveViewState()\r
+               {\r
+                       object[] states = new object [14];\r
+                       states[0] = base.SaveViewState();\r
+                       states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).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
+                       states[11] = (key == null ? null : ((IStateManager)key).SaveViewState());\r
+                       states[12] = (oldEditValues == null ? null : ((IStateManager)oldEditValues).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
+                       base.LoadViewState (states[0]);\r
+                       EnsureChildControls ();\r
+                       \r
+                       if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);\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[11] != null && DataKey != null) ((IStateManager)DataKey).LoadViewState (states[11]);\r
+                       if (states[12] != null && oldEditValues != null) ((IStateManager)oldEditValues).LoadViewState (states[12]);\r
+               }\r
+               \r
+               protected internal override void Render (HtmlTextWriter writer)\r
+               {\r
+                       PrepareControlHierarchy ();\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 FormView '" + 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
+\r
+#endif\r
index b61dbb371d466238f98bc6122755cf49b8f6269f..ed20ae5a75c39a7805fb9ef4231b5cd990e8ba32 100644 (file)
@@ -2,6 +2,10 @@
 
        * FormViewTest.cs: removed NotWorking attributes
                        
+2006-10-30 Igor Zelmanovich <igorz@mainsoft.com>
+
+       * FormViewTest.cs: removed NotWorking attributes
+                       
 2006-10-30 Igor Zelmanovich <igorz@mainsoft.com>
 
        * DetailsViewTest.cs: removed NotWorking attributes
index 49e402a20d8e7b3b53108378aafe1354df437400..0702fc1b6dda601605298d619967d43279e8ba6a 100644 (file)
@@ -1168,7 +1168,6 @@ namespace MonoTests.System.Web.UI.WebControls
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                [ExpectedException (typeof (ArgumentOutOfRangeException))]\r
                public void PageIndexException ()\r
                {\r
@@ -1344,7 +1343,6 @@ CommandEventArgs cargs = new CommandEventArgs ("Page", "Prev");
                }\r
 \r
                [Test]\r
-               [Category ("NotWorking")]\r
                public void FormView_RenderFooterAndPager()\r
                {\r
                        string RenderedPageHtml = new WebTest ("FormViewTest1.aspx").Run ();                    \r