2017-01-04 5 views
0

私はプログラミングとコードの初心者です。 私は6つのボタンを持つ非常にシンプルなフォームを持っています。 すべてのボタンをクリックすると、送信者のテキストにマゼンタが表示されます。 しかしButton3はこれ以上の作業を行い、 "Hello"メッセージボックスを開きます。 問題は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

なぜ*これが*うまく動作しているのか、なぜ*元のコードが観測結果を生成するのかを説明すると便利です。イベントには、複数のハンドラが割り当てられます。 '... + = new EventHandler(Popup)'の各呼び出しは、ハンドラに新しいデリゲートを添付し、イベントが発生するたびにすべての添付デリゲートが呼び出されます。ハンドラが3回追加された場合は、3回発射されます。解決策は、ハンドラが一度だけ割り当てられるようにすることです。 –

+0

@ lon mdありがとうございます。私はあなたの答えに親指をあげることはできません。 –

関連する問題