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