我们在运行时创建对象,因此在运行代码之前不知道它正在使用什么对象。我们想为每个在运行时创建的 TextBox 添加一个事件处理程序。但是当我们尝试时AddHandler obj.Leave, AddressOf leaveControl
,编译器不会运行程序,因为“对象没有像离开这样的事件”。
有没有办法将事件处理程序添加到未知类型的对象?
谢谢 :)
我们在运行时创建对象,因此在运行代码之前不知道它正在使用什么对象。我们想为每个在运行时创建的 TextBox 添加一个事件处理程序。但是当我们尝试时AddHandler obj.Leave, AddressOf leaveControl
,编译器不会运行程序,因为“对象没有像离开这样的事件”。
有没有办法将事件处理程序添加到未知类型的对象?
谢谢 :)
VB.NET 支持后期绑定来编写动态代码。这适用于属性和方法,但不适用于事件。奇怪的限制,我不知道它的技术原因。简而言之,在早期版本的 Basic 中,事件绑定是基于方法名称动态的,我怀疑它与 WithEvents 关键字有关。
解决方法很简单,您需要使用反射。像这样:
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。
你知道它是一个文本框,所以投射它
AddHandler Ctype(obj,textbox).Leave, AddressOf leaveControl
正如@Dom 所建议的那样,在没有看到用于创建控件的代码的情况下,您可以使用以下命令检查您正在创建的控件的类型(仅作为查看文本框的示例);
Dim tb As TextBox = TryCast(obj, TextBox)
If tb IsNot Nothing
AddHandler tb.Leave, AddressOf leaveControl
End If
同样,这只是一个插图,并不知道你一开始在做什么