Как я могу добавить обработчик события к событию по имени? - PullRequest
0 голосов
/ 19 мая 2010

Я пытаюсь добавить обработчик событий для каждого элемента управления в моей форме. Форма представляет собой простое информационное окно, которое всплывает, и при щелчке в любом месте на нем происходит то же самое (что-то вроде почтового уведомления Outlook). Для этого я написал рекурсивный метод добавления обработчика MouseClick для каждого элемента управления. , следующим образом:

private void AddMouseClickHandler(Control control, MouseEventHandler handler)
{
    control.MouseClick += handler;
    foreach (Control subControl in control.Controls)
        AddMouseClickHandler(subControl, handler);
}

Однако, если бы я хотел добавить обработчик для всех событий MouseDown и MouseUp, мне пришлось бы написать еще два метода. Я уверен, что есть способ обойти это, но я не могу его найти. Я хочу такой метод, как:

private void AddRecursiveHandler(Control control, Event event, EventHandler handler)
{
    control.event += handler;
    foreach (Control subControl in control.Controls)
        AddRecursiveHandler(subControl, event, handler);
}

Ответы [ 4 ]

3 голосов
/ 19 мая 2010

Вы можете передать имя события в виде строки, а затем использовать Reflection для реализации этого, но это было бы довольно уродливо (и медленно).К сожалению, нет другого способа передать события в качестве аргументов методу.

Однако вы можете написать это элегантно, используя лямбда-функции.Вместо того, чтобы писать функцию для добавления обработчика, вы можете написать функцию, которая вызывает лямбда-выражение для каждого элемента управления:

private void TraverseControls(Control control, Action<Control> f) 
{ 
    f(control); 
    foreach (Control subControl in control.Controls) 
        TraverseControls(subControl, f); 
} 

Затем вы можете решить исходную проблему, используя один вызов:

TraverseControls(form, ctl => { 
  ctl.MouseDown += handler;
  ctl.MouseUp += handler); });

Лямбда-выражение ctl => { .. } будет вызываться для каждого элемента управления в дереве, а внутри лямбда-выражения можно добавлять обработчики для любых событий элемента управления.Вы также можете написать это, используя два вызова (добавив обработчики к MouseDown в первом и к MouseUp во втором).

По сравнению с решением, использующим Reflection, это быстрее и безопаснее.

1 голос
/ 19 мая 2010

Вы можете использовать отражение, чтобы подключиться к событиям. Взгляните на эту статью на MSDN

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

Если вы хотите, чтобы событие происходило везде, вам не нужно добавлять событие к каждому элементу. просто добавьте событие в родительскую форму (или панель, если вы хотите, чтобы реагировали только элементы панели), и все, что вы щелкнете внутри этой формы, вызовет событие из родительского объекта.

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

Похоже, вы на правильном пути. Если у вас есть обработчик событий в MouseDown и MouseUp на вашем FORM, вы просто должны иметь возможность присоединиться к нему, как вы уже сделали в своем

control.MouseClick += handler... 

просто добавьте, поскольку подпись одна и та же, но действие другое, вы захотите обработать соответствующим образом.

control.MouseDown += YourFormsMouseDownHandler 
control.MouseUp += YourFormsMouseUpHandler
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...