* 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
}\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
}\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
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
\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