Form005. イベントを理解しよう

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

ボタンがクリックされたとき、マウスが動かされたときとかに動作を設定したいときはイベントというものを設定します。

処理の流れ

まずは、プログラムの処理の流れを知りましょう。
プログラム内には、命令をどんどんためておくキューというものがあります。
それは一方通行の道みたいなもので、上から命令がやってきて、下に抜けていく感じです。
つまりは、下にあるものから順番に処理をする→処理し終わったらキューから消す。というのをひたすら繰り返しています。
cs-event3
このように上から命令が追加されていき、下にたまったものを処理していく感じです。

イベントの流れ

例えばボタンがクリックされたとしましょう。
ボタンがクリックされたら「ボタンがクリックされましたよ」というメッセージがやってきます。
そして、メッセージをためるための「メッセージキュー」というものがあります。
cs-event
先ほどの命令のキューと同じように、やってきたメッセージを上から入れて、下から抜けていくといった感じ。そして処理し終わったらそのメッセージを消すといった感じです。
そして、例えば、ボタンがクリックされたときのメッセージ「Button.Click」に何かメソッドが設定(関連付け)されていたら、そのメソッドを実行するという流れです。
cs-event2
これをひたすら繰り返しているだけです。

イベントの設定の仕方

イベントの仕方はとても簡単。
まず、ツールボックスから、設置したいコントロールをドラッグ&ドロップします。そうするとコントロールができる。
cs-event-set1
そして、プロパティウィンドウの稲妻マークを選択すると一覧が出てくる。
cs-event-set2
設定したいイベントをダブルクリックすると、ベースの部分が自動的に作成されます。
ここでは試しにClickのイベントを設定してみましょう。

private void button1_Click_1(object sender, EventArgs e)
{
}

これで終了です。この中に実行したい命令を入力すればOK。
試しに、メッセージを出すプログラムを書いてみましょう。
参考: 103. メッセージを表示する

private void button1_Click_1(object sender, EventArgs e)
{
    MessageBox.Show("Clickされたよ!");
}

そして、Ctrl+F5でプログラムを実行。試しにクリックしてみましょう。
cs-event-set3
メッセージがメッセージのウィンドウが出たら成功です!

イベントにはどんなものがあるか

C#には豊富にイベントがあります。
例えば、ボタンに関するイベントだと下のような感じ

  • Click クリックされた(Enterキーでも呼び出される)
  • MouseClick マウスでクリックされた
  • Enter ボタンにフォーカスがあてられた
  • Leave マウスからフォーカスが外された
  • MouseDown マウスがボタンの上で押された
  • MouseUp マウスのボタンが離された
  • MouseMove マウスがボタンの上で動いた

ほかにもたくさんあります。ざっと見た感じ30個以上あるんじゃないかな。

呼び出されるイベントは一つ!だけじゃない!!

ボタンの上でクリックされたとき、呼び出されるイベントはClickだけではありません。
例えばマウスでクリックされた場合
まず、マウスのボタンが、マウスの上で押された瞬間に、ボタンにフォーカスが当たるのでEnterイベントが呼び出されます。
(もし、他のコントロールにLeaveイベントを設定していた場合、そのコントロールのLeaveイベントが呼び出されます。)
その次にマウスがボタンの上に来ますので、MouseEnterイベントが呼び出されます。
その次にマウスのボタンが押されますので、MouseDownイベントが呼び出されます。
そしてマウスのボタンが離されて、Clickイベントが呼び出されます。
そしてマウスのボタンが離されたわけなので、MouseUpイベントが呼び出されます。
このように、ボタンがクリックされただけでこんなにイベントが発生するのです。

※プログラムが始まった瞬間にEnterイベントが呼び出された場合

余談なのですが、もし、上の通りではなく、プログラムが始まった瞬間にEnterイベントが呼び出された人がいるかもしれません。
これは、プログラムが始まった瞬間に、何かしらのコントロールがフォーカスに当てられます。
もしウィンドウ(フォーム)上にボタンが1つしかなかった場合、最初にフォーカスがあてられるのはボタンということになります。
また、フォーカスの順番は基本的に、コントロールを設置した順となります。(例外もありますが…)