WinForms - 自定义集合&馆藏编辑

时间:2018-04-09 22:31:58

标签: winforms collections user-controls custom-controls

我想创建一个用户控件,用户可以在设计时为其添加按钮。

所以我创建了一个名为ButtonsContainer的类继承自UserControl,我还创建了一个继承自CollectionBase的类ButtonsCollection,在ButtonsContainer类(用户控件)中我添加了一个ButtonsCollection类型的属性,以便用户可以在设计时为集合添加按钮。

现在我希望当用户通过集合编辑器添加按钮时(在设计时),该按钮将在用户控件上显示,因此我在ButtonsCollection类中放置了一个事件ButtonAdded,当该事件被触发时调用ButtonsCollection的Add函数。但它不起作用,当我将用户控件放在窗体上,我通过集合编辑器添加按钮,按钮在用户控件上不可见,就在我运行程序时(即在运行时),我看到按钮我在设计时添加了在用户控件上可见的代码:

Class ButtonsCollection:

[Serializable]
public class ButtonsCollection : CollectionBase
{
    public ButtonsCollection() {}

    public event EventHandler ButtonAdded;

    public void Add(Button button)
    {
        List.Add(button);   
        ButtonAdded?.Invoke(this, new EventArgs());                       
    }
}

Class ButtonsContainer:

Designer(typeof(ParentControlDesigner))
public partial class ButtonsContainer : UserControl
{
    public ButtonsContainer()
    {
        InitializeComponent();
        Buttons = new ButtonsCollection();
        Buttons.ButtonAdded += new EventHandler(ButtonAdded);
    }

    private void ButtonAdded(Object sender, EventArgs e)
    {
        Button btn = new Button();
        btn = Buttons[Buttons.Count - 1];
        this.Controls.Add(btn);
        btn.Location = new Point(1, Buttons.Count * btn.Size.Height);
        btn.Visible = true;
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ButtonsCollection Buttons
    {
        get; private set;
    } 
}

注意:当我单击属性网格中的Buttons属性时,将显示CollectionEditor表单。

正如我们所看到的,事件ButtonAdded被触发正常,但是当我通过Buttons属性(集合编辑器)手动添加按钮(在设计时)时,用户控件上看不到这些按钮。

基本上,我想通过Buttons属性中的集合编辑器添加按钮,并在按下集合编辑器表单的“添加”按钮后立即在用户控件上查看它们。

0 个答案:

没有答案