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
8 * Implementation: yes
\r
11 * (C) Gaurav Vaish (2001)
\r
15 using System.Collections;
\r
16 using System.ComponentModel;
\r
18 using System.Web.UI;
\r
19 using System.Web.Util;
\r
21 namespace System.Web.UI.WebControls
\r
23 [DefaultEvent("SelectedIndexChanged")]
\r
24 [DefaultProperty("DataSource")]
\r
26 //[DataBindingHandler("??")]
\r
27 [ParseChildren(true, "Items")]
\r
28 public abstract class ListControl: WebControl
\r
30 private static readonly object SelectedIndexChangedEvent = new object();
\r
32 private object dataSource;
\r
33 private ListItemCollection items;
\r
35 private int cachedSelectedIndex = -1;
\r
37 public ListControl(): base(HtmlTextWriterTag.Select)
\r
41 public event EventHandler SelectedIndexChanged
\r
45 Events.AddHandler(SelectedIndexChangedEvent, value);
\r
49 Events.RemoveHandler(SelectedIndexChangedEvent, value);
\r
53 public virtual bool AutoPostBack
\r
57 object o = ViewState["AutoPostBack"];
\r
64 ViewState["AutoPostBack"] = value;
\r
68 public virtual string DataMember
\r
72 object o = ViewState["DataMember"];
\r
75 return String.Empty;
\r
79 ViewState["DataMember"] = value;
\r
83 public virtual object DataSource
\r
93 if(value is IListSource || value is IEnumerable)
\r
99 throw new ArgumentException(HttpRuntime.FormatResourceString(ID, "Invalid DataSource Type"));
\r
103 public virtual string DataTextField
\r
107 object o = ViewState["DataTextField"];
\r
110 return String.Empty;
\r
114 ViewState["DataTextField"] = value;
\r
118 public virtual string DataTextFormatString
\r
122 object o = ViewState["DataTextFormatString"];
\r
125 return String.Empty;
\r
129 ViewState["DataTextFormatString"] = value;
\r
133 public virtual string DataValueField
\r
137 object o = ViewState["DataValueField"];
\r
140 return String.Empty;
\r
144 ViewState["DataValueField"] = value;
\r
148 public virtual ListItemCollection Items
\r
154 items = new ListItemCollection();
\r
155 if(IsTrackingViewState)
\r
157 items.TrackViewState();
\r
164 public virtual int SelectedIndex
\r
167 ListItemCollection items = Items;
\r
168 int last = items.Count;
\r
169 for (int i = 0; i < last; i++) {
\r
170 if (items [i].Selected)
\r
176 if (value < -1 || value > Items.Count)
\r
177 throw new ArgumentOutOfRangeException ();
\r
181 Items [value].Selected = true;
\r
185 public virtual ListItem SelectedItem
\r
189 int idx = SelectedIndex;
\r
193 return Items [idx];
\r
198 public virtual string SelectedValue {
\r
200 int idx = SelectedIndex;
\r
204 return Items [idx].Value;
\r
208 ListItem item = null;
\r
210 if (value != null) {
\r
211 item = Items.FindByValue (value);
\r
213 throw new ArgumentOutOfRangeException (value);
\r
218 item.Selected = true;
\r
223 internal virtual ArrayList SelectedIndices
\r
227 ArrayList si = new ArrayList();
\r
228 for(int i=0; i < Items.Count; i++)
\r
230 if(Items[i].Selected)
\r
237 internal void Select(ArrayList indices)
\r
240 foreach(object intObj in indices)
\r
242 int index = (int)intObj;
\r
243 if(index >= 0 && index < Items.Count)
\r
244 Items[index].Selected = true;
\r
248 public virtual void ClearSelection()
\r
250 for(int i=0; i < Items.Count; i++)
\r
252 Items[i].Selected = false;
\r
256 protected override void LoadViewState(object savedState)
\r
258 //Order: BaseClass, Items (Collection), Indices
\r
259 if(savedState != null && savedState is Triplet)
\r
261 Triplet state = (Triplet)savedState;
\r
262 base.LoadViewState(state.First);
\r
263 Items.LoadViewState(state.Second);
\r
264 object indices = state.Third;
\r
265 if(indices != null)
\r
267 Select((ArrayList)indices);
\r
272 protected override void OnDataBinding(EventArgs e)
\r
274 base.OnDataBinding(e);
\r
275 IEnumerable ds = DataSourceHelper.GetResolvedDataSource (DataSource, DataMember);
\r
278 string dtf = DataTextField;
\r
279 string dvf = DataValueField;
\r
280 string dtfs = DataTextFormatString;
\r
281 if (dtfs.Length == 0)
\r
286 bool useProperties = (dtf.Length > 0 && dvf.Length > 0);
\r
288 foreach (object current in ds) {
\r
289 ListItem li = new ListItem();
\r
290 if (!useProperties){
\r
291 li.Text = String.Format (dtfs, current);
\r
292 li.Value = current.ToString ();
\r
298 if (dtf.Length > 0) {
\r
299 o = DataBinder.GetPropertyValue (current, dtf, null);
\r
300 li.Text = o.ToString ();
\r
303 if (dvf.Length > 0) {
\r
304 o = DataBinder.GetPropertyValue (current, dvf, null);
\r
305 li.Value = o.ToString ();
\r
312 if (cachedSelectedIndex != -1) {
\r
313 SelectedIndex = cachedSelectedIndex;
\r
314 cachedSelectedIndex = -1;
\r
318 protected virtual void OnSelectedIndexChanged(EventArgs e)
\r
322 EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);
\r
328 protected override void OnPreRender (EventArgs e)
\r
330 base.OnPreRender(e);
\r
333 protected override object SaveViewState()
\r
335 //Order: BaseClass, Items (Collection), Indices
\r
336 object vs = base.SaveViewState();
\r
337 object itemSvs = Items.SaveViewState();
\r
338 object indices = null;
\r
339 if (SaveSelectedIndicesViewState)
\r
340 indices = SelectedIndices;
\r
342 if (vs != null || itemSvs != null || indices != null)
\r
343 return new Triplet(vs, itemSvs, indices);
\r
348 protected override void TrackViewState()
\r
350 base.TrackViewState();
\r
351 Items.TrackViewState();
\r
354 private bool SaveSelectedIndicesViewState {
\r
356 if (Events[SelectedIndexChangedEvent] == null && Enabled && Visible) {
\r
357 Type t = GetType();
\r
358 // If I am a derivative, let it take of storing the selected indices.
\r
359 if (t == typeof(DropDownList) || t == typeof(ListBox) ||
\r
360 t == typeof(CheckBoxList) || t == typeof(RadioButtonList))
\r