C# 我应该在哪个代码文件中以及在文件中的什么位置为控件指定事件处理程序?

C# 我应该在哪个代码文件中以及在文件中的什么位置为控件指定事件处理程序?,c#,winforms,C#,Winforms,我必须在哪里写这段代码 button1.MouseHover += Common_MouseHover; 问题是我想声明一个事件处理程序,并将每个按钮指向它。这是常见的处理程序: private void Common_MouseHover(object sender, EventArgs e) { Button btn = sender as Button; if (btn != null) btn.Image = pic } 但我不知道我必须写在哪里

我必须在哪里写这段代码

button1.MouseHover += Common_MouseHover;
问题是我想声明一个事件处理程序,并将每个按钮指向它。这是常见的处理程序:

private void Common_MouseHover(object sender, EventArgs e)
{
     Button btn = sender as Button;
     if (btn != null)
         btn.Image = pic
}
但我不知道我必须写在哪里:

button1.MouseHover += Common_MouseHover;
utton2.MouseHover += Common_MouseHover;
.. etc

设计师?具体位置?

在窗体的设计器或构造函数中,或者在创建时创建动态按钮

public Form1()
{
    InitializeComponent();

    button1.MouseHover += new EventHandler(Common_MouseHover);
    button2.MouseHover += new EventHandler(Common_MouseHover);

}
如果在属性编辑器中


在窗体的设计器或构造函数中,或者在创建时创建动态按钮

public Form1()
{
    InitializeComponent();

    button1.MouseHover += new EventHandler(Common_MouseHover);
    button2.MouseHover += new EventHandler(Common_MouseHover);

}
如果在属性编辑器中


从技术上讲,这取决于您想要分配它的时间。例如,在满足某些条件之前,您可能不希望该方法处理事件:然后在条件为true时分配事件处理程序

请记住,如果不小心,分配事件处理程序可能会导致内存泄漏。例如,您可能有一个计时器,它会不断地将相同的事件处理程序分配给事件。您需要检查事件是否已经有了事件处理程序,或者它是否为null,或者需要什么来防止重复。您可能还希望使用-=运算符动态删除事件处理程序


对于给定的示例,窗体的构造函数似乎是正确的,并且是手动分配事件处理程序的最常见位置。

从技术上讲,它取决于您希望何时分配它。例如,在满足某些条件之前,您可能不希望该方法处理事件:然后在条件为true时分配事件处理程序

请记住,如果不小心,分配事件处理程序可能会导致内存泄漏。例如,您可能有一个计时器,它会不断地将相同的事件处理程序分配给事件。您需要检查事件是否已经有了事件处理程序,或者它是否为null,或者需要什么来防止重复。您可能还希望使用-=运算符动态删除事件处理程序


对于给定的示例,窗体的构造函数似乎是正确的,并且是手动分配事件处理程序的最常见位置。

在窗体中调用以下函数
构造函数
之后
InitializeComponent()-

    private void init()
    {
        foreach (Control ctrl in this.Controls)
        {
            if (ctrl is Button)
            {
                (ctrl as Button).MouseHover += new EventHandler(Common_MouseHover);
            }
        }
    }
这样称呼它-

    // Form Constructor
    public Form3()
    {
        InitializeComponent();
        Init();
    }

InitializeComponent()之后以您的形式调用以下函数
构造函数
-

    private void init()
    {
        foreach (Control ctrl in this.Controls)
        {
            if (ctrl is Button)
            {
                (ctrl as Button).MouseHover += new EventHandler(Common_MouseHover);
            }
        }
    }
这样称呼它-

    // Form Constructor
    public Form3()
    {
        InitializeComponent();
        Init();
    }

我读过这个:不理解最后一部分,我想解释一下在哪里写最后一段代码?见下面马克·霍尔的回答我读过这个:不理解最后一部分,我想解释最后一个代码的编写位置?请参见下面Mark hall的回答如果您查看属性编辑器中的按钮,您将在顶部看到一个小闪电,请单击该按钮。它将显示可用的事件,您可以在这些事件中添加公共处理程序。我将发布图片作为示例。非常感谢您的帮助,我终于得到了它。如果您查看属性编辑器中的按钮,您将看到顶部有一个小闪电,请单击该按钮。它将显示可用的事件,您可以在这些事件中添加公共处理程序。我将张贴图片作为例子。非常感谢你的帮助,我终于得到了它