【学習】WinFormsの「ドラッグ&ドロップ」の正体を理解しよう(Click編)

広告

シリーズ: WinFormsの「ドラッグ&ドロップ」の正体

Controlsコレクション編 では、親.Controls.Add(子) で親子がつながることを見ました。

今回は、フォームのデザイナで ボタンをダブルクリックしたときに何が起きているか を見ていきます。

Click イベントの正体は、+= による「購読」

という仕組みを押さえます。Form1.Designer.csForm1.cs の役割分担が分かると、イベントまわりの見通しが一気によくなります。


今日学ぶこと

  • ダブルクリックの正体 … デザイナが ハンドラの生成購読コードの追加 を同時に行っていること
  • += の意味 … イベントに ハンドラを登録(購読) すること。-= は登録の解除
  • 役割分担Form1.Designer.cs配線(購読)Form1.csあなたが書く処理
  • 呼び出しの流れ … クリック → イベント発生 → 購読しているハンドラが実行される、という順序

ダブルクリックすると何が起きているか

デザイナでボタンを ダブルクリック すると、Visual Studio は次の2つを 同時に 行います。

  1. Form1.cs に、空のイベントハンドラ(メソッド)を追加する
  2. Form1.Designer.csInitializeComponent に、そのハンドラを 購読するコード+=)を追加する

「ダブルクリックしただけで動くようになった」のではなく、この2つのコードが自動生成されただけです。Label編・Controls編と同じで、デザイナは常に C# コードを裏で書いています。


+= が「購読」の正体

Form1.Designer.csInitializeComponent には、だいたい次のようなコードが生成されます。

this.execButton.Click += new System.EventHandler(this.execButton_Click);

+= は、Click イベントに execButton_Click というメソッドを登録するという意味です。この登録のことを「購読(サブスクライブ)」と呼びます。

書き方意味
+=ハンドラを 登録(購読) する
-=ハンドラの 登録を解除 する

1つのイベントに、複数のハンドラを += で登録することもできます。ボタンが押されると、登録された順番に すべてのハンドラが呼ばれます。


Form1.Designer.csForm1.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の「ドラッグ&ドロップ」の正体(シリーズ目次) を参照してください。

訪問数 1 回, 今日の訪問数 1回

広告