2011-05-19 110 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