2017-01-04 50 views
0

我是编程和编写代码的新手。 我有一个非常简单的形式与6个按钮。 当我点击每个按钮时,只有发件人的文字有洋红色。 但Button3做了进一步的工作,并打开一个“你好”的messageBox。 问题是当我点击Button3时,它显示“hello”字符串4次。为什么? 我想,并期望它只显示一次不再。为什么在此代码中多次运行MessageBox?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Typhok(object sender, EventArgs e) 
    { 
     foreach (Control x in this.Controls) 
     { 
      if (x.Equals(sender)) 
       x.ForeColor = Color.Magenta; 
      else 
       x.ForeColor = Color.Black; 
     } 
     b3.Click += new EventHandler(Popup); 
    } 

    private void Popup(object sender, EventArgs e) 
    { 
     MessageBox.Show("hello!"); 
    } 
} 

更新:任何人都可以向我解释为什么原始代码有这个问题?

+9

何时调用Typhok?看起来像另一个事件处理程序。每次被称为'Popup'的时候都会被重新注册。 –

回答

8

在构造函数中注册事件处理程序,而不是在Typhok方法中。最终的代码应该如下所示:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     b3.Click += new EventHandler(Popup); 
    } 

    private void Typhok(object sender, EventArgs e) 
    { 
     foreach (Control x in this.Controls) 
     { 
      if (x.Equals(sender)) 
       x.ForeColor = Color.Magenta; 
      else 
       x.ForeColor = Color.Black; 
     } 
    } 

    private void Popup(object sender, EventArgs e) 
    { 
     MessageBox.Show("hello!"); 
    } 
} 
+1

这将有助于解释* why * this works和* why *原始代码产生观察结果。事件可以有多个处理程序分配给它们。每次调用'... + = new EventHandler(Popup)'都会将一个新代理附加到处理程序,并且每次事件触发时都会调用所有附加的代理。如果处理程序已被添加三次,它将会触发三次。解决方案是确保处理程序只分配一次。 –

+0

@lon md非常感谢。我不能赞成你的回答。 –

相关问题