ListControl.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. /**
  2. * Namespace: System.Web.UI.WebControls
  3. * Class: ListControl
  4. *
  5. * Author: Gaurav Vaish
  6. * Maintainer: [email protected]
  7. * Contact: <[email protected]>, <[email protected]>
  8. * Implementation: yes
  9. * Status: 100%
  10. *
  11. * (C) Gaurav Vaish (2001)
  12. */
  13. using System;
  14. using System.Collections;
  15. using System.ComponentModel;
  16. using System.Web;
  17. using System.Web.UI;
  18. using System.Web.Utils;
  19. namespace System.Web.UI.WebControls
  20. {
  21. public class ListControl: WebControl
  22. {
  23. private static readonly object SelectedIndexChangedEvent = new object();
  24. private object dataSource;
  25. private ListItemCollection items;
  26. private int cachedSelectedIndex = -1;
  27. public ListControl(): base(HtmlTextWriterTag.Select)
  28. {
  29. }
  30. public event EventHandler SelectedIndexChanged
  31. {
  32. add
  33. {
  34. Events.AddHandler(SelectedIndexChangedEvent, value);
  35. }
  36. remove
  37. {
  38. Events.RemoveHandler(SelectedIndexChangedEvent, value);
  39. }
  40. }
  41. public virtual bool AutoPostBack
  42. {
  43. get
  44. {
  45. object o = ViewState["AutoPostBack"];
  46. if(o!=null)
  47. return (bool)o;
  48. return false;
  49. }
  50. set
  51. {
  52. ViewState["AutoPostBack"] = value;
  53. }
  54. }
  55. public virtual string DataMember
  56. {
  57. get
  58. {
  59. object o = ViewState["DataMember"];
  60. if(o!=null)
  61. return (string)o;
  62. return String.Empty;
  63. }
  64. set
  65. {
  66. ViewState["DataMember"] = value;
  67. }
  68. }
  69. public virtual object DataSource
  70. {
  71. get
  72. {
  73. return dataSource;
  74. }
  75. set
  76. {
  77. if(value != null)
  78. {
  79. if(value is IListSource || value is IEnumerable)
  80. {
  81. dataSource = value;
  82. return;
  83. }
  84. }
  85. throw new ArgumentException(HttpRuntime.FormatResourceString(ID, "Invalid DataSource Type"));
  86. }
  87. }
  88. public virtual string DataTextField
  89. {
  90. get
  91. {
  92. object o = ViewState["DataTextField"];
  93. if(o!=null)
  94. return (string)o;
  95. return String.Empty;
  96. }
  97. set
  98. {
  99. ViewState["DataTextField"] = value;
  100. }
  101. }
  102. public virtual string DataTextFormatString
  103. {
  104. get
  105. {
  106. object o = ViewState["DataTextFormatString"];
  107. if(o!=null)
  108. return (string)o;
  109. return String.Empty;
  110. }
  111. set
  112. {
  113. ViewState["DataTextFormatString"] = value;
  114. }
  115. }
  116. public virtual string DataValueField
  117. {
  118. get
  119. {
  120. object o = ViewState["DataValueField"];
  121. if(o!=null)
  122. return (string)o;
  123. return String.Empty;
  124. }
  125. set
  126. {
  127. ViewState["DataValueField"] = value;
  128. }
  129. }
  130. public virtual ListItemCollection Items
  131. {
  132. get
  133. {
  134. if(items==null)
  135. {
  136. items = new ListItemCollection();
  137. if(IsTrackingViewState)
  138. {
  139. items.TrackViewState();
  140. }
  141. }
  142. return items;
  143. }
  144. }
  145. public virtual int SelectedIndex
  146. {
  147. get
  148. {
  149. object o = ViewState["SelectedIndex"];
  150. if(o!=null)
  151. return (int)o;
  152. return -1;
  153. }
  154. set
  155. {
  156. if(value < -1 || value > Items.Count)
  157. throw new ArgumentOutOfRangeException();
  158. ViewState["SelectedIndex"] = value;
  159. }
  160. }
  161. public virtual ListItem SelectedItem
  162. {
  163. get
  164. {
  165. if(SelectedIndex > 0)
  166. {
  167. return Items[SelectedIndex];
  168. }
  169. return null;
  170. }
  171. }
  172. internal virtual ArrayList SelectedIndices
  173. {
  174. get
  175. {
  176. ArrayList si = new ArrayList();
  177. for(int i=0; i < Items.Count; i++)
  178. {
  179. if(Items[i].Selected)
  180. si.Add(i);
  181. }
  182. return si;
  183. }
  184. }
  185. internal void Select(ArrayList indices)
  186. {
  187. ClearSelection();
  188. foreach(object intObj in indices)
  189. {
  190. int index = (int)intObj;
  191. if(index >= 0 && index < Items.Count)
  192. Items[index].Selected = true;
  193. }
  194. }
  195. public virtual void ClearSelection()
  196. {
  197. for(int i=0; i < Items.Count; i++)
  198. {
  199. Items[i].Selected = false;
  200. }
  201. }
  202. protected override void LoadViewState(object savedState)
  203. {
  204. //Order: BaseClass, Items (Collection), Indices
  205. if(savedState != null && savedState is Triplet)
  206. {
  207. Triplet state = (Triplet)savedState;
  208. base.LoadViewState(state.First);
  209. Items.LoadViewState(state.Second);
  210. object indices = state.Third;
  211. if(indices != null)
  212. {
  213. Select((ArrayList)indices);
  214. }
  215. }
  216. }
  217. protected override void OnDataBinding(EventArgs e)
  218. {
  219. base.OnDataBinding(e);
  220. IEnumerable resolvedDataSource = DataSourceHelper.GetResolvedDataSource(DataSource, DataMember);
  221. if(resolvedDataSource != null)
  222. {
  223. string dataTextField = DataTextField;
  224. string dataValueField = DataValueField;
  225. Items.Clear();
  226. ICollection rdsCollection = (ICollection)resolvedDataSource;
  227. if(rdsCollection != null)
  228. {
  229. Items.Capacity = rdsCollection.Count;
  230. }
  231. bool valid = ( (dataTextField.Length >= 0) && (dataValueField.Length >=0) );
  232. foreach(IEnumerable current in resolvedDataSource)
  233. {
  234. ListItem li = new ListItem();
  235. if(valid)
  236. {
  237. if(dataTextField.Length >= 0)
  238. {
  239. li.Text = DataBinder.GetPropertyValue(current, dataTextField, null);
  240. }
  241. if(dataValueField.Length >= 0)
  242. {
  243. li.Value = DataBinder.GetPropertyValue(current, dataValueField, null);
  244. }
  245. } else
  246. {
  247. li.Text = dataTextField.ToString();
  248. li.Value = dataValueField.ToString();
  249. }
  250. Items.Add(li);
  251. }
  252. }
  253. if(cachedSelectedIndex != -1)
  254. {
  255. SelectedIndex = cachedSelectedIndex;
  256. cachedSelectedIndex = -1;
  257. }
  258. }
  259. protected virtual void OnSelectedIndexChanged(EventArgs e)
  260. {
  261. if(Events!=null)
  262. {
  263. EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);
  264. if(eh!=null)
  265. eh(this, e);
  266. }
  267. }
  268. protected override object SaveViewState()
  269. {
  270. //Order: BaseClass, Items (Collection), Indices
  271. object vs = base.SaveViewState();
  272. object itemSvs = Items.SaveViewState();
  273. object indices = null;
  274. if(SaveSelectedIndicesViewState)
  275. indices = SelectedIndices;
  276. if(vs!= null && itemSvs != null && indices != null)
  277. {
  278. return new Triplet(vs, itemSvs, indices);
  279. }
  280. return null;
  281. }
  282. protected override void TrackViewState()
  283. {
  284. base.TrackViewState();
  285. Items.TrackViewState();
  286. }
  287. private bool SaveSelectedIndicesViewState
  288. {
  289. get
  290. {
  291. if( Events[SelectedIndexChangedEvent] != null && Enabled && Visible)
  292. {
  293. Type t = GetType();
  294. // If I am a derivative, let it take of storing the selected indices.
  295. if(t == typeof(DropDownList) || t == typeof(ListBox) || t == typeof(CheckBoxList) || t == typeof(RadioButtonList))
  296. return false;
  297. }
  298. return true;
  299. }
  300. }
  301. }
  302. }