我想复制一个像Button,TextBox等的控件。
但我不知道如何将事件处理程序方法(如Click
)复制到新控件。
我现在有以下代码:
var btn2 = new Button();
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click
有没有其他方法可以复制控件?
答案 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
{
}
您可以在分部类中进行更改,因此无需创建事件