2006-11-09 Igor Zelmanovich <igorz@mainsoft.com>
authorIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Wed, 8 Nov 2006 16:46:25 +0000 (16:46 -0000)
committerIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Wed, 8 Nov 2006 16:46:25 +0000 (16:46 -0000)
* GridView.cs: fixed: DataKeys, PageCount, DataBinding flow.

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

mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web/System.Web.UI.WebControls/GridView.cs
mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web/Test/System.Web.UI.WebControls/GridViewTest.cs

index 21ae36b5a0fb501df2889d9f1662a1f358ceb06f..a7cdcdf3bcca8942f3dc6affabee3059bda9658a 100644 (file)
@@ -1,3 +1,7 @@
+2006-11-09 Igor Zelmanovich <igorz@mainsoft.com>
+
+       * GridView.cs: fixed: DataKeys, PageCount, DataBinding flow.
+
 2006-11-09 Igor Zelmanovich <igorz@mainsoft.com>
 
        * DataBoundControl.cs: fixed: 
index 5eede0633fecefae18944b76142b948e232e020e..9dc8405feb2842b57246875fa1d13f86d6166fd2 100644 (file)
@@ -74,6 +74,7 @@ namespace System.Web.UI.WebControls
                TableItemStyle pagerStyle;
                TableItemStyle rowStyle;
                TableItemStyle selectedRowStyle;
+               ArrayList _dataKeyArrayList;
                DataKeyArray keys;
                DataKey oldEditValues;
                AutoGeneratedFieldProperties[] autoFieldProperties;
@@ -98,7 +99,6 @@ namespace System.Web.UI.WebControls
                
                // Control state
                int pageIndex;
-               int pageCount;
                int selectedIndex = -1;
                int editIndex = -1;
                SortDirection sortDirection = SortDirection.Ascending;
@@ -518,16 +518,38 @@ namespace System.Web.UI.WebControls
                                RequireBinding ();
                        }
                }
+
+               ArrayList DataKeyArrayList {
+                       get {
+                               if (_dataKeyArrayList == null) {
+                                       _dataKeyArrayList = new ArrayList ();
+                               }
+                               return _dataKeyArrayList;
+                       }
+               }
                
                [BrowsableAttribute (false)]
                [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
                public virtual DataKeyArray DataKeys {
                        get {
-                               EnsureDataBound ();
+                               if (keys == null) {
+                                       keys = new DataKeyArray (DataKeyArrayList);
+                                       if (IsTrackingViewState)
+                                               ((IStateManager) keys).TrackViewState ();
+                               }
                                return keys;
                        }
                }
 
+               DataKey OldEditValues {
+                       get {
+                               if (oldEditValues == null) {
+                                       oldEditValues = new DataKey (new OrderedDictionary ());
+                               }
+                               return oldEditValues;
+                       }
+               }
+
                [WebCategoryAttribute ("Misc")]
                [DefaultValueAttribute (-1)]
                public virtual int EditIndex {
@@ -716,9 +738,10 @@ namespace System.Web.UI.WebControls
                [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
                public virtual int PageCount {
                        get {
-                               if (pageCount != 0) return pageCount;
-                               EnsureDataBound ();
-                               return pageCount;
+                               return ViewState.GetInt ("PageCount", 0);
+                       }
+                       private set {
+                               ViewState ["PageCount"] = value;
                        }
                }
 
@@ -835,7 +858,7 @@ namespace System.Web.UI.WebControls
                [DesignerSerializationVisibilityAttribute (DesignerSerializationVisibility.Hidden)]
                public virtual DataKey SelectedDataKey {
                        get {
-                               if (DataKeys == null)
+                               if (keys == null)
                                        throw new InvalidOperationException ("DataKeys");
 
                                if (selectedIndex >= 0 && selectedIndex < DataKeys.Count) {
@@ -1124,7 +1147,6 @@ namespace System.Web.UI.WebControls
                {
                        if (Initialized) {
                                RequiresDataBinding = true;
-                               pageCount = -1;
                        }
                }
                
@@ -1153,7 +1175,7 @@ namespace System.Web.UI.WebControls
                                        }
                                }
                                
-                               pageCount = dataSource.PageCount;
+                               PageCount = dataSource.PageCount;
                        }
                        else
                        {
@@ -1173,7 +1195,6 @@ namespace System.Web.UI.WebControls
                        Controls.Add (table);
                                
                        ArrayList list = new ArrayList ();
-                       ArrayList keyList = new ArrayList ();
                        
                        // Creates the set of fields to show
                        
@@ -1213,12 +1234,8 @@ namespace System.Web.UI.WebControls
                                        OnRowDataBound (new GridViewRowEventArgs (row));
                                        if (EditIndex == row.RowIndex)
                                                oldEditValues = new DataKey (GetRowValues (row, false, true));
-                                       keyList.Add (new DataKey (CreateRowDataKey (row), DataKeyNames));
-                               } else {
-                                       if (EditIndex == row.RowIndex)
-                                               oldEditValues = new DataKey (new OrderedDictionary ());
-                                       keyList.Add (new DataKey (new OrderedDictionary (), DataKeyNames));
-                               }
+                                       DataKeyArrayList.Add (new DataKey (CreateRowDataKey (row), DataKeyNames));
+                               } 
 
                                if (list.Count >= PageSize)
                                        break;
@@ -1242,7 +1259,6 @@ namespace System.Web.UI.WebControls
                        }
 
                        rows = new GridViewRowCollection (list);
-                       keys = new DataKeyArray (keyList);
 
                        return dataSource.DataSourceCount;
                }
@@ -1378,8 +1394,11 @@ namespace System.Web.UI.WebControls
                
                public sealed override void DataBind ()
                {
+                       DataKeyArrayList.Clear ();
                        cachedKeyProperties = null;
                        base.DataBind ();
+
+                       keys = new DataKeyArray (DataKeyArrayList);
                }
                
                protected internal override void PerformDataBinding (IEnumerable data)
@@ -1657,10 +1676,7 @@ namespace System.Web.UI.WebControls
                        
                        if (rowIndex != EditIndex) throw new NotSupportedException ();
 
-                       if (oldEditValues == null)
-                               currentEditOldValues = new OrderedDictionary ();
-                       else
-                               currentEditOldValues = oldEditValues.Values;
+                       currentEditOldValues = OldEditValues.Values;
 
                        GridViewRow row = Rows [rowIndex];
                        currentEditRowKeys = DataKeys [rowIndex].Values;
@@ -1732,12 +1748,15 @@ namespace System.Web.UI.WebControls
                        object[] state = (object[]) ob;
                        base.LoadControlState (state[0]);
                        pageIndex = (int) state[1];
-                       pageCount = (int) state[2];
-                       selectedIndex = (int) state[3];
-                       editIndex = (int) state[4];
-                       sortExpression = (string) state[5];
-                       sortDirection = (SortDirection) state[6];
-                       DataKeyNames = (string []) state [7];
+                       selectedIndex = (int) state[2];
+                       editIndex = (int) state[3];
+                       sortExpression = (string) state[4];
+                       sortDirection = (SortDirection) state[5];
+                       DataKeyNames = (string []) state [6];
+                       if (state [7] != null)
+                               LoadDataKeyArrayState ((object []) state [7]);
+                       if (state [8] != null)
+                               ((IStateManager) OldEditValues).LoadViewState (state [8]);
                }
                
                protected internal override object SaveControlState ()
@@ -1749,11 +1768,41 @@ namespace System.Web.UI.WebControls
                        }
 
                        object bstate = base.SaveControlState ();
-                       return new object[] {
-                               bstate, pageIndex, pageCount, selectedIndex, editIndex, sortExpression, sortDirection, DataKeyNames
+                       return new object [] {
+                               bstate, 
+                               pageIndex, 
+                               selectedIndex, 
+                               editIndex, 
+                               sortExpression, 
+                               sortDirection, 
+                               DataKeyNames,
+                               SaveDataKeyArrayState (),
+                               (oldEditValues == null ? null : ((IStateManager)oldEditValues).SaveViewState ())
                                        };
                }
-               
+
+               object [] SaveDataKeyArrayState ()
+               {
+                       if (keys == null)
+                               return null;
+
+                       object [] state = new object [keys.Count];
+                       for (int i = 0; i < keys.Count; i++) {
+                               state [i] = ((IStateManager) keys [i]).SaveViewState ();
+                       }
+                       return state;
+               }
+
+               void LoadDataKeyArrayState (object [] state)
+               {
+                       for (int i = 0; i < state.Length; i++) {
+                               DataKey dataKey = new DataKey (new OrderedDictionary (DataKeyNames.Length), DataKeyNames);
+                               ((IStateManager) dataKey).LoadViewState (state [i]);
+                               DataKeyArrayList.Add (dataKey);
+                       }
+                       keys = new DataKeyArray (DataKeyArrayList);
+               }
+
                protected override void TrackViewState()
                {
                        base.TrackViewState();
@@ -1776,7 +1825,7 @@ namespace System.Web.UI.WebControls
 
                protected override object SaveViewState()
                {
-                       object[] states = new object [14];
+                       object[] states = new object [12];
                        states[0] = base.SaveViewState();
                        states[1] = (columns == null ? null : ((IStateManager)columns).SaveViewState());
                        states[2] = (pagerSettings == null ? null : ((IStateManager)pagerSettings).SaveViewState());
@@ -1788,8 +1837,6 @@ namespace System.Web.UI.WebControls
                        states[8] = (selectedRowStyle == null ? null : ((IStateManager)selectedRowStyle).SaveViewState());
                        states[9] = (editRowStyle == null ? null : ((IStateManager)editRowStyle).SaveViewState());
                        states[10] = (emptyDataRowStyle == null ? null : ((IStateManager)emptyDataRowStyle).SaveViewState());
-                       states[11] = (keys == null ? null : ((IStateManager)keys).SaveViewState());
-                       states[12] = (oldEditValues == null ? null : ((IStateManager)oldEditValues).SaveViewState());
                        
                        if (autoFieldProperties != null) {
                                object[] data = new object [autoFieldProperties.Length];
@@ -1798,7 +1845,7 @@ namespace System.Web.UI.WebControls
                                        data [n] = ((IStateManager)autoFieldProperties [n]).SaveViewState ();
                                        if (data [n] != null) allNull = false;
                                }
-                               if (!allNull) states [13] = data;
+                               if (!allNull) states [11] = data;
                        }
 
                        for (int i = states.Length - 1; i >= 0; i--) {
@@ -1818,8 +1865,8 @@ namespace System.Web.UI.WebControls
 
                        object [] states = (object []) savedState;
                        
-                       if (states[13] != null) {
-                               object[] data = (object[]) states [13];
+                       if (states[11] != null) {
+                               object[] data = (object[]) states [11];
                                autoFieldProperties = new AutoGeneratedFieldProperties [data.Length];
                                for (int n=0; n<data.Length; n++) {
                                        IStateManager p = new AutoGeneratedFieldProperties ();
@@ -1830,7 +1877,6 @@ namespace System.Web.UI.WebControls
                        }
 
                        base.LoadViewState (states[0]);
-                       EnsureChildControls ();
                        
                        if (states[1] != null) ((IStateManager)Columns).LoadViewState (states[1]);
                        if (states[2] != null) ((IStateManager)PagerSettings).LoadViewState (states[2]);
@@ -1842,8 +1888,6 @@ namespace System.Web.UI.WebControls
                        if (states[8] != null) ((IStateManager)SelectedRowStyle).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) ((IStateManager)DataKeys).LoadViewState (states[11]);
-                       if (states[12] != null && oldEditValues != null) ((IStateManager)oldEditValues).LoadViewState (states[12]);
                }
                
                void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)
index f50deea8ea108ee963a3cb1cc71e68017e2e720c..8963d2ce688326d9e4722a82a3118b6c8b90f9a3 100644 (file)
@@ -1,3 +1,7 @@
+2006-11-09  Igor Zelmanovich   <igorz@mainsoft.com>
+
+       * GridViewTest.cs: added tests, removed NotWorking attributes.
+
 2006-11-09  Igor Zelmanovich   <igorz@mainsoft.com>
 
        * DataBoundControlTest.cs: added test.
index 6ed7b806e2a23a7bf9466796d8e4ca383916ecfc..b129a293a5997b5fc93d3972ce2a973a7ddbd5ac 100644 (file)
@@ -298,6 +298,11 @@ namespace MonoTests.System.Web.UI.WebControls
                {
                        base.LoadControlState (savedState);
                }
+
+               public void SetRequiresDataBinding (bool value)
+               {
+                       RequiresDataBinding = value;
+               }
        }
 
        [Serializable]
@@ -549,6 +554,82 @@ namespace MonoTests.System.Web.UI.WebControls
                
                }
 
+               [Test]
+               public void GridView_PageCount () {
+                       Page p = new Page ();
+
+                       PokerGridView gv = new PokerGridView ();
+                       gv.PageSize = 3;
+                       gv.AllowPaging = true;
+                       p.Controls.Add (gv);
+
+                       ObjectDataSource data = new ObjectDataSource ();
+                       data.ID = "ObjectDataSource1";
+                       data.TypeName = typeof (DataSourceObject).AssemblyQualifiedName;
+                       data.SelectMethod = "GetList";
+                       p.Controls.Add (data);
+
+                       gv.DataSourceID = "ObjectDataSource1";
+                       gv.SetRequiresDataBinding (true);
+
+                       Assert.AreEqual (0, gv.PageCount, "PageCount before binding");
+
+                       gv.DataBind ();
+
+                       Assert.AreEqual (2, gv.PageCount, "PageCount after binding");
+
+                       PokerGridView copy = new PokerGridView ();
+                       copy.LoadState (gv.SaveState ());
+
+                       Assert.AreEqual (2, copy.PageCount, "PageCount from ViewState");
+               }
+
+               [Test]
+               public void GridView_DataKeys () {
+                       Page p = new Page ();
+
+                       PokerGridView gv = new PokerGridView ();
+                       p.Controls.Add (gv);
+
+                       ObjectDataSource data = new ObjectDataSource ();
+                       data.TypeName = typeof (DataObject).AssemblyQualifiedName;
+                       data.SelectMethod = "Select";
+                       p.Controls.Add (data);
+
+                       gv.DataSource = data;
+                       gv.DataKeyNames = new string [] { "ID", "FName" };
+
+                       DataKeyArray keys1 = gv.DataKeys;
+
+                       Assert.AreEqual (0, keys1.Count, "DataKeys count before binding");
+
+                       gv.DataBind ();
+
+                       DataKeyArray keys2 = gv.DataKeys;
+                       DataKeyArray keys3 = gv.DataKeys;
+
+                       Assert.IsFalse (Object.ReferenceEquals (keys1, keys2), "DataKey returns the same instans");
+                       Assert.IsTrue (Object.ReferenceEquals (keys2, keys3), "DataKey returns the same instans");
+
+                       Assert.AreEqual (1, keys1.Count, "DataKeys count after binding");
+                       Assert.AreEqual (1001, keys1 [0].Value, "DataKey.Value after binding");
+                       Assert.AreEqual (2, keys1 [0].Values.Count, "DataKey.Values count after binding");
+                       Assert.AreEqual (1001, keys1 [0].Values [0], "DataKey.Values[0] after binding");
+                       Assert.AreEqual ("Mahesh", keys1 [0].Values [1], "DataKey.Values[1] after binding");
+
+                       PokerGridView copy = new PokerGridView ();
+                       object state = gv.DoSaveControlState ();
+                       copy.DoLoadControlState (state);
+
+                       DataKeyArray keys4 = copy.DataKeys;
+
+                       Assert.AreEqual (1, keys4.Count, "DataKeys count from ControlState");
+                       Assert.AreEqual (1001, keys4 [0].Value, "DataKey.Value from ControlState");
+                       Assert.AreEqual (2, keys4 [0].Values.Count, "DataKey.Values count from ControlState");
+                       Assert.AreEqual (1001, keys4 [0].Values [0], "DataKey.Values[0] from ControlState");
+                       Assert.AreEqual ("Mahesh", keys4 [0].Values [1], "DataKey.Values[1] from ControlState");
+               }
+
                // MSDN: The CreateDataSourceSelectArguments method is a helper method called by 
                // the GridView control to create the DataSourceSelectArguments object that 
                // contains the arguments passed to the data source. In this implementation, 
@@ -638,9 +719,9 @@ namespace MonoTests.System.Web.UI.WebControls
                        Assert.AreEqual (SortDirection.Descending, e.SortDirection, "GridViewSortEventArgs.SortDirection");
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
+               [Test]
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
 #endif
                public void GridView_DataBind()
                {
@@ -761,8 +842,8 @@ namespace MonoTests.System.Web.UI.WebControls
                }
 
                [Test]
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
 #endif
                public void GridView_CreateChildControls ()
                {
@@ -836,10 +917,10 @@ namespace MonoTests.System.Web.UI.WebControls
                        }
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
-#endif\r
+               [Test]
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
+#endif
                public void GridView_InitializePager ()
                {
                        PokerGridView gv = new PokerGridView ();
@@ -1234,10 +1315,10 @@ namespace MonoTests.System.Web.UI.WebControls
                        pageIndexChanged = true;
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
-#endif\r
+               [Test]
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
+#endif
                public void GridView_PerformDataBiding ()
                {
                        PokerGridView gv = new PokerGridView ();
@@ -1245,10 +1326,10 @@ namespace MonoTests.System.Web.UI.WebControls
                        Assert.AreEqual (6, gv.Rows.Count, "PerformDataBiding_Rows");
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
-#endif\r
+               [Test]
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
+#endif
                public void GridView_PrepareControlHierarchy ()
                {
                        PokerGridView gv = new PokerGridView ();
@@ -1293,10 +1374,10 @@ namespace MonoTests.System.Web.UI.WebControls
                        Assert.AreEqual(-1 ,b.Render().IndexOf("table"), "RenderViewState");
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
-               [Category ("NotWorking")]\r
-#endif\r
+               [Test]
+#if TARGET_JVM //BUG #6484
+               [Category ("NotWorking")]
+#endif
                public void GridView_Render ()
                {
                        PokerGridView b = new PokerGridView ();
@@ -1325,8 +1406,8 @@ namespace MonoTests.System.Web.UI.WebControls
                        HtmlDiff.AssertAreEqual (OriginControlHtml, RenderedControlHtml, "Rendering");
                }
 
-               [Test]\r
-#if TARGET_JVM //BUG #6484\r
+               [Test]
+#if TARGET_JVM //BUG #6484
                [Category ("NotWorking")]
 #endif
                public void GridView_RenderAllowPaging ()
@@ -2062,7 +2143,6 @@ namespace MonoTests.System.Web.UI.WebControls
 
                [Test]
                [Category ("NunitWeb")]
-               [Category ("NotWorking")]
                public void GridView_PostBackUpdateItem ()
                {
                        WebTest t = new WebTest ();
@@ -2091,7 +2171,7 @@ namespace MonoTests.System.Web.UI.WebControls
                        fr.Controls["__EVENTARGUMENT"].Value = "Edit$0";
                        
                        t.Request = fr;
-                       t.Run ();
+                       pageHTML = t.Run ();
 
                        merged_data = t.UserData as string[];
                        if (merged_data == null) {
@@ -2146,6 +2226,21 @@ namespace MonoTests.System.Web.UI.WebControls
 
                        grid.ID = "Grid";
                        grid.AutoGenerateEditButton = true;
+                       
+                       grid.AutoGenerateColumns = false;
+                       
+                       BoundField field = new BoundField ();
+                       field.DataField = "ID";
+                       grid.Columns.Add (field);
+
+                       field = new BoundField ();
+                       field.DataField = "FName";
+                       grid.Columns.Add (field);
+
+                       field = new BoundField ();
+                       field.DataField = "LName";
+                       grid.Columns.Add (field);
+
                        grid.DataSourceID = "ObjectDataSource2";
                        p.Form.Controls.Add (ds);
                        p.Form.Controls.Add (grid);