如何将相同的事件处理程序附加到Winforms / .NET / C#中的其他控件?
我 随机 尝试完美的逻辑代码来完成我想要的,但不幸的是语法在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'只能出现在+ =或 - =
的左侧
在此示例中,如果鼠标在面板中输入任何控件,我希望触发Panel的MouseEnter
事件。
How do i attach the same event handler to additional controls in Winforms/.NET/C#?
我试过的代码无法编译。
答案 0 :(得分:2)
变化:
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 :(得分:1)
如果panel.MouseEnter
的事件处理程序名为panel_MouseEnter
,请使用以下代码:
private void FixPanelMouseEnter(Panel panel)
{
foreach (Control ctrl in panel.Controls)
ctrl.MouseEnter += panel_MouseEnter;
}
请注意,事件处理程序需要是<em>方法,而不是事件。
此方法(可能是匿名方法)需要符合EventHandler
委托签名 - void EventHandler(Object sender, EventArgs e)
。
更新
我现在看到你想要达到的目标。
以下是让代码运行的一种方法:
private void FixPanelMouseEnter(Panel panel, EventHandler commonHandlerForPanel)
{
foreach (Control ctrl in panel.Controls)
ctrl.MouseEnter += commonHandlerForPanel;
}
答案 2 :(得分:1)
您无法触发事件。 您可以做的最好的事情是使用类似的东西将相同的处理程序附加到所有事件:
ctrl.MouseEnter += panel1_MouseEnter;
在你的循环中,其中panel1_MouseEnter是事件处理程序。 如果你有例如嵌套面板,你甚至可以递归地执行此操作。