如何在运行时克隆控件事件处理程序?

mrb*_*rbm 9 .net c# controls event-handling winforms

我想复制像Button,TextBox等控件.但我不知道如何将事件处理程序方法(如Click)复制到新控件.

我现在有以下代码:

var btn2 = new Button();  
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来复制控件?

Ale*_*Aza 14

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

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerList = eventsField.GetValue(button1);
eventsField.SetValue(button2, eventHandlerList);
Run Code Online (Sandbox Code Playgroud)

  • 对任何想要这样做的人来说,这只是一个警告。Component 类中的事件字段是一个 EventHandlerList。您在这里所做的只是复制引用(指向其在内存中的位置的指针),这样两个组件现在共享相同的列表。每当您修改任一组件(从其复制或复制到的组件)中任何事件的事件处理程序列表时,您都在修改两者的事件处理程序列表。请注意这一点,并确保这就是您想要做的,并且不会给您带来任何问题。我会小心地称之为“克隆”。这更像是“分享”。 (5认同)

Cod*_*ray 5

您只需要为新的按钮控件添加事件处理程序方法.C#使用+=运算符来执行此操作.所以你可以简单地写:

btn2.Click += btn1_Click
Run Code Online (Sandbox Code Playgroud)

或者,一种更强大的方法是使用反射.这里特别有用的是EventInfo.AddEventHandler方法.

  • 但我想要重复控制,我不知道"btn1_Click"功能 (3认同)