+ //Order: BaseClass, Items (Collection), Indices\r
+ if(savedState != null && savedState is Triplet)\r
+ {\r
+ Triplet state = (Triplet)savedState;\r
+ base.LoadViewState(state.First);\r
+ Items.LoadViewState(state.Second);\r
+ object indices = state.Third;\r
+ if(indices != null)\r
+ {\r
+ Select((ArrayList)indices);\r
+ }\r
+ }\r
+ }\r
+
+ #if NET_1_2
+ protected override void PerformDataBinding ()
+ {
+ base.PerformDataBinding ();
+ IEnumerable ds = GetResolvedDataSource ();
+ #else\r
+ protected override void OnDataBinding(EventArgs e)\r
+ {\r
+ base.OnDataBinding(e);\r
+ IEnumerable ds = DataSourceHelper.GetResolvedDataSource (DataSource, DataMember);
+ #endif\r
+ if(ds != null) {\r
+ string dtf = DataTextField;\r
+ string dvf = DataValueField;\r
+ string dtfs = DataTextFormatString;\r
+ if (dtfs.Length == 0)\r
+ dtfs = "{0}";\r
+\r
+ Items.Clear();\r
+\r
+ bool dontUseProperties = (dtf.Length == 0 && dvf.Length == 0);\r
+\r
+ foreach (object current in ds) {\r
+ ListItem li = new ListItem();\r
+ if (dontUseProperties){\r
+ li.Text = String.Format (dtfs, current);\r
+ li.Value = current.ToString ();\r
+ Items.Add (li);\r
+ continue;\r
+ }\r
+\r
+ object o;\r
+ if (dtf.Length > 0) {\r
+ o = DataBinder.GetPropertyValue (current, dtf, dtfs);\r
+ li.Text = o.ToString ();\r
+ }\r
+\r
+ if (dvf.Length > 0) {\r
+ o = DataBinder.GetPropertyValue (current, dvf, null);\r
+ li.Value = o.ToString ();\r
+ }\r
+\r
+ Items.Add(li);\r
+ }\r
+ }\r
+
+ if (cachedSelectedValue != null) {
+ int index = Items.FindByValueInternal (cachedSelectedValue);
+ if (index == -1)
+ throw new ArgumentOutOfRangeException("value");
+
+ if (cachedSelectedIndex != -1 && cachedSelectedIndex != index)
+ throw new ArgumentException(HttpRuntime.FormatResourceString(
+ "Attributes_mutually_exclusive", "Selected Index", "Selected Value"));
+
+ SelectedIndex = index;
+ cachedSelectedIndex = -1;
+ cachedSelectedValue = null;
+ return;
+ }
+
+ if (cachedSelectedIndex != -1) {\r
+ SelectedIndex = cachedSelectedIndex;\r
+ cachedSelectedIndex = -1;\r
+ }\r
+ }\r
+\r
+ protected virtual void OnSelectedIndexChanged(EventArgs e)\r
+ {\r
+ if(Events!=null)\r
+ {\r
+ EventHandler eh = (EventHandler)(Events[SelectedIndexChangedEvent]);\r
+ if(eh!=null)\r
+ eh(this, e);\r
+ }\r
+ }\r
+\r
+ protected override void OnPreRender (EventArgs e)\r
+ {\r
+ base.OnPreRender(e);\r
+ }\r
+\r
+ protected override object SaveViewState()\r
+ {\r
+ //Order: BaseClass, Items (Collection), Indices\r
+ object vs = base.SaveViewState();\r
+ object itemSvs = Items.SaveViewState();\r
+ object indices = null;\r
+ if (SaveSelectedIndicesViewState)\r
+ indices = SelectedIndices;\r
+\r
+ if (vs != null || itemSvs != null || indices != null)\r
+ return new Triplet(vs, itemSvs, indices);\r
+\r
+ return null;\r
+ }\r
+\r
+ protected override void TrackViewState()\r
+ {\r
+ base.TrackViewState();\r
+ Items.TrackViewState();\r
+ }\r
+\r
+ private bool SaveSelectedIndicesViewState {\r
+ get {\r
+ if (Events[SelectedIndexChangedEvent] == null && Enabled && Visible) {\r
+ Type t = GetType();\r
+ // If I am a derivative, let it take of storing the selected indices.\r
+ if (t == typeof(DropDownList) || t == typeof(ListBox) ||\r
+ t == typeof(CheckBoxList) || t == typeof(RadioButtonList))\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r