【问题标题】:In which code file and where exactly in the file should I assign event handlers to controls?我应该在哪个代码文件中以及在文件中的哪个位置将事件处理程序分配给控件?
【发布时间】:2013-01-17 09:18:07
【问题描述】:

我必须在哪里写这段代码?

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

设计师?具体在哪里?

【问题讨论】:

标签: c# winforms


【解决方案1】:

在表单的设计器或构造器中,或者如果您在创建时创建动态按钮。

public Form1()
{
    InitializeComponent();

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

}

如果在属性编辑器中。

【讨论】:

  • 如果您查看按钮的属性编辑器,您会在顶部看到一个小闪电,单击它。它将向您显示可用的事件,此时您可以添加您的公共处理程序。我将发布图片作为示例。
  • 非常感谢您的帮助,我终于明白了
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    在您的表单中调用以下函数Constructor after 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();
        }
    

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多