前提・実現したいこと
EventHandlerの登録について教えてください。
Windows Formアプリケーションを作っています。
EventHandlerをコードで登録する場合、繰り返し登録すると、イベントハンドラは多重登録できます。
試したこと
たとえば下記のコードでButton1をクリックすると、Button2のイベントハンドラを多重登録します。
Button1を1回クリック、Button2を1回クリック。-MessageBoxを1回表示。内容は1。
Button1を2回クリック、Button2を1回クリック。-MessageBoxを2回表示。内容は1,2。
Button1を3回クリック、Button2を1回クリック。-MessageBoxを3回表示。内容は1,2,3。
該当のソースコード
C#
1using System; 2using System.Windows.Forms; 3 4namespace WindowsFormsApplication1 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 } 12 13 private void button1_Click(object sender, EventArgs e) 14 { 15 counter = 0; 16 //if (this.button2.Click==null) 17 this.button2.Click += new System.EventHandler(this.button2_Click); 18 } 19 20 int counter = 0; 21 private void button2_Click(object sender, EventArgs e) 22 { 23 counter++; 24 MessageBox.Show(counter.ToString()); 25 } 26 } 27}
C#
1namespace WindowsFormsApplication1 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.button1 = new System.Windows.Forms.Button(); 32 this.button2 = new System.Windows.Forms.Button(); 33 this.SuspendLayout(); 34 // 35 // button1 36 // 37 this.button1.Location = new System.Drawing.Point(207, 168); 38 this.button1.Name = "button1"; 39 this.button1.Size = new System.Drawing.Size(75, 23); 40 this.button1.TabIndex = 0; 41 this.button1.Text = "button1"; 42 this.button1.UseVisualStyleBackColor = true; 43 this.button1.Click += new System.EventHandler(this.button1_Click); 44 // 45 // button2 46 // 47 this.button2.Location = new System.Drawing.Point(146, 99); 48 this.button2.Name = "button2"; 49 this.button2.Size = new System.Drawing.Size(75, 23); 50 this.button2.TabIndex = 1; 51 this.button2.Text = "button2"; 52 this.button2.UseVisualStyleBackColor = true; 53 // 54 // Form1 55 // 56 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 57 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 58 this.ClientSize = new System.Drawing.Size(284, 261); 59 this.Controls.Add(this.button2); 60 this.Controls.Add(this.button1); 61 this.Name = "Form1"; 62 this.Text = "Form1"; 63 this.ResumeLayout(false); 64 65 } 66 67 #endregion 68 69 private System.Windows.Forms.Button button1; 70 private System.Windows.Forms.Button button2; 71 } 72}
発生している問題・エラーメッセージ
これを回避するために、
C#
1 if (this.button2.Click==null) 2 this.button2.Click += new System.EventHandler(this.button2_Click);
としたところ、 イベントControl.Clickは+=または-=の左側にのみ使用できます。 とエラーになります。 EventHandlerをコードで登録する場合、多重登録を回避する方法を知りたいです。 よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Visual Studio 2015 Pro
C#
回答2件
あなたの回答
tips
プレビュー