2011-05-19 74 views
7

我想复制像Button,TextBox等控件 但我不知道如何将事件处理程序方法(如Click)复制到新的控件。如何在运行时克隆控件事件处理程序?

我现在下面的代码:

var btn2 = new Button(); 
btn2.Text = btn1.Text; 
btn2.size = btn1.size; 
// ... 
btn2.Click ??? btn1.Click 

是否有任何其他方式复制控制?

+0

不知道为什么你想要复制,但简单的复制过去会创建一个新的控件实例。 – 2011-05-19 07:15:33

+0

你想在运行时创建一个我们说按钮的副本吗?使用与上一个按钮相同的事件处理程序? – 2011-05-19 07:18:36

+0

@哈里斯哈桑:是的,我有。 – mrbm 2011-05-19 07:29:55

回答

12

克隆所有事件的任何WinForms控件:

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance); 
var eventHandlerList = eventsField.GetValue(button1); 
eventsField.SetValue(button2, eventHandlerList); 
+0

也许吧。但是这是否记录在某处?是否“事件”保证是所有永恒领域的名称?此外,看起来类似的解决方案[这里](http://www.codeproject.com/KB/cs/DelegateFromEvent.aspx)。 – 2011-05-19 07:51:03

+0

非常感谢! – mrbm 2011-05-19 07:54:59

+0

@Cody - 它在.NET 2,3.5和4中工作。稍后它会工作 - 没人知道。这是一个黑客?是的。 – 2011-05-19 07:57:09

0

我没有正确理解你的问题。您可以将一个事件附加到像这样的多个控件。

Button1.Click += button_click; 
Button2.Click += button_click; 
+0

是的我现在,假设我不知道“button_click”函数,我只有Button1,并且我想要获得链接到Click事件的函数。 – mrbm 2011-05-19 07:20:21

+0

然后我觉得你需要调用Button.PerformClick()方法。它将执行关联的点击事件。 – Anuraj 2011-05-19 07:27:45

+0

是的,这很好,但我不能直接使用它,btn2.Click + = new EventHandler(btn1.PerformClick);错误>>没有重载'PerformClick'匹配委托'System.EventHandler' – mrbm 2011-05-19 07:33:12

5

您只需要add the event handler方法为新的按钮控制。 C#使用+=运算符来完成此操作。所以你可以简单地写:

btn2.Click += btn1_Click 

或者,一个更强大的方法是use reflection。这里特别使用的将是EventInfo.AddEventHandler method

+3

但我想重复控制,我不知道“btn1_Click”函数 – mrbm 2011-05-19 07:22:48

+0

@mrbm:正如我在Vimvq1987的回答中所提到的,如果你不' t在运行时知道事件处理程序方法的名称,则需要使用反射。这有点复杂,但更强大。我提供的链接有完整的示例代码。 – 2011-05-19 07:24:25

-5

更好的办法是使用一个组件类和继承的控制,该类

public class DuplicateButton : OrginalButton 
{ 

} 

你可以在局部类的变化,所以没有必要创建事件

+0

我不这么认为。事件附加到按钮的一个实例,而不是类本身。继承不起作用,在这种情况下 – Vimvq1987 2011-05-19 07:34:15

+0

我想复制一个控件而不是一个类! – mrbm 2011-05-19 07:35:23

+1

这与这个问题有什么关系? – 2011-05-19 07:52:12