2 // System.Web.UI.WebControls.ListBox.cs
5 // Gaurav Vaish (gvaish@iitk.ac.in)
6 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 // (C) Gaurav Vaish (2002)
9 // (C) 2003 Andreas Nahr
13 using System.Drawing;
\r
14 using System.Collections;
\r
15 using System.Collections.Specialized;
\r
16 using System.ComponentModel;
\r
17 using System.Globalization;
\r
19 using System.Web.UI;
\r
21 namespace System.Web.UI.WebControls
\r
23 [ValidationProperty("SelectedItem")]
\r
24 public class ListBox : ListControl, IPostBackDataHandler
\r
26 public ListBox () : base ()
\r
31 public override Color BorderColor
\r
33 get { return base.BorderColor; }
\r
34 set { base.BorderColor = value; }
\r
38 public override BorderStyle BorderStyle
\r
40 get { return base.BorderStyle; }
\r
41 set { base.BorderStyle = value; }
\r
45 public override Unit BorderWidth
\r
47 get { return base.BorderWidth; }
\r
48 set { base.BorderWidth = value; }
\r
52 [DefaultValue (4), Bindable (true), WebCategory ("Appearance")]
53 [WebSysDescription ("The number of rows displayed by the control.")]
\r
54 public virtual int Rows
\r
57 object o = ViewState ["Rows"];
\r
58 return (o == null) ? 4 : (int) o;
\r
62 if (value < 1 || value > 2000)
\r
63 throw new ArgumentOutOfRangeException ("value", "Rows value has to be >= 0 and <= 2000.");
\r
65 ViewState ["Rows"] = value;
\r
69 [DefaultValue (typeof (ListSelectionMode), "Single"), WebCategory ("Behavior")]
70 [WebSysDescription ("The mode describing how the entries can be selected.")]
\r
71 public virtual ListSelectionMode SelectionMode
\r
75 object o = ViewState ["SelectionMode"];
\r
76 return (o == null) ? ListSelectionMode.Single : (ListSelectionMode) o;
\r
80 if (!Enum.IsDefined (typeof (ListSelectionMode), value))
\r
81 throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");
\r
82 ViewState ["SelectionMode"] = value;
\r
86 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
87 [Bindable (false), EditorBrowsable (EditorBrowsableState.Never)]
\r
88 public override string ToolTip
\r
90 get { return String.Empty; }
\r
91 set { /* Don't do anything. */ }
\r
94 protected override void AddAttributesToRender (HtmlTextWriter writer)
\r
97 Page.VerifyRenderingInServerForm (this);
\r
99 writer.AddAttribute (HtmlTextWriterAttribute.Name, UniqueID);
\r
100 base.AddAttributesToRender (writer);
\r
101 writer.AddAttribute (HtmlTextWriterAttribute.Size,
\r
102 Rows.ToString (NumberFormatInfo.InvariantInfo));
\r
104 if (SelectionMode == ListSelectionMode.Multiple)
\r
105 writer.AddAttribute (HtmlTextWriterAttribute.Multiple, "multiple");
\r
107 if (AutoPostBack && Page != null){
\r
108 writer.AddAttribute (HtmlTextWriterAttribute.Onchange,
\r
109 Page.GetPostBackClientEvent (this, ""));
\r
110 writer.AddAttribute ("language", "javascript");
\r
114 protected override void OnPreRender (EventArgs e)
\r
116 base.OnPreRender (e);
\r
117 if (Page != null && SelectionMode == ListSelectionMode.Multiple && Enabled)
\r
118 Page.RegisterRequiresPostBack(this);
\r
121 protected override void RenderContents (HtmlTextWriter writer)
\r
123 bool isMultAllowed = (SelectionMode == ListSelectionMode.Multiple);
\r
124 bool selMade = false;
\r
125 foreach (ListItem current in Items){
\r
126 writer.WriteBeginTag ("option");
\r
127 if (current.Selected){
\r
128 if (!isMultAllowed && selMade)
\r
129 throw new HttpException ("Cannot_MultiSelect_In_Single_Mode");
\r
131 writer.WriteAttribute ("selected", "selected");
\r
133 writer.WriteAttribute ("value", current.Value, true);
\r
134 writer.Write ('>');
\r
135 writer.Write (HttpUtility.HtmlEncode (current.Text));
\r
136 writer.WriteEndTag ("option");
\r
137 writer.WriteLine ();
\r
141 bool IPostBackDataHandler.LoadPostData (string postDataKey,
\r
142 NameValueCollection postCollection)
\r
144 string[] vals = postCollection.GetValues (postDataKey);
\r
145 bool updated = false;
\r
147 if (SelectionMode == ListSelectionMode.Single){
\r
148 int index = Items.FindByValueInternal (vals [0]);
\r
149 if (SelectedIndex != index){
\r
150 SelectedIndex = index;
\r
154 ArrayList indices = SelectedIndices;
155 int length = vals.Length;
156 ArrayList final = new ArrayList (length);
157 foreach (string current in vals)
\r
158 final.Add (Items.FindByValueInternal (current));
\r
160 if (indices.Count == length) {
161 for (int ctr = 0; ctr < length; ctr++){
162 if (((int) final [ctr]) != ((int) indices [ctr])){
174 if (SelectedIndex != -1)
\r
175 SelectedIndex = -1;
\r
181 void IPostBackDataHandler.RaisePostDataChangedEvent ()
\r
183 OnSelectedIndexChanged (EventArgs.Empty);
\r