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

时间:2011-05-19 07:10:27

标签: c# .net winforms controls event-handling

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

我现在有以下代码:

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

有没有其他方法可以复制控件?

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

您只需要add the event handler方法来进行新的按钮控件。 C#使用+=运算符来执行此操作。所以你可以写一下:

btn2.Click += btn1_Click

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

答案 2 :(得分:1)

如果您只是想复制最终将呈现的HTML元素(包括附加的事件处理程序),则可以使用以下扩展方法来输出HTML的副本。

return std::wstring(reinterpret_cast<const wchar_t*>(qString.utf16()));

然后您可以使用它来将副本放置在aspx标记中,如下所示:

/// <summary>
/// Render Control to HTML as string
/// </summary>
public static string Render(this System.Web.UI.Control control)
{
    var sb = new StringBuilder();
    System.IO.StringWriter stWriter = new System.IO.StringWriter(sb);
    System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stWriter);
    control.RenderControl(htmlWriter);
    return sb.ToString();
}

例如,如果您要修改副本上的文本,则可以在“渲染的html”上执行字符串“替换”,或者可以将“文本”设置为原始按钮,然后在<%= btn1.Render() %> 调用后进行重置在asx中,即:

Render

答案 3 :(得分:0)

我没有正确理解你的问题。您可以将一个事件附加到多个控件,如下所示。

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

答案 4 :(得分:-5)

更好的方法是使用组件类并将控件继承到该类

public class DuplicateButton : OrginalButton
{

}

您可以在分部类中进行更改,因此无需创建事件