Как клонировать обработчики событий Control во время выполнения? - PullRequest
8 голосов
/ 19 мая 2011

Я хочу продублировать элемент управления, такой как Button, TextBox и т. Д. Но я не знаю, как скопировать методы обработчика событий (например, Click) в новый элемент управления.

У меня естьследующий код:

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

Есть ли другой способ дублировать элемент управления?

Ответы [ 5 ]

13 голосов
/ 19 мая 2011

Чтобы клонировать все события любого элемента управления WinForms:

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerList = eventsField.GetValue(button1);
eventsField.SetValue(button2, eventHandlerList);
5 голосов
/ 19 мая 2011

Вам просто нужно добавить обработчик события метод для нового элемента управления кнопки. C # использует оператор += для этого. Таким образом, вы можете просто написать:

btn2.Click += btn1_Click

В качестве альтернативы, несколько более мощный подход заключается в использовании отражения . Особое применение здесь будет иметь метод EventInfo.AddEventHandler .

1 голос
/ 15 октября 2018

Если вы просто хотите продублировать 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 или установить текст в исходной кнопке и сбросить ее после вызова Render в asx, то есть:

<% btn1.Text = "Text for original button"; %>
0 голосов
/ 19 мая 2011

лучший подход - использовать класс компонента и наследовать управление этому классу

public class DuplicateButton : OrginalButton
{

}

вы можете вносить изменения в частичный класс, поэтому нет необходимости создавать события

0 голосов
/ 19 мая 2011

Я не правильно понял ваш вопрос. Вы можете прикрепить одно событие к нескольким элементам управления следующим образом.

Button1.Click += button_click;
Button2.Click += button_click;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...