2001-12-01 Gaurav Vaish <gvaish@iitk.ac.in>
authorGaurav Vaish <gvaish@mono-cvs.ximian.com>
Sat, 1 Dec 2001 04:56:03 +0000 (04:56 -0000)
committerGaurav Vaish <gvaish@mono-cvs.ximian.com>
Sat, 1 Dec 2001 04:56:03 +0000 (04:56 -0000)
* ListControl.cs  --- Pretty descent. Looks complete.

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

mcs/class/System.Web/System.Web.UI.WebControls/ListControl.cs

index 36d06237d3e27e06cd4fd39006ae5066b0c9e0d4..98a73400ee752eeb1e25145ed468afc8bb232648 100644 (file)
@@ -5,7 +5,7 @@
  * Author:  Gaurav Vaish\r
  * Maintainer: gvaish@iitk.ac.in\r
  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Status:  10%\r
+ * Status:  100%\r
  *\r
  * (C) Gaurav Vaish (2001)\r
  */\r
@@ -44,59 +44,6 @@ namespace System.Web.UI.WebControls
                        }\r
                }\r
                \r
-               protected virtual void OnSelectedIndexChanged(EventArgs e)\r
-               {\r
-                       if(Events!=null)\r
-                               {\r
-                                       EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);\r
-                                       if(eh!=null)\r
-                                               eh(this, e);\r
-                               }\r
-               }\r
-               \r
-               protected override void OnDataBinding(EventArgs e)\r
-               {\r
-                       base.OnDataBinding(e);\r
-                       IEnumerable resolvedData = DataSourceHelper.GetResolvedDataSource(DataSource, DataMember);\r
-                       if(resolvedData != null)\r
-                       {\r
-                               string dataTextField = DataTextField;\r
-                               string dataValueField = DataValueField;\r
-                               Items.Clear();\r
-                               ICollection rdsCollection = resolvedDataSource as ICollection;\r
-                               if(rdsCollection != null)\r
-                               {\r
-                                       Items.Capacity = rdsCollection.Count;\r
-                               }\r
-                               bool valid = ( (dataTextField.Length >= 0) && (dataValueField.Length >=0) );\r
-                               foreach(IEnumerable current in resolvedDataSource.GetEnumerator())\r
-                               {\r
-                                       ListItem li = new ListItem();\r
-                                       if(valid)\r
-                                       {\r
-                                               if(dataTextField.Length >= 0)\r
-                                               {\r
-                                                       li.Text = DataBinder.GetPropertyValue(current, dataTextField, null);\r
-                                               }\r
-                                               if(dataValueField.Length >= 0)\r
-                                               {\r
-                                                       li.Value = DataBinder.GetPropertyValue(current, dataValueField, null);\r
-                                               }\r
-                                       } else\r
-                                       {\r
-                                               li.Text  = dataTextField.ToString();\r
-                                               li.Value = dataValueField.ToString();\r
-                                       }\r
-                                       Items.Add(li);\r
-                               }\r
-                       }\r
-                       if(cachedSelectedIndex != -1)\r
-                       {\r
-                               SelectedIndex = cachedSelectedIndex;\r
-                               cachedSelectedIndex = -1;\r
-                       }\r
-               }\r
-               \r
                public virtual bool AutoPostBack\r
                {\r
                        get\r
@@ -219,24 +166,12 @@ namespace System.Web.UI.WebControls
                        }\r
                        set\r
                        {\r
+                               if(value < -1 || value > Items.Count)\r
+                                       throw new ArgumentOutOfRangeException();\r
                                ViewState["SelectedIndex"] = value;\r
                        }\r
                }\r
                \r
-               internal virtual int[] SelectedIndices\r
-               {\r
-                       get\r
-                       {\r
-                               ArrayList si = new ArrayList();\r
-                               for(int i=0; i < Items.Count; i++)\r
-                               {\r
-                                       if(Items[i].Selected)\r
-                                               ArrayList.Add(i);\r
-                               }\r
-                               int[] indices = (int[])si.ToArray();\r
-                       }\r
-               }\r
-               \r
                public virtual ListItem SelectedItem\r
                {\r
                        get\r
@@ -248,22 +183,22 @@ namespace System.Web.UI.WebControls
                                return null;\r
                        }\r
                }\r
-               \r
-               internal virtual ArrayList SelectedIndexes\r
+\r
+               internal virtual ArrayList SelectedIndices\r
                {\r
                        get\r
                        {\r
-                               ArrayList retVal = new ArrayList();\r
-                               int index = 0;\r
-                               while(index < Items.Count)\r
+                               ArrayList si = new ArrayList();\r
+                               for(int i=0; i < Items.Count; i++)\r
                                {\r
-                                       retVal.Add(Items[index++]);\r
+                                       if(Items[i].Selected)\r
+                                               ArrayList.Add(i);\r
                                }\r
-                               return retVal;\r
+                               return si;\r
                        }\r
                }\r
                \r
-               internal void Select(int[] indices)\r
+               internal void Select(ArrayList indices)\r
                {\r
                        ClearSelection();\r
                        foreach(int index in indices)\r
@@ -283,17 +218,108 @@ namespace System.Web.UI.WebControls
                \r
                protected override void LoadViewState(object savedState)\r
                {\r
-                       //TODO: Implement me\r
-                       throw new NotImplementedException();\r
+                       //Order: BaseClass, Items (Collection), Indices\r
+                       if(savedState != null)\r
+                       {\r
+                               Triplet state = (Triplet)savedState;\r
+                               base.LoadViewState(state.First);\r
+                               Items.LoadViewState(state.Second);\r
+                               object indices = state.Third;\r
+                               if(indices != null)\r
+                               {\r
+                                       Select((ArrayList)indices);\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               protected override void OnDataBinding(EventArgs e)\r
+               {\r
+                       base.OnDataBinding(e);\r
+                       IEnumerable resolvedData = DataSourceHelper.GetResolvedDataSource(DataSource, DataMember);\r
+                       if(resolvedData != null)\r
+                       {\r
+                               string dataTextField = DataTextField;\r
+                               string dataValueField = DataValueField;\r
+                               Items.Clear();\r
+                               ICollection rdsCollection = resolvedDataSource as ICollection;\r
+                               if(rdsCollection != null)\r
+                               {\r
+                                       Items.Capacity = rdsCollection.Count;\r
+                               }\r
+                               bool valid = ( (dataTextField.Length >= 0) && (dataValueField.Length >=0) );\r
+                               foreach(IEnumerable current in resolvedDataSource.GetEnumerator())\r
+                               {\r
+                                       ListItem li = new ListItem();\r
+                                       if(valid)\r
+                                       {\r
+                                               if(dataTextField.Length >= 0)\r
+                                               {\r
+                                                       li.Text = DataBinder.GetPropertyValue(current, dataTextField, null);\r
+                                               }\r
+                                               if(dataValueField.Length >= 0)\r
+                                               {\r
+                                                       li.Value = DataBinder.GetPropertyValue(current, dataValueField, null);\r
+                                               }\r
+                                       } else\r
+                                       {\r
+                                               li.Text  = dataTextField.ToString();\r
+                                               li.Value = dataValueField.ToString();\r
+                                       }\r
+                                       Items.Add(li);\r
+                               }\r
+                       }\r
+                       if(cachedSelectedIndex != -1)\r
+                       {\r
+                               SelectedIndex = cachedSelectedIndex;\r
+                               cachedSelectedIndex = -1;\r
+                       }\r
+               }\r
+               \r
+               protected virtual void OnSelectedIndexChanged(EventArgs e)\r
+               {\r
+                       if(Events!=null)\r
+                               {\r
+                                       EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);\r
+                                       if(eh!=null)\r
+                                               eh(this, e);\r
+                               }\r
                }\r
                \r
                protected override object SaveViewState()\r
                {\r
+                       //Order: BaseClass, Items (Collection), Indices\r
                        object vs = base.SaveViewState();\r
+                       object itemSvs = Items.SaveViewState();\r
                        object indices = null;\r
-                       if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)\r
+                       if(SaveSelectedIndicesViewState)\r
                                indices = SelectedIndices;\r
-                       if(indices != null)\r
+                       if(vs!= null && itemSvs != null && indices != null)\r
+                       {\r
+                               return new Triplet(vs, itemSvs, indices);\r
+                       }\r
+                       return null;\r
+               }\r
+               \r
+               protected ovrride void TrackViewState()\r
+               {\r
+                       base.TrackViewState();\r
+                       Items.TrackViewState();\r
+               }\r
+               \r
+               private bool SaveSelectedIndicesViewState\r
+               {\r
+                       get\r
+                       {\r
+                               if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)\r
+                               {\r
+                                       Type t = GetType();\r
+                                       // If I am a derivative, let it take of storing the selected indices.\r
+                                       // Why should I bother.\r
+                                       if(t == typeof(DropDownList) || t == typeof(ListBox) || t == typeof(CheckBoxList) || t == typeof(RadioButtonList))\r
+                                               return false;\r
+                               }\r
+                               return true;\r
+                       }\r
                }\r
        }\r
 }\r