イベントはデリゲートに基づくため、そちらを理解する必要もあります。
button.Click += new EventHandler( button_Click );
このときコールバックメソッドは、次のように定義します。
void button_Click( object sender, EventArgs e )
{
MessageBox.Show( "ボタンがクリックされました。" );
}
同一のイベントハンドラをほかにも使用するならば、次のようにも記述できます。
EventHandler clickEventHandler = new EventHandler( button_Click ); button1.Click += clickEventHandler; button2.Click += clickEventHandler;
匿名メソッド (Anonymous Methods) を使用することで、コールバックメソッドを省略できます。
button.Click += delegate( object sender, EventArgs e )
{ MessageBox.Show( "ボタンがクリックされました。" ); };
引数を使用しないならば、それを省略することともできます。
button.Click += delegate
{ MessageBox.Show( "ボタンがクリックされました。" ); };
イベントに独自のデータを持たせる必要があるときには、System.EventArgsを継承してクラスを作成します。EventArgs クラス (System) - MSDN
class MoveEventArgs : System.EventArgs
{
int position;
public MoveEventArgs( int position )
{
this.position = position;
}
}
イベントを処理するためのデリゲートを定義します。第2引数に、作成したイベントのクラスを持たせます。
delegate void MoveEventHandler( object source, MoveEventArgs e );
先に定義したデリゲートにevent修飾子を適用することで、イベントを宣言することができます。
class Foo
{
event MoveEventHandler Move; // イベント宣言
void Bar()
{
// イベント クラスのインスタンスの生成
MoveEventArgs args = new MoveEventArgs( 123 );
// イベントの発生
Move( this, args );
}
}
これを利用する側は、次のようにすることでイベントを受け取れます。
class Baz
{
Foo foo;
void Baz()
{
foo = new Foo();
foo.Move += new MoveEventHandler( _move );
}
void _move( object sender, EventArgs e )
{
}
}
イベントアクセサで、イベントへのアクセスを制御できます。
例えば次のようなイベント宣言があったとき、
public event MoveEventHandler Move;
これは次のように書き換えられます。
private MoveEventHandler _Move;
public event MoveEventHandler Move
{
add
{
_Move += value;
}
remove
{
_Move -= value;
}
}