1

我们在运行时创建对象,因此在运行代码之前不知道它正在使用什么对象。我们想为每个在运行时创建的 TextBox 添加一个事件处理程序。但是当我们尝试时AddHandler obj.Leave, AddressOf leaveControl,编译器不会运行程序,因为“对象没有像离开这样的事件”。

有没有办法将事件处理程序添加到未知类型的对象?

谢谢 :)

4

4 回答 4

3

VB.NET 支持后期绑定来编写动态代码。这适用于属性和方法,但不适用于事件。奇怪的限制,我不知道它的技术原因。简而言之,在早期版本的 Basic 中,事件绑定是基于方法名称动态的,我怀疑它与 WithEvents 关键字有关。

解决方法很简单,您需要使用反射。像这样:

    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 回答
1

你知道它是一个文本框,所以投射它

AddHandler Ctype(obj,textbox).Leave, AddressOf leaveControl

于 2015-10-14T12:20:53.307 回答
1

正如@Dom 所建议的那样,在没有看到用于创建控件的代码的情况下,您可以使用以下命令检查您正在创建的控件的类型(仅作为查看文本框的示例);

Dim tb As TextBox = TryCast(obj, TextBox)

If tb IsNot Nothing
    AddHandler tb.Leave, AddressOf leaveControl
End If

同样,这只是一个插图,并不知道你一开始在做什么

于 2015-10-14T12:26:05.817 回答