如何在运行时克隆控件事件处理程序
本文关键字:控件 事件处理 程序 运行时 | 更新日期: 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
{
}
可以在分部类中进行更改,因此无需创建事件