大家可能都用过Asp.net中的DropDownList控件,该控件有一个Items的集合属性,用于设置组合框的下拉选项。这种体贴的做法让用户倍感温馨,现在,我们也发挥一下自己的的才智,创建一个相同功能的属性。
我们将要创建的控件叫WebPanel,该控件用于网站导航,并且可以收缩,外观如下: 
第一个图是未收缩的效果,第二个是收缩后的效果,虽然不炫,但是足可以说明问题了。
接下来再看一幅图:    
这里,就是Collection属性的编辑器,今天我们就围绕这种效果展开话题。 
在上面的Collection属性的编辑器中,主要分成两个部分,左边的部分是对象的集合,右边部分是选定对象的属性,我们可以对每个属性进行设置赋值。 
首先,我们定义一个类:StringItem,该类有两个自定义属性:Text用于显示的文本,HyperText是导航的超链接。
using System;
using System.Web.UI; 
namespace NSWebPanel
{
    /// <summary>
    /// StringItem 的摘要说明。
    /// </summary>
    /// 
    public class StringItem : System.Web.UI.Control , IStateManager     
    {
        private string _Text;
        private string _HyperText; 
        public StringItem()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        } 
        public string Text
        {
            set
            {
                _Text = value;
            }
            get
            {
                return _Text;
            }
        } 
        public string HyperText
        {
            set
            {
                _HyperText = value;
            }
            get
            {
                return _HyperText;
            }
        }
        #region IStateManager 成员 
        void IStateManager.TrackViewState()
        {
            base.TrackViewState();
        } 
        bool IStateManager.IsTrackingViewState
        {
            get
            {
                return base.IsTrackingViewState;
            }
        } 
        object IStateManager.SaveViewState()
        {           
            return base.SaveViewState();
        } 
        void IStateManager.LoadViewState(object state)
        {
            base.LoadViewState(state);
        } 
        #endregion
    }
} 
然后,再创建一个用于存放多个StringItem对象的类:StringItems,需要注意的是:该类要继承CollectionBase,这样才能使用默认的Collection属性编辑器。
using System;
using System.Collections;
using System.Web.UI; 
namespace NSWebPanel
{
    /// <summary>
    /// StringItems 的摘要说明。
    /// </summary>
    public class StringItems : CollectionBase , IStateManager
    {
        private bool marked; 
        public StringItems() : base()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        } 
        private void Initialize()
        {
            marked = false;
        } 
        public StringItem this[int index]
        {
            get
            {
                return (StringItem)base.List[index];
            }
            set
            {
                List[index] = value;
            }
        } 
        public void Add(StringItem aItem)
        {
            base.List.Add(aItem);
        } 
        public void Remove(int index)
        {
            if(index < base.Count - 1 && index > 0 )
            {
                bas