我想複製像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