我想创建一个用户控件,用户可以在设计时为其添加按钮。
所以我创建了一个名为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属性中的集合编辑器添加按钮,并在按下集合编辑器表单的“添加”按钮后立即在用户控件上查看它们。