C# Winforms:如何将事件处理程序附加到其他控件

C# Winforms:如何将事件处理程序附加到其他控件,c#,.net,winforms,C#,.net,Winforms,如何将同一事件处理程序附加到Winforms/.NET/C中的其他控件 我随机尝试了完美的逻辑代码来实现我想要的,但不幸的是,语法在C中无效: public MainForm() { InitializeComponent(); FixPanelMouseEnter(pnlActionCenter); FixPanelMouseEnter(pnlAdministrativeTools); FixPanelMouseEnter(pnlAutoPlay); FixPa

如何将同一事件处理程序附加到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”只能出现在+=或的左侧-=

在本例中,如果鼠标进入面板中的任何控件,我希望面板的MouseEnter事件触发

我尝试的代码无法编译

相关问题 更改:

ctrl.MouseEnter += panel.MouseEnter;

假设代码中已经存在void panel\u MouseEnter方法

我认为您还需要传递EventHandler:

private void FixPanelMouseEnter(Panel panel, EventHandler enterMethod) {
  foreach (Control ctrl in panel.Controls)
    ctrl.MouseEnter += enterMethod;
}
然后从您的代码:

FixPanelMouseEnter(pnlActionCenter, pnlActionCenter_MouseEnter);
但同样,pnlActionCenter_MouseEnter必须已经存在。有意义吗?

改变:

ctrl.MouseEnter += panel.MouseEnter;

假设代码中已经存在void panel\u MouseEnter方法

我认为您还需要传递EventHandler:

private void FixPanelMouseEnter(Panel panel, EventHandler enterMethod) {
  foreach (Control ctrl in panel.Controls)
    ctrl.MouseEnter += enterMethod;
}
然后从您的代码:

FixPanelMouseEnter(pnlActionCenter, pnlActionCenter_MouseEnter);
但同样,pnlActionCenter_MouseEnter必须已经存在。有意义吗?

如果panel.MouseEnter的事件处理程序称为panel\u MouseEnter,请使用以下代码:

private void FixPanelMouseEnter(Panel panel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += panel_MouseEnter;
}
请注意,事件处理程序需要是一个方法,而不是一个事件

此方法可能是匿名方法,但需要符合委托签名-void eventhandler对象发送方EventArgs e

更新:

我现在明白你在努力实现什么了

以下是让代码正常工作的一种方法:

private void FixPanelMouseEnter(Panel panel, EventHandler commonHandlerForPanel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += commonHandlerForPanel;
}
如果panel.MouseEnter的事件处理程序称为panel\u MouseEnter,请使用以下代码:

private void FixPanelMouseEnter(Panel panel)
{
    foreach (Control ctrl in panel.Controls)
        ctrl.MouseEnter += panel_MouseEnter;
}
请注意,事件处理程序需要是一个方法,而不是一个事件

此方法可能是匿名方法,但需要符合委托签名-void eventhandler对象发送方EventArgs e

更新:

我现在明白你在努力实现什么了

以下是让代码正常工作的一种方法:

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

您不能导致事件触发。 您可以做的最好的事情是使用以下方法将相同的处理程序附加到所有事件:

ctrl.MouseEnter += panel1_MouseEnter;
在循环中,panel1\u MouseEnter是事件处理程序。
例如,如果您有嵌套面板,甚至可能希望递归地执行此操作。

您无法引发事件。 您可以做的最好的事情是使用以下方法将相同的处理程序附加到所有事件:

ctrl.MouseEnter += panel1_MouseEnter;
在循环中,panel1\u MouseEnter是事件处理程序。

例如,如果有嵌套的面板,甚至可能希望递归地执行此操作。

这些面板并不都称为面板。@IanBoyd-这里的重点不是名称,而是处理程序方法名称。您可以订阅panel2.MouseEnter,订阅任何符合委托签名void MethodNameobject sender EventArgs e的方法。然后,我需要一种方法来确定处理程序的方法名。@IanBoyd-鉴于您将拥有编写该方法时的名称,我不太理解这个问题。@IanBoyd-答案已更新。可以将委托传递给方法。事件可以订阅此委托。这些面板并不都称为panel。@IanBoyd-这里的重点不是关于名称,而是关于处理程序方法名称。您可以订阅panel2.MouseEnter,订阅任何符合委托签名void MethodNameobject sender EventArgs e的方法。然后,我需要一种方法来确定处理程序的方法名。@IanBoyd-鉴于您将拥有编写该方法时的名称,我不太理解这个问题。@IanBoyd-答案已更新。可以将委托传递给方法。事件可以订阅此委托。如果未编译,则当前代理中不存在名称“panel_MouseEnter”context@IanBoyd您是否在运行时创建这些面板?正如我和Oded所指出的,您必须已经编写了该方法才能订阅它。我不知道调用我的助手方法FixPanelMouseEnter的人是如何创建他们的面板的。严格来说,所有面板都是在运行时创建的。但我不知道项目中尚未编写的面板的名称。有没有办法在运行时获得该方法?想点什么能帮上忙吗?我知道你现在在做什么。这是一个滑坡,我认为这是你最好的选择。这个问题的代码甚至不考虑面板内控件内部的控件——现在您必须递归地添加处理程序。正如你所见,它变得越来越丑陋。这还没有编译,当前版本中不存在“panel_MouseEnter”这个名称context@IanBoyd您是否在运行时创建这些面板?正如我和Oded所指出的,您必须已经编写了该方法才能订阅它。我不知道调用我的助手方法FixPanelMouseEnter的人是如何创建他们的面板的。严格来说,所有面板都是在运行时创建的。但我不知道t项目中面板的名称
hat尚未编写。是否有方法在运行时获取该方法?想点什么能帮上忙吗?我知道你现在在做什么。这是一个滑坡,我认为这是你最好的选择。这个问题的代码甚至不考虑面板内控件内部的控件——现在您必须递归地添加处理程序。如您所见,它变得越来越丑陋。@Oded我尝试使用的合理语法没有编译事件“MouseEnter”只能出现在+=或-=的左侧。我将问题改为粗体显示不起作用的代码的编译错误。它不会编译,因为您将事件而不是处理程序放在+=。在本案例面板中,您需要订阅一个方法而不是事件。MouseEnter@Oded是否可以使用类似反射的方法将该方法附加到事件,并将该方法附加到另一个事件?不是反射专家,但我对此表示怀疑。据我所知,反射作用于静态类型,因此委托调用列表的动态性质可能无法实现。如果我是你,我会作为一个新问题问这个问题:@Oded我已经有三个问题了,试图解决WinForms和C中的怪癖。我尝试的每一件事都被.NET挫败了@Oded我尝试使用的合理语法不编译事件“MouseEnter”只能出现在+=或-=的左侧。我将问题改为粗体显示不起作用的代码的编译错误。它不会编译,因为您将事件而不是处理程序放在+=。在本案例面板中,您需要订阅一个方法而不是事件。MouseEnter@Oded是否可以使用类似反射的方法将该方法附加到事件,并将该方法附加到另一个事件?不是反射专家,但我对此表示怀疑。据我所知,反射作用于静态类型,因此委托调用列表的动态性质可能无法实现。如果我是你,我会作为一个新问题问这个问题:@Oded我已经有三个问题了,试图解决WinForms和C中的怪癖。我尝试的每一件事都被.NET挫败了这是一个很好的观点,即.Controls集合可能不包含所有子控件。一旦我有了一个有效的方法,这将需要进一步的调查。这是一个很好的观点,.Controls集合可能不包含所有的子控件。一旦我有了一个有效的方法,那就需要进一步的调查。