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
197 internal virtual ArrayList SelectedIndices
\r
201 ArrayList si = new ArrayList();
\r
202 for(int i=0; i < Items.Count; i++)
\r
204 if(Items[i].Selected)
\r
211 internal void Select(ArrayList indices)
\r
214 foreach(object intObj in indices)
\r
216 int index = (int)intObj;
\r
217 if(index >= 0 && index < Items.Count)
\r
218 Items[index].Selected = true;
\r
222 public virtual void ClearSelection()
\r
224 for(int i=0; i < Items.Count; i++)
\r
226 Items[i].Selected = false;
\r
230 protected override void LoadViewState(object savedState)
\r
232 //Order: BaseClass, Items (Collection), Indices
\r
233 if(savedState != null && savedState is Triplet)
\r
235 Triplet state = (Triplet)savedState;
\r
236 base.LoadViewState(state.First);
\r
237 Items.LoadViewState(state.Second);
\r
238 object indices = state.Third;
\r
239 if(indices != null)
\r
241 Select((ArrayList)indices);
\r
246 protected override void OnDataBinding(EventArgs e)
\r
248 base.OnDataBinding(e);
\r
249 IEnumerable ds = DataSourceHelper.GetResolvedDataSource (DataSource, DataMember);
\r
252 string dtf = DataTextField;
\r
253 string dvf = DataValueField;
\r
254 string dtfs = DataTextFormatString;
\r
255 if (dtfs.Length == 0)
\r
260 bool useProperties = (dtf.Length > 0 && dvf.Length > 0);
\r
262 foreach (object current in ds) {
\r
263 ListItem li = new ListItem();
\r
264 if (!useProperties){
\r
265 li.Text = String.Format (dtfs, current);
\r
266 li.Value = current.ToString ();
\r
272 if (dtf.Length > 0) {
\r
273 o = DataBinder.GetPropertyValue (current, dtf, null);
\r
274 li.Text = o.ToString ();
\r
277 if (dvf.Length > 0) {
\r
278 o = DataBinder.GetPropertyValue (current, dvf, null);
\r
279 li.Value = o.ToString ();
\r
286 if (cachedSelectedIndex != -1) {
\r
287 SelectedIndex = cachedSelectedIndex;
\r
288 cachedSelectedIndex = -1;
\r
292 protected virtual void OnSelectedIndexChanged(EventArgs e)
\r
296 EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);
\r
302 protected override void OnPreRender (EventArgs e)
\r
304 base.OnPreRender(e);
\r
307 protected override object SaveViewState()
\r
309 //Order: BaseClass, Items (Collection), Indices
\r
310 object vs = base.SaveViewState();
\r
311 object itemSvs = Items.SaveViewState();
\r
312 object indices = null;
\r
313 if(SaveSelectedIndicesViewState)
\r
314 indices = SelectedIndices;
\r
315 if(vs!= null && itemSvs != null && indices != null)
\r
317 return new Triplet(vs, itemSvs, indices);
\r
322 protected override void TrackViewState()
\r
324 base.TrackViewState();
\r
325 Items.TrackViewState();
\r
328 private bool SaveSelectedIndicesViewState
\r
332 if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)
\r
334 Type t = GetType();
\r
335 // If I am a derivative, let it take of storing the selected indices.
\r
336 if(t == typeof(DropDownList) || t == typeof(ListBox) || t == typeof(CheckBoxList) || t == typeof(RadioButtonList))
\r