ListControl.cs 5.8 KB

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