C#のイベント構文

について勉強したことをメモ。

このあたりを参考にしています。

ufcpp.net


とてもざっくり

イベント


「ボタンが押された」とか「マウスが特定の領域に入った」といったコンピュータ上で発生する何らかの事象のこと。
特にGUIのあるプログラムで使用されることが多い。
ちなみにイベントは広義のデリゲート(要は、メソッドを突っ込んでおける変数)の一種。

イベントハンドラ

イベントが発生した時に行われる処理のこと。

で、どうやって使うん?


簡単な例を。

まずWin formアプリプロジェクトを作ります。

Form1

ボタンを配置して、

Form2

ダブルクリックでイベントハンドラを作成。

Form3

適当に処理を追加して、

Form4

実行。ボタンを押すとメッセージボックスがでます。

Form5

なんでダブルクリックだけでこうなるの?


裏側でIDEが勝手にイベントにイベントハンドラを紐づけてくれてるからです。
Form1.Designer.csを見てみましょう。

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            // 
            // button1
            // 
            this.button1.Click += new System.EventHandler(this.button1_Click);


        }

ここのbutton1.Clickというのが、button1が押されたときに発行されるイベントとなっています。
(いらんとこは割愛してます)


一応、Clickイベントの定義を見てみましょう。


Control.Click イベント (System.Windows.Forms)


ちなみにButtonクラスはControlクラス(System.Windows.Forms名前空間)を継承しているため、Clickイベントも持っています。

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello!");
        }
    }

イベントハンドラの引数にはobject senderとEventArgs eが指定されています。

senderはイベントの発行者、eはsenderの情報とか(ここではForm1に関する情報)が入ってます。

Click イベントは EventArgs をそのイベント ハンドラーに渡します。これは、クリックが発生したことを示すにすぎません。 マウスに関するより詳細な情報、たとえば、ボタン、クリック回数、ホイール回転、位置などの情報が必要な場合は、MouseClick イベントを使用します。 ただし、Enter キーを押すなど、マウスのクリック以外のアクションによってクリックが行われた場合、MouseClick イベントは発生しません。

Clickイベントではeに大した情報は入ってないようですね。
イベントによってはマウスカーソルの座標とかが取得できます。

イベントの発行って何よ。そんな処理どこに書いてあんの

フォームやコントロールが継承しているControlクラスの内部にOnPaintというメソッドがあって、そこで発行されているそうです。

要するに書いてる側には見えません。


IDEからじゃないとイベントにイベントハンドラを登録できないの?

ビハインドコードじゃなくても直接書いても登録できます。登録は+=で。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.button1.Click += (sender, e) =>
            {
                MessageBox.Show("自分で登録したイベントハンドラ");
            };
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello!");
        }
    }
}

実行すると

Hello!
自分で登録したイベントハンドラ

という順番でメッセージボックスが表示されます。
基本的にはイベントは登録された順に実行されます。

あと、イベントは削除もできます。こっちは-=で。

this.button1.Click -= new System.EventHandler(this.button1_Click);

なんか削除するのにnewってキモいすね。


とりあえず

GUIはこんな感じです。

次回はCUIでイベントについて書きます。