2 * Namespace: System.Web.UI.WebControls
\r
5 * Author: Gaurav Vaish
\r
6 * Maintainer: gvaish@iitk.ac.in
\r
7 * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>
\r
10 * (C) Gaurav Vaish (2001)
\r
14 using System.Collections;
\r
15 using System.ComponentModel;
\r
17 using System.Web.UI;
\r
18 using System.Web.Utils;
\r
20 namespace System.Web.UI.WebControls
\r
22 public class ListControl: WebControl
\r
24 private static readonly object SelectedIndexChangedEvent = new object();
\r
26 private object dataSource;
\r
27 private ListItemCollection items;
\r
29 private int cachedSelectedIndex = -1;
\r
31 public ListControl(): base(HtmlTextWriterTag.Select)
\r
35 public event EventHandler SelectedIndexChanged
\r
39 Events.AddHandler(SelectedIndexChangedEvent, value);
\r
43 Events.RemoveHandler(SelectedIndexChangedEvent, value);
\r
47 public virtual bool AutoPostBack
\r
51 object o = ViewState["AutoPostBack"];
\r
58 ViewState["AutoPostBack"] = value;
\r
62 public virtual string DataMember
\r
66 object o = ViewState["DataMember"];
\r
69 return String.Empty;
\r
73 ViewState["DataMember"] = value;
\r
77 public virtual object DataSource
\r
87 if(value is IListSource || value is IEnumerable)
\r
93 throw new ArgumentException(/*HttpRuntime.FormatResourceString(ID, "Invalid DataSource Type")*/);
\r
97 public virtual string DataTextField
\r
101 object o = ViewState["DataTextField"];
\r
104 return String.Empty;
\r
108 ViewState["DataTextField"] = value;
\r
112 public virtual string DataTextFormatString
\r
116 object o = ViewState["DataTextFormatString"];
\r
119 return String.Empty;
\r
123 ViewState["DataTextFormatString"] = value;
\r
127 public virtual string DataValueField
\r
131 object o = ViewState["DataValueField"];
\r
134 return String.Empty;
\r
138 ViewState["DataValueField"] = value;
\r
142 public virtual ListItemCollection Items
\r
148 items = new ListItemCollection();
\r
149 if(IsTrackingViewState)
\r
151 //items.TrackViewState();
\r
158 public virtual int SelectedIndex
\r
162 object o = ViewState["SelectedIndex"];
\r
169 if(value < -1 || value > Items.Count)
\r
170 throw new ArgumentOutOfRangeException();
\r
171 ViewState["SelectedIndex"] = value;
\r
175 public virtual ListItem SelectedItem
\r
179 if(SelectedIndex > 0)
\r
181 return Items[SelectedIndex];
\r
187 internal virtual ArrayList SelectedIndices
\r
191 ArrayList si = new ArrayList();
\r
192 for(int i=0; i < Items.Count; i++)
\r
194 if(Items[i].Selected)
\r
201 internal void Select(ArrayList indices)
\r
204 foreach(int index in indices)
\r
206 if(index >= 0 && index < Items.Count)
\r
207 Items[index].Selected = true;
\r
211 public virtual void ClearSelection()
\r
213 for(int i=0; i < Items.Count; i++)
\r
215 Items[i].Selected = false;
\r
219 protected override void LoadViewState(object savedState)
\r
221 //Order: BaseClass, Items (Collection), Indices
\r
222 if(savedState != null && savedState is Triplet)
\r
224 Triplet state = (Triplet)savedState;
\r
225 base.LoadViewState(state.First);
\r
226 Items.LoadViewState(state.Second);
\r
227 object indices = state.Third;
\r
228 if(indices != null)
\r
230 Select((ArrayList)indices);
\r
235 protected override void OnDataBinding(EventArgs e)
\r
237 base.OnDataBinding(e);
\r
238 IEnumerable resolvedData = DataSourceHelper.GetResolvedDataSource(DataSource, DataMember);
\r
239 if(resolvedData != null)
\r
241 string dataTextField = DataTextField;
\r
242 string dataValueField = DataValueField;
\r
244 ICollection rdsCollection = resolvedDataSource as ICollection;
\r
245 if(rdsCollection != null)
\r
247 Items.Capacity = rdsCollection.Count;
\r
249 bool valid = ( (dataTextField.Length >= 0) && (dataValueField.Length >=0) );
\r
250 foreach(IEnumerable current in resolvedDataSource.GetEnumerator())
\r
252 ListItem li = new ListItem();
\r
255 if(dataTextField.Length >= 0)
\r
257 li.Text = DataBinder.GetPropertyValue(current, dataTextField, null);
\r
259 if(dataValueField.Length >= 0)
\r
261 li.Value = DataBinder.GetPropertyValue(current, dataValueField, null);
\r
265 li.Text = dataTextField.ToString();
\r
266 li.Value = dataValueField.ToString();
\r
271 if(cachedSelectedIndex != -1)
\r
273 SelectedIndex = cachedSelectedIndex;
\r
274 cachedSelectedIndex = -1;
\r
278 protected virtual void OnSelectedIndexChanged(EventArgs e)
\r
282 EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);
\r
288 protected override object SaveViewState()
\r
290 //Order: BaseClass, Items (Collection), Indices
\r
291 object vs = base.SaveViewState();
\r
292 object itemSvs = Items.SaveViewState();
\r
293 object indices = null;
\r
294 if(SaveSelectedIndicesViewState)
\r
295 indices = SelectedIndices;
\r
296 if(vs!= null && itemSvs != null && indices != null)
\r
298 return new Triplet(vs, itemSvs, indices);
\r
303 protected ovrride void TrackViewState()
\r
305 base.TrackViewState();
\r
306 Items.TrackViewState();
\r
309 private bool SaveSelectedIndicesViewState
\r
313 if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)
\r
315 Type t = GetType();
\r
316 // If I am a derivative, let it take of storing the selected indices.
\r
317 // Why should I bother.
\r
318 if(t == typeof(DropDownList) || t == typeof(ListBox) || t == typeof(CheckBoxList) || t == typeof(RadioButtonList))
\r