Event

■イベント

 ・ユーザの操作やプログラムの処理などが、通知したい事が発生した際に
  それを通知する機能

イベントハンドラ

 ・イベントの通知先。イベント発生時に処理するメソッド。
 ・イベントハンドラーとなるメソッドは、通常のメソッド通りの定義でもイベント
  発生時にイベントを受け取れたり、AddHandlerできるが、メソッドの引数に
  SenderとEvevntArgsを書いてないと、RemoveHandlerが何故かできない。

 <OKパターン>
  AddHandler Me.Button1.Click, AddressOf ExecAddressMainte
  Private Sub ExecAddressMainte(ByVal sender As Object, ByVal e As System.EventArgs)

 <NGパターン>
  AddHandler Me.Button1.Click, AddressOf ExecAddressMainte
  Private Sub ExecAddressMainte()
  (*)NGパターンでもちゃんと動くんだけど、AddしたあとRemoveHandler
   してもRemoveされない。

■イベントの定義

 ・Event イベント名 as デリゲート

    例)戻り値が無く、引数にobject型とEventArgs型を受け取るEvent

  Event testEvent as Action(Of object,EventArgs)

  (*)EventHandlerというObject型とEventArgs型2つの引数が定義された

   Delegateがあり、通常それを使えばよい

  Event testEvent as EventHandler

イベントハンドラーの定義

 イベントを受け取るクラスに、イベントを受けるハンドラーを追加する。

 動的な追加方法静的な追加方法がある。

 <<静的な追加>>

 イベントを受けとるクラスに以下を宣言。

 ・WithEvent 変数名 As New イベントが定義されたクラス名

 イベントを受け取るメソッドに、以下の通りハンドラーを追加

 ・Handles WithEventの変数名.イベント名

 <<動的な追加>>

 AddHandler イベント名, AddressOf イベントを受けるメソッド名

■サンプル

 'イベントを起こすクラス
 Public Class Model
  ’イベント自体の定義
  Public Event DbChangeEvent As EventHandler
  ’イベントの発生源のメソッド
  Public Sub UpDate() 
   ’イベントの発生
   RaiseEvent DbChangeEvent(Me, New EventArgs)
  End Function
 End Class

 ’イベントを受け取るクラス(動的追加)

 Public Class Execute

  Private UserModel As New Model
  Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
   ’イベントにイベントハンドラーを追加

   AddHandler UserModel.DbChangeEvent, AddressOf Me.DbUpdate2
   UserModel.UpDate()
  End Sub

  イベントハンドラ
  Private Sub DbUpdate2(sender As Object, e As EventArgs)
   MessageBox.Show("Dbが更新されました!")
  End Sub

 End Class

 ’イベントを受け取るクラス(静的追加)

 Public Class Execute

  ’イベントを受け取るクラスにWithEventを追加

  Private WithEvents UserModel As New Model

  イベントハンドラ

  Private Sub DbUpdate(sender As Object, e As EventArgs) Handles     UserModel.DbChangeEvent
   MessageBox.Show("Dbが更新されました!")
  End Sub

 End Class