Internet Explorer 6.0IEVisual Studio .NET 2003WebForms.NET 1.1HTML中级开发Visual StudioWindows.NETASP.NETC#
适用于 ASP.NET 的自定义 ComboBox 控件






3.82/5 (17投票s)
2005年4月12日

241445

2284
一个适用于 ASP.NET 的自定义 ComboBox 控件。
引言
在我的工作中,我需要一个 ComboBox 服务器控件,但没有一个控件具有我需要的规格。 经过大量的搜索和尝试,没有一个能够满足我的要求,我需要一个能够像下拉列表一样工作,并且能够获取输入值的控件。 但是我从 这里 获得了一个 HTML ComboBox 控件,这正是我想要的。 因此,我基于这个 HTML ComboBox 控件开发了一个 ComboBox 服务器控件,并决定与大家分享。
背景
HTML 组件是通过一个文本框和一个 Select 元素构建的,Select 元素在运行时动态重新定位。 我的工作将 HTML 组件封装为 ASP.NET 服务器控件,您可以像在 ASP.NET 中使用典型的列表控件一样使用它。
使用代码
您可以通过以下三种方式使用此控件
for(int i=1; i < 10; i++)
{
ComboItem item = new ComboItem("Item"+i.ToString());
ComboBox1.Items.Add(item);
}
<bestcomy:ComboBox id="ComboBox2" runat="server" Width="120px">
<BESTCOMY:COMBOITEM Text="Item1"></BESTCOMY:COMBOITEM>
<BESTCOMY:COMBOITEM Text="Item2"></BESTCOMY:COMBOITEM>
<BESTCOMY:COMBOITEM Text="Item3" Selected="true"></BESTCOMY:COMBOITEM>
<BESTCOMY:COMBOITEM Text="Item4"></BESTCOMY:COMBOITEM>
</bestcomy:ComboBox>
DataTable dt = new DataTable();
dt.Columns.Add("text", typeof(string));
for(int i=1; i < 10; i++)
{
DataRow ndr = dt.NewRow();
ndr["text"] = "Item" + i.ToString();
dt.Rows.Add(ndr);
}
ComboBox3.DataSource = dt.DefaultView;
ComboBox3.DataTextField = "text";
ComboBox3.DataBind();
关注点
在往返过程中保持ViewState 确实很有趣。 您可以在以下脚本中看到我是如何实现的
ComboBox.cs
protected override void TrackViewState()
{
base.TrackViewState ();
((IStateManager)this.Items).TrackViewState();
}
protected override object SaveViewState()
{
object obj1 = base.SaveViewState();
object obj2 = ((IStateManager)this.Items).SaveViewState();
object obj3 = this.Text;
if(obj1==null && obj2==null && obj3==null)
return null;
return new Triplet(obj1,obj2,obj3);
}
protected override void LoadViewState(object savedState)
{
if(savedState!=null)
{
Triplet state = (Triplet)savedState;
base.LoadViewState(state.First);
((IStateManager)this.Items).LoadViewState(state.Second);
_text = (string)state.Third;
}
}
ComboItemCollection.cs
public void TrackViewState()
{
this._IsTrackingViewState = true;
for(int i=0; i < this._items.Count; i++)
{
((IStateManager)this[i]).TrackViewState();
}
}
public bool IsTrackingViewState
{
get
{
return this._IsTrackingViewState;
}
}
public object SaveViewState()
{
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
for (int num3 = 0; num3 < this.Count; num3++)
{
object obj1 = ((IStateManager)this[num3]).SaveViewState();
if (obj1 != null)
{
list1.Add(num3);
list2.Add(obj1);
}
}
if (list1.Count > 0)
{
return new Pair(list1, list2);
}
return null;
}
public void LoadViewState(object state)
{
if (state == null)
{
return;
}
if (state is Pair)
{
Pair pair1 = (Pair) state;
ArrayList list1 = (ArrayList) pair1.First;
ArrayList list2 = (ArrayList) pair1.Second;
for (int num1 = 0; num1 < list1.Count; num1++)
{
int num2 = (int) list1[num1];
if (num2 < this.Count)
{
((IStateManager)this[num2]).LoadViewState(list2[num1]);
}
else
{
ComboItem item1 = new ComboItem();
((IStateManager)item1).LoadViewState(list2[num1]);
this.Add(item1);
}
}
}
}
ComboItem.cs
public void TrackViewState()
{
this._IsTrackingViewState = true;
}
public bool IsTrackingViewState
{
get
{
return this._IsTrackingViewState;
}
}
public object SaveViewState()
{
return new Pair(this._text,this._selected);
}
public void LoadViewState(object state)
{
if(state!=null && state is Pair)
{
Pair p = (Pair)state;
this._text = (string)p.First;
this._selected = (bool)p.Second;
}
}
历史
- 2005 年 4 月 28 日 - 支持
Items
的设计时支持。 - 2005 年 4 月 7 日 - 首次发布。