65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 ASP.NET 的自定义 ComboBox 控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (17投票s)

2005年4月12日

viewsIcon

241445

downloadIcon

2284

一个适用于 ASP.NET 的自定义 ComboBox 控件。

Sample Image

引言

在我的工作中,我需要一个 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 日 - 首次发布。
© . All rights reserved.