我们在运行时创建对象,因此在运行代码之前不知道它正在使用什么对象。我们想为在运行时创建的每个TextBox添加一个事件处理程序。但是当我们尝试AddHandler obj.Leave, AddressOf leaveControl
时,编译器将不会运行该程序,因为“对象没有像Leave这样的事件”。
有没有办法将事件处理程序添加到未知类型的对象?
谢谢:)
答案 0 :(得分: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))
答案 1 :(得分:1)
你知道它是一个文本框,所以把它
AddHandler Ctype(obj,textbox).Leave,AddressOf leaveControl
答案 2 :(得分:1)
如果没有看到用于创建控件的代码,正如@Dom建议的那样,您可以使用以下内容检查您正在创建的控件类型(仅作为查看文本框的示例);
Dim tb As TextBox = TryCast(obj, TextBox)
If tb IsNot Nothing
AddHandler tb.Leave, AddressOf leaveControl
End If
同样,这只是一个例子而不知道你在一开始就在做什么的全部范围
答案 3 :(得分:1)
你想要的是这些方面:
If obj.GetType() Is GetType(TextBox) then
AddHandler obj.Leave, Address myNewRoutine
End If
请注意,您不能只使用TextBox再次使用GetType。