我在Web項目的開發過程中很多時候都要用到ComboBox,找了很多類似的控件來用發現都不盡如人意,我所希望的能夠在WEB上使用的ComboBox應該就是在DropDownList的功能上加入了文本輸入功能,我個人比較看重的一點就是下拉列表應該可以伸展到浏覽器之外,然而目前大多數的ComboBox要麼是用DIV來顯示選擇項,要麼就是用TextBox+ListBox,DIV的方式會不能伸展到浏覽器之外,而TextBox+ListBox方式ListBox占用頁面空間。後來發現了A DHTML combo box , 於是決定基於此HTC開發一個ASP.NET服務器控件.
關鍵類設計
ComboBox : 關鍵是有一個Text屬性獲取控件值,沒有SelectedIndexChanged事件(我覺得該事件對ComboBox來說不是很重要,當然你也可以根據你自己的需要增加對此事件的支持),Items屬性當然是必不可少的;
ComboItem : 相對於ListItem來說我沒有設計Value屬性;
ComboItemCollection : 這是ComboItem的集合類,實現了ICollection接口,其功能類似ListItemCollection。
實現ViewState
實現ViewState是我個人覺得最有趣的部分,根據類的層次結構,先看看ComboItem如何實現ViewState,其實很簡單,就是實現System.Web.UI.IStateManager接口:
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;
}
}