我想复制像Button,TextBox等控件 但我不知道如何将事件处理程序方法(如Click
)复制到新的控件。如何在运行时克隆控件事件处理程序?
我现在下面的代码:
var btn2 = new Button();
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click
是否有任何其他方式复制控制?
我想复制像Button,TextBox等控件 但我不知道如何将事件处理程序方法(如Click
)复制到新的控件。如何在运行时克隆控件事件处理程序?
我现在下面的代码:
var btn2 = new Button();
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click
是否有任何其他方式复制控制?
克隆所有事件的任何WinForms控件:
var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerList = eventsField.GetValue(button1);
eventsField.SetValue(button2, eventHandlerList);
也许吧。但是这是否记录在某处?是否“事件”保证是所有永恒领域的名称?此外,看起来类似的解决方案[这里](http://www.codeproject.com/KB/cs/DelegateFromEvent.aspx)。 – 2011-05-19 07:51:03
非常感谢! – mrbm 2011-05-19 07:54:59
@Cody - 它在.NET 2,3.5和4中工作。稍后它会工作 - 没人知道。这是一个黑客?是的。 – 2011-05-19 07:57:09
我没有正确理解你的问题。您可以将一个事件附加到像这样的多个控件。
Button1.Click += button_click;
Button2.Click += button_click;
是的我现在,假设我不知道“button_click”函数,我只有Button1,并且我想要获得链接到Click事件的函数。 – mrbm 2011-05-19 07:20:21
然后我觉得你需要调用Button.PerformClick()方法。它将执行关联的点击事件。 – Anuraj 2011-05-19 07:27:45
是的,这很好,但我不能直接使用它,btn2.Click + = new EventHandler(btn1.PerformClick);错误>>没有重载'PerformClick'匹配委托'System.EventHandler' – mrbm 2011-05-19 07:33:12
您只需要add the event handler方法为新的按钮控制。 C#使用+=
运算符来完成此操作。所以你可以简单地写:
btn2.Click += btn1_Click
或者,一个更强大的方法是use reflection。这里特别使用的将是EventInfo.AddEventHandler
method。
但我想重复控制,我不知道“btn1_Click”函数 – mrbm 2011-05-19 07:22:48
@mrbm:正如我在Vimvq1987的回答中所提到的,如果你不' t在运行时知道事件处理程序方法的名称,则需要使用反射。这有点复杂,但更强大。我提供的链接有完整的示例代码。 – 2011-05-19 07:24:25
不知道为什么你想要复制,但简单的复制过去会创建一个新的控件实例。 – 2011-05-19 07:15:33
你想在运行时创建一个我们说按钮的副本吗?使用与上一个按钮相同的事件处理程序? – 2011-05-19 07:18:36
@哈里斯哈桑:是的,我有。 – mrbm 2011-05-19 07:29:55