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

本文关键字:控件 事件处理 程序 运行时 | 更新日期: 2023-09-27 17:56:48

我想复制一个控件,如按钮、文本框等。但是我不知道如何将事件处理程序方法(如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);

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

btn2.Click += btn1_Click

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

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

/// <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();
}

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

<%= btn1.Render() %>

如果你想修改副本上的文本,你可以在渲染的html上做一个字符串替换,或者你可以在原始按钮上设置文本,并在asx中的Render调用后重置它,即:

<% btn1.Text = "Text for original button"; %>

我不明白你的问题正确。可以像这样将一个事件附加到多个控件。

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

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

public class DuplicateButton : OrginalButton
{
}

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