【学習】WinFormsの「ドラッグ&ドロップ」の正体を理解しよう(Click編)
シリーズ: WinFormsの「ドラッグ&ドロップ」の正体
Controlsコレクション編 では、親.Controls.Add(子) で親子がつながることを見ました。
今回は、フォームのデザイナで ボタンをダブルクリックしたときに何が起きているか を見ていきます。
Click イベントの正体は、+= による「購読」
という仕組みを押さえます。Form1.Designer.cs と Form1.cs の役割分担が分かると、イベントまわりの見通しが一気によくなります。
今日学ぶこと
- ダブルクリックの正体 … デザイナが ハンドラの生成 と 購読コードの追加 を同時に行っていること
+=の意味 … イベントに ハンドラを登録(購読) すること。-=は登録の解除- 役割分担 …
Form1.Designer.csは 配線(購読)、Form1.csは あなたが書く処理 - 呼び出しの流れ … クリック → イベント発生 → 購読しているハンドラが実行される、という順序
ダブルクリックすると何が起きているか
デザイナでボタンを ダブルクリック すると、Visual Studio は次の2つを 同時に 行います。
Form1.csに、空のイベントハンドラ(メソッド)を追加するForm1.Designer.csのInitializeComponentに、そのハンドラを 購読するコード(+=)を追加する
「ダブルクリックしただけで動くようになった」のではなく、この2つのコードが自動生成されただけです。Label編・Controls編と同じで、デザイナは常に C# コードを裏で書いています。
+= が「購読」の正体
Form1.Designer.cs の InitializeComponent には、だいたい次のようなコードが生成されます。
this.execButton.Click += new System.EventHandler(this.execButton_Click);
+= は、Click イベントに execButton_Click というメソッドを登録するという意味です。この登録のことを「購読(サブスクライブ)」と呼びます。
| 書き方 | 意味 |
|---|---|
+= | ハンドラを 登録(購読) する |
-= | ハンドラの 登録を解除 する |
1つのイベントに、複数のハンドラを += で登録することもできます。ボタンが押されると、登録された順番に すべてのハンドラが呼ばれます。
Form1.Designer.cs と Form1.cs の役割分担
この2つのファイルは、はっきり役割が分かれています。
| ファイル | 役割 |
|---|---|
Form1.Designer.cs | 配線(購読)。new・プロパティ設定・Controls.Add・+= をデザイナが自動生成する場所 |
Form1.cs | 処理の中身。イベントハンドラの 中身のロジック をあなたが書く場所 |
Form1.Designer.cs は デザイナが管理するファイル です。直接編集すると、デザイン画面を開き直したときに上書きされることがあるため、基本的には触らず、処理は Form1.cs に書きます。
発生から実行までの流れ
クリックしてからハンドラが実行されるまでを、順番に並べると次のようになります。
execButton をクリック
└─ Click イベントが発生
└─ += で購読されているハンドラを探す
└─ execButton_Click(object sender, EventArgs e) を実行
+= がなければ、Click イベントが発生しても 誰も呼ばれません。ハンドラのメソッドがあるだけでは動かない、というのはよくあるつまずきです。
よくあるつまずき
- ハンドラのメソッドを書いたのに動かない →
+=による購読が抜けていないか確認する - ボタンを2回ダブルクリックしてしまい、同じ処理が2回実行される →
+=が重複していないかForm1.Designer.csを確認する Form1.Designer.csを直接編集してしまい、デザイン画面を開いたら消えた → デザイナ管理のファイルは編集しない
実験して理解する
デザイナでダブルクリックせず、コードだけでボタンに Click イベントを購読させてみます。フォームのコンストラクタに、次のように追加します。
public Form1()
{
InitializeComponent();
// デザイナを使わず、コードだけで購読する
this.execButton.Click += ExecButton_ClickFromCode;
}
private void ExecButton_ClickFromCode(object sender, EventArgs e)
{
MessageBox.Show("コードだけで購読しました");
}
実行してボタンを押すと、デザイナで作った execButton_Click と、いま追加した ExecButton_ClickFromCode の 両方 が呼ばれます。+= は「上書き」ではなく「追加登録」だということが、これで確認できます。
試しに、どちらか一方を -= で解除してから実行すると、そちらだけ呼ばれなくなることも確認してみてください。
まとめ
- ダブルクリックは、ハンドラの生成 と
+=による購読 を同時に行っている +=はイベントへのハンドラ登録(購読)、-=は解除Form1.Designer.csは配線(購読)、Form1.csは処理の中身、と役割が分かれている+=がなければ、ハンドラがあってもイベントは誰も呼ばない
最後に
Label編で「new・プロパティ・Controls.Add」、Controls編で「親子のつながり」、そして今回の「+= による購読」で、デザイナが隠していた3つの仕組みが揃いました。
ここまで理解できれば、TextBox や CheckBox など、どのコントロールのイベントも同じ考え方で読み解けます。デザイン画面は便利な入り口として使いつつ、必要なときは Form1.Designer.cs を覗いて「裏で何が書かれているか」を確認する習慣をつけておくと安心です。
シリーズ目次
このシリーズの一覧は WinFormsの「ドラッグ&ドロップ」の正体(シリーズ目次) を参照してください。











ディスカッション
コメント一覧
まだ、コメントがありません