我有一个包含很多按钮的面板(右侧面板)。我想在运行时动态将具有相同属性和事件的所选按钮的快捷方式添加到另一个面板(左侧面板)。 按钮具有许多属性,例如图像,文本,背景色,前色等。
这些按钮还将在主面板内打开新表单:
private void butntest_Click(object sender, EventArgs e)
{
this.main_panel.Controls.Clear();
Form1 myForm = new Form1();
myForm.TopLevel = false;
myForm.AutoScroll = true;
this.main_panel.Controls.Add(myForm);
myForm.Show();
}
如何在左侧面板上创建快捷方式?
答案 0 :(得分:0)
像这样创建类Button
Button leftpannelbutton = new Button(); leftpannelbutton = button1.Clone();
现在leftpannelbutton等同于button1。现在,只需将其添加到您的表单即可。
查找以下内容(反思)
public static class ControlExtensions
{
public static T Clone<T>(this T controlToClone)
where T : Control
{
PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
T instance = Activator.CreateInstance<T>();
foreach (PropertyInfo propInfo in controlProperties)
{
if (propInfo.CanWrite)
{
if(propInfo.Name != "WindowTarget")
propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
}
}
return instance;
}
}
答案 1 :(得分:0)
您可以创建一个接受按钮作为输入的克隆方法,并根据输入按钮的属性创建另一个按钮,还可以处理克隆按钮的click事件,而只需调用输入按钮的PerformClick
方法:>
public Button Clone(Button input)
{
var output = new Button();
output.Text = input.Text;
// do the same for other properties that you need to clone
output.Click += (s,e)=>input.PerformClick();
return output;
}
然后您可以通过以下方式使用它:
var btn = Clone(button1);
panel1.Controls.Add(btn);
也最好使用FlowLayoutPanel
或TableLayoutPanel
来代替面板,因此您无需亲自处理位置和布局。
注意:如果它是动态用户界面,并且用户可以对命令按钮进行重新排序或创建快捷方式,那么下一步可能需要存储面板状态以便能够在应用程序关闭后,在下次加载应用程序时重新加载按钮。在这种情况下,最好考虑像命令模式这样的模式。然后,您可以将命令作为类。然后,您可以说出哪个按钮负责在运行时运行哪个命令,并且只需使用按钮和命令的名称存储它们之间的关系即可。