1

実行時にオブジェクトを作成しているため、コードを実行する前に、どのオブジェクトを操作しているかわかりません。実行時に作成されるすべての TextBox にイベント ハンドラーを追加します。しかし、試してみるとAddHandler obj.Leave, AddressOf leaveControl、「オブジェクトに Leave のようなイベントがない」ため、コンパイラはプログラムを実行しません。

不明な型のオブジェクトにイベント ハンドラーを追加する方法はありますか?

ありがとう :)

4

4 に答える 4

3

VB.NET は、動的コードを記述するための遅延バインディングをサポートしています。これは、プロパティとメソッドではうまく機能しますが、イベントでは機能しません。奇妙な制限です。技術的な理由はわかりません。メソッド名に基づいて動的にイベント バインディングが行われていた以前のバージョンの Basic では、これは必ずしも必要ではありませんでしたが、WithEvents キーワードと何らかの関係があると思われます。

回避策は簡単で、Reflection を使用する必要があります。このような:

    Dim obj As Object = New TextBox
    Dim evt = obj.GetType().GetEvent("Leave")
    evt.AddEventHandler(obj, New EventHandler(AddressOf leaveControl))
于 2015-10-14T12:32:01.497 に答える
1

あなたが望むのは、これらの線に沿ったものです:

If obj.GetType() Is GetType(TextBox) then
   AddHandler obj.Leave, Address myNewRoutine
End If

GetType を再度使用する必要があるのは TextBox だけではないことに注意してください。

于 2015-10-14T12:35:08.150 に答える