Winforms: Как прикрепить обработчик событий к дополнительным элементам управления - PullRequest
1 голос
/ 18 ноября 2011

Как мне прикрепить тот же обработчик событий к дополнительным элементам управления в Winforms / .NET / C #?


i случайным образом пробовал совершенно логичный код длявыполнить то, что я хочу, но, к сожалению, синтаксис недопустим в C #:

public MainForm()
{
   InitializeComponent();

   FixPanelMouseEnter(pnlActionCenter);
   FixPanelMouseEnter(pnlAdministrativeTools);
   FixPanelMouseEnter(pnlAutoPlay);
   FixPanelMouseEnter(pnlBackupAndRestore);
   //...snip 49 lines...
   FixPanelMouseEnter(pnlWFirewall);
   FixPanelMouseEnter(pnlWLiveLanguageSettings);
   FixPanelMouseEnter(pnlWUpdate);
}

private void FixPanelMouseEnter(Panel panel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += panel.MouseEnter;
}

Этот неверный код вызывает синтаксическую ошибку :

Событие 'System.Windows.Forms.MouseEnter' может появляться только в левой части + = или - =

В этом примере я хочуСобытие панели MouseEnter, которое вызывается, если мышью вводится какой-либо элемент управления на панели.

Как прикрепить этот же обработчик событий к дополнительным элементам управления в Winforms / .NET / C #?

Код, который я пробовал, не компилируется.

Вопросы, относящиеся *

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Изменение:

ctrl.MouseEnter += panel.MouseEnter;

до

ctrl.MouseEnter += panel_MouseEnter;

Предполагается, что метод void panel_MouseEnter уже существует в вашем коде.

Я думаю, что вам нужно также передать EventHandler:

private void FixPanelMouseEnter(Panel panel, EventHandler enterMethod) {
  foreach (Control ctrl in panel.Controls)
    ctrl.MouseEnter += enterMethod;
}

, а затем из вашего кода:

FixPanelMouseEnter(pnlActionCenter, pnlActionCenter_MouseEnter);

Но опять же, pnlActionCenter_MouseEnter уже должен существовать. Имеет смысл?

1 голос
/ 18 ноября 2011

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

ctrl.MouseEnter += panel1_MouseEnter;

внутри вашего цикла, где panel1_MouseEnter - это обработчик событий.Возможно даже, что вы захотите сделать это рекурсивно, например, если у вас есть вложенные панели.

1 голос
/ 18 ноября 2011

Если ваш обработчик событий для panel.MouseEnter называется panel_MouseEnter, используйте этот код:

private void FixPanelMouseEnter(Panel panel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += panel_MouseEnter;
}

Обратите внимание, что обработчик событий должен быть метод , а не событие .

Этот метод (который может быть анонимным) должен соответствовать подписи делегата EventHandler - void EventHandler(Object sender, EventArgs e).


Обновление:

Теперь я вижу, чего вы пытаетесь достичь.

Вот один из способов заставить ваш код работать:

private void FixPanelMouseEnter(Panel panel, EventHandler commonHandlerForPanel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += commonHandlerForPanel;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...