使用自定义集合编辑器以避免生成对象变量

2005-10-07 by 开心就好

看到这个问题,怎样让自定义控件的子控件不会自动生成变量定义? 研究了一下Table对象,发现,你需要使用自定义的集合编辑器,示范编码如下

using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Web.UI.Design.WebControls;
using System.Drawing.Design;
using System.Reflection;</p>
<p>namespace CSDNControls
{
    [ToolboxData(&quot;&lt;{0}:ColorToolbar runat=server&gt;&lt;/{0}:ColorToolbar&gt;&quot;)]
    public class ColorToolbar : System.Web.UI.WebControls.WebControl
    {
        ColorButtonCollection colorButtons;</p>
<pre><code>    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ColorButtonCollection Buttons
    {
        get
        {
            if (colorButtons == null)
                colorButtons = new ColorButtonCollection(this);

            return colorButtons;
        }
    }
}

[ToolboxItem(false)]
public class ColorButton : Button
{

}

[Editor(typeof(ColorButtonCollectionEditor),typeof(UITypeEditor))]
public class ColorButtonCollection : CollectionBase
{
    private Control _owner;

    internal ColorButtonCollection(Control owner)
    {
        this._owner = owner;
    }

    public ColorButton this[int Index]
    {
        get
        {
            return (ColorButton) List[Index];
        }
    }
    public bool Contains(ColorButton btn)
    {
        return List.Contains(btn);
    }
    public int Add(ColorButton btn)
    {
        int i;
        i = List.Add(btn);
        _owner.Controls.Add(btn);
        return i;
    }

    public void Insert( int index, ColorButton btn )
    {
        List.Insert( index, btn );
        _owner.Controls.AddAt(index,btn);
    }

    public int IndexOf( ColorButton btn)
    {
        return List.IndexOf( btn );
    }

    public void Remove(ColorButton btn)
    {
        List.Remove(btn);
        _owner.Controls.Remove(btn);
    }

}



public class ColorButtonCollectionEditor : CollectionEditor
{

    public ColorButtonCollectionEditor(Type type) : base(type){}
    //protected override bool CanSelectMultipleInstances() {return false;}
    protected override object CreateInstance(Type itemType)
    {
        return Activator.CreateInstance(itemType, BindingFlags.CreateInstance | (BindingFlags.Public | BindingFlags.Instance), null, null, null);
    }
}

Comments