2007-02-06 Igor Zelmanovich <igorz@mainsoft.com>
authorIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Tue, 6 Feb 2007 16:10:46 +0000 (16:10 -0000)
committerIgor Zelmanovich <igorz@mono-cvs.ximian.com>
Tue, 6 Feb 2007 16:10:46 +0000 (16:10 -0000)
* FormView.cs: fixed:
works properly with not ICollection data source.

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

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/FormViewTest.cs

index 2b1a65c0e4624510f8117a30b310bacdd4c3a379..652db4bb784b1b3f219cba74b0a07970d2e357d7 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-06 Igor Zelmanovich <igorz@mainsoft.com>
+
+       * FormView.cs: fixed: 
+       works properly with not ICollection data source.        
+
 2007-02-06 Igor Zelmanovich <igorz@mainsoft.com>
 
        * DetailsView.cs: fixed: 
index b767043281bd89ef37add6ffb08eb9107d1ae44d..d6bea58a959271f2960431efb1f932ceff1614c7 100644 (file)
@@ -687,6 +687,9 @@ namespace System.Web.UI.WebControls
                        get {
                                return pageCount;
                        }
+                       private set {
+                               pageCount = value;
+                       }
                }
 
                [WebCategoryAttribute ("Paging")]
@@ -840,7 +843,6 @@ namespace System.Web.UI.WebControls
                protected virtual FormViewRow CreateRow (int rowIndex, DataControlRowType rowType, DataControlRowState rowState)
                {
                        FormViewRow row = new FormViewRow (rowIndex, rowType, rowState);
-                       OnItemCreated (EventArgs.Empty);
                        return row;
                }
                
@@ -862,7 +864,7 @@ namespace System.Web.UI.WebControls
                                if (RequiresDataBinding) {
                                        OnDataBinding (EventArgs.Empty);
                                        RequiresDataBinding = false;
-                                       PerformDataBinding (new object [] { null });
+                                       PerformDataBinding (null);
                                        MarkAsDataBound ();
                                        OnDataBound (EventArgs.Empty);
                                }
@@ -881,7 +883,7 @@ namespace System.Web.UI.WebControls
                protected override int CreateChildControls (IEnumerable data, bool dataBinding)
                {
                        PagedDataSource dataSource = new PagedDataSource ();
-                       dataSource.DataSource = data;
+                       dataSource.DataSource = CurrentMode != FormViewMode.Insert ? data : null;
                        dataSource.AllowPaging = AllowPaging;
                        dataSource.PageSize = 1;
                        dataSource.CurrentPageIndex = PageIndex;
@@ -895,27 +897,47 @@ namespace System.Web.UI.WebControls
                                }
                        }
 
-                       pageCount = dataSource.DataSourceCount;
-                       bool showPager = AllowPaging && (pageCount > 1);
+                       bool showPager = AllowPaging && (dataSource.PageCount > 1);
                        
                        Controls.Clear ();
                        table = CreateTable ();
                        Controls.Add (table);
+                       headerRow = null;
+                       footerRow = null;
+                       topPagerRow = null;
+                       bottomPagerRow = null;
 
                        // Gets the current data item
-                       
-                       IEnumerator e = dataSource.GetEnumerator (); 
-                       dataItem = null;
 
                        if (AllowPaging) {
-                               if (e.MoveNext ())
-                                       dataItem = e.Current;
+                               PageCount = dataSource.DataSourceCount;
+                               if (PageIndex >= PageCount && PageCount > 0) {
+                                       pageIndex = dataSource.CurrentPageIndex = PageCount - 1;
+                               }
+                               if (dataSource.DataSource != null) {
+                                       IEnumerator e = dataSource.GetEnumerator ();
+                                       if (e.MoveNext ())
+                                               dataItem = e.Current;
+                               }
                        }
-                       else
-                       for (int page = 0; e.MoveNext (); page++ )
-                               if (page == PageIndex)
-                                       dataItem = e.Current;
-                       
+                       else {
+                               int page = 0;
+                               object lastItem = null;
+                               if (dataSource.DataSource != null) {
+                                       IEnumerator e = dataSource.GetEnumerator ();
+                                       for (; e.MoveNext (); page++) {
+                                               lastItem = e.Current;
+                                               if (page == PageIndex)
+                                                       dataItem = e.Current;
+                                       }
+                               }
+                               PageCount = page;
+                               if (PageIndex >= PageCount && PageCount > 0) {
+                                       pageIndex = PageCount - 1;
+                                       dataItem = lastItem;
+                               }
+                       }
+
                        // Main table creation
                        
                        if (HeaderText.Length != 0 || headerTemplate != null) {
@@ -930,7 +952,7 @@ namespace System.Web.UI.WebControls
                                table.Rows.Add (topPagerRow);
                        }
 
-                       if (pageCount > 0) {
+                       if (PageCount > 0) {
                                DataControlRowState rstate = GetRowState ();
                                itemRow = CreateRow (0, DataControlRowType.DataRow, rstate);
                                InitializeRow (itemRow);
@@ -966,7 +988,9 @@ namespace System.Web.UI.WebControls
                        if (dataBinding)
                                DataBind (false);
                        
-                       return dataSource.DataSourceCount;
+                       OnItemCreated (EventArgs.Empty);
+
+                       return PageCount;
                }
                
                DataControlRowState GetRowState ()
index 420723020d69a001fedae9d168f45ac56a46170e..2556a36b88d4799d52dcc31afcc4c9bb6d29820f 100644 (file)
@@ -618,7 +618,43 @@ namespace MonoTests.System.Web.UI.WebControls
                        Assert.AreEqual (7, fv.DoCreateChildControls (myds, false), "CreateChildControlFromViewState");
                        myds.Remove ("item7");
 
-               }
+               }\r
+\r
+               class MyEnumSource : IEnumerable\r
+               {\r
+                       int _count;\r
+\r
+                       public MyEnumSource (int count) {\r
+                               _count = count;\r
+                       }\r
+\r
+                       #region IEnumerable Members\r
+\r
+                       public IEnumerator GetEnumerator () {\r
+\r
+                               for (int i = 0; i < _count; i++)\r
+                                       yield return i;\r
+                       }\r
+\r
+                       #endregion\r
+               }\r
+\r
+               [Test]\r
+               public void FormView_CreateChildControls2 ()\r
+               {\r
+                       Poker fv = new Poker ();\r
+                       fv.Page = new Page ();\r
+                       fv.DataSource = new MyEnumSource (20);\r
+                       fv.DataBind ();\r
+                       \r
+                       Assert.AreEqual (20, fv.PageCount, "CreateChildControls#0");\r
+\r
+                       Assert.AreEqual (0, fv.DoCreateChildControls (new MyEnumSource (0), true), "CreateChildControls#1");\r
+                       Assert.AreEqual (20, fv.DoCreateChildControls (new MyEnumSource (20), true), "CreateChildControls#2");\r
+\r
+                       Assert.AreEqual (0, fv.DoCreateChildControls (new object [0], false), "CreateChildControls#3");\r
+                       Assert.AreEqual (5, fv.DoCreateChildControls (new object [5], false), "CreateChildControls#4");\r
+               }\r
 
                [Test]
                public void FormView_CreateDataSourceSelectArguments ()