学習記事一覧 · WinFormsドラッグドロップの正体

【学習】WinFormsの「ドラッグ&ドロップ」の正体を理解しよう(Clickイベントと購読コード編)

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

Buttonのクリックイベント では、ボタンをダブルクリックして execButton_Click を書けば反応するところまで見ました。

しかし WinForms では、処理は 2か所に分かれています

  1. 何をするかForm1.csexecButton_Click メソッド本体
  2. いつそれを呼ぶかForm1.Designer.csClick への登録(購読)

今回は 2番目の「購読コード」 がデザイナでどう生成されるかを追います。


今日学ぶこと

  • イベント購読の正体button.Click += メソッド; は「クリックされたらこのメソッドを呼ぶ」と登録すること
  • デザイナの出力場所 … 多くは InitializeComponent の末尾付近に += が並ぶこと
  • Form1.csForm1.Designer.cs の役割分担 … partial クラスで、見た目・配線と、中身の処理が分かれていること
  • コードだけでも同じ … 手で += すれば、デザイナなしでも Click に反応できること

「クリックで動く」は2行セットではない

動いているように見えるのは Form1.cs だけですが、ボタンとメソッドを結ぶ行は別ファイルにあります。

ファイル 役割のイメージ
Form1.Designer.cs コントロールの new、プロパティ、Controls.AddClick += ... など 配線
Form1.cs コンストラクタ、InitializeComponent() の呼び出し、イベント発生時に実行したい処理

どちらも partial class Form1 なので、1つの Form1 クラスとしてコンパイルされます。


デザイナが生成する購読コードを探す

Visual Studio で ソリューションエクスプローラーから Form1.Designer.cs を開き、InitializeComponent メソッドの 終わりの方をスクロールします。

ボタン名が execButton の例では、だいたい次のような行があります。

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

環境や設定によっては、次のように メソッド名だけの書き方になることもあります(意味は同じです)。

this.execButton.Click += this.execButton_Click;

ポイントは += です。 これが「Click イベントに、このハンドラを 追加で登録する」という意味になります。

プロジェクト内で Click += と検索すると、他のボタンやコントロールでも 同じパターンが見つかります。


+= を外すとどうなるか(実験)

学習用に、Form1.Designer.csthis.execButton.Click += ... の1行だけをコメントアウトしてビルドしてみます(元に戻すのを忘れないようにしましょう)。

  • ボタンは表示される
  • しかしクリックしても execButton_Click は呼ばれない

つまり メソッドがあっても、購読がなければ動かない、という関係がはっきりします。


他のイベントも形は同じ

LoadShownTextChangedFormClosing など、イベントの種類は違っても、デザイナがやっていることの型は同じです。

  • プロパティウィンドウでイベントを選ぶ
  • ハンドラ名を決める
  • InitializeComponentイベント += ハンドラ; が追加される
  • Form1.csvoid ハンドラ名(...) ができる

まずは Click+= を読めるようにしておくと、他のイベントも自力で追いやすくなります。


コードだけで購読する(デザイナの真似)

Form1 のコンストラクタで、次のように書くこともできます(名前は例です)。

public Form1()
{
    InitializeComponent();
    this.execButton.Click += this.ExecButtonClicked;
}

private void ExecButtonClicked(object sender, EventArgs e)
{
    MessageBox.Show("手動購読");
}

この場合、同じイベントに二重に登録しないよう、Designer.cs 側の Click +=重複させないように注意します。学習では「新しいフォームで Designer の該当行を消して試す」か、「コードだけの小さな Form で試す」と安全です。


まとめ

  • クリックで動くには、Form1.cs のメソッドだけでなく Designer.csClick += が必要
  • += はイベントへの 購読(登録) のイメージ
  • イベントの種類が変わっても += ハンドラ の型は同じことが多い

発展(任意)

  • 購読を外すthis.execButton.Click -= this.execButton_Click;(動的に付け外しするとき)
  • 同じイベントに複数登録+= を複数回すると、複数ハンドラが順に呼ばれる(設計では注意)

前の記事・関連記事

目次は シリーズ固定ページ を参照してください。