実行時にオブジェクトを作成しているため、コードを実行する前に、どのオブジェクトを操作しているかわかりません。実行時に作成されるすべての TextBox にイベント ハンドラーを追加します。しかし、試してみるとAddHandler obj.Leave, AddressOf leaveControl
、「オブジェクトに Leave のようなイベントがない」ため、コンパイラはプログラムを実行しません。
不明な型のオブジェクトにイベント ハンドラーを追加する方法はありますか?
ありがとう :)
実行時にオブジェクトを作成しているため、コードを実行する前に、どのオブジェクトを操作しているかわかりません。実行時に作成されるすべての TextBox にイベント ハンドラーを追加します。しかし、試してみるとAddHandler obj.Leave, AddressOf leaveControl
、「オブジェクトに Leave のようなイベントがない」ため、コンパイラはプログラムを実行しません。
不明な型のオブジェクトにイベント ハンドラーを追加する方法はありますか?
ありがとう :)
VB.NET は、動的コードを記述するための遅延バインディングをサポートしています。これは、プロパティとメソッドではうまく機能しますが、イベントでは機能しません。奇妙な制限です。技術的な理由はわかりません。メソッド名に基づいて動的にイベント バインディングが行われていた以前のバージョンの Basic では、これは必ずしも必要ではありませんでしたが、WithEvents キーワードと何らかの関係があると思われます。
回避策は簡単で、Reflection を使用する必要があります。このような:
Dim obj As Object = New TextBox
Dim evt = obj.GetType().GetEvent("Leave")
evt.AddEventHandler(obj, New EventHandler(AddressOf leaveControl))
あなたが望むのは、これらの線に沿ったものです:
If obj.GetType() Is GetType(TextBox) then
AddHandler obj.Leave, Address myNewRoutine
End If
GetType を再度使用する必要があるのは TextBox だけではないことに注意してください。