【学習】WinFormsの「ドラッグ&ドロップ」の正体を理解しよう(Clickイベントと購読コード編)
シリーズ: WinFormsの「ドラッグ&ドロップ」の正体
Buttonのクリックイベント では、ボタンをダブルクリックして execButton_Click を書けば反応するところまで見ました。
しかし WinForms では、処理は 2か所に分かれています。
- 何をするか …
Form1.csのexecButton_Clickメソッド本体 - いつそれを呼ぶか …
Form1.Designer.csのClickへの登録(購読)
今回は 2番目の「購読コード」 がデザイナでどう生成されるかを追います。
今日学ぶこと
- イベント購読の正体 …
button.Click += メソッド;は「クリックされたらこのメソッドを呼ぶ」と登録すること - デザイナの出力場所 … 多くは
InitializeComponentの末尾付近に+=が並ぶこと Form1.csとForm1.Designer.csの役割分担 … partial クラスで、見た目・配線と、中身の処理が分かれていること- コードだけでも同じ … 手で
+=すれば、デザイナなしでも Click に反応できること
「クリックで動く」は2行セットではない
動いているように見えるのは Form1.cs だけですが、ボタンとメソッドを結ぶ行は別ファイルにあります。
| ファイル | 役割のイメージ |
|---|---|
| Form1.Designer.cs | コントロールの new、プロパティ、Controls.Add、Click += ... など 配線 |
| 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.cs の this.execButton.Click += ... の1行だけをコメントアウトしてビルドしてみます(元に戻すのを忘れないようにしましょう)。
- ボタンは表示される
- しかしクリックしても
execButton_Clickは呼ばれない
つまり メソッドがあっても、購読がなければ動かない、という関係がはっきりします。
他のイベントも形は同じ
Load、Shown、TextChanged、FormClosing など、イベントの種類は違っても、デザイナがやっていることの型は同じです。
- プロパティウィンドウでイベントを選ぶ
- ハンドラ名を決める
InitializeComponentにイベント += ハンドラ;が追加されるForm1.csにvoid ハンドラ名(...)ができる
まずは 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.csのClick +=が必要 +=はイベントへの 購読(登録) のイメージ- イベントの種類が変わっても
+= ハンドラの型は同じことが多い
発展(任意)
- 購読を外す …
this.execButton.Click -= this.execButton_Click;(動的に付け外しするとき) - 同じイベントに複数登録 …
+=を複数回すると、複数ハンドラが順に呼ばれる(設計では注意)
前の記事・関連記事
目次は シリーズ固定ページ を参照してください。