我有一个VB.NET程序,其中有多个表单以及要在所有表单上访问的一些变量,因此我创建了一个包含一些公共变量的模块文件。我发现的是,尽管已经声明了这些变量,但是WithEvents
如果不先复制到局部变量,就无法在表单上处理它们的事件。
发生了什么的伪代码:
在Main.vb中(模块文件)
Public WithEvents foo As VarType1
在Someform.vb中(Windows窗体)
Private Sub fooEventHandler(sender as System.Object, e As fooEventArgs) Handles foo.fooEvent
我收到一条错误消息:“ Handles子句需要在包含类型或其基本类型之一中定义的WithEvents变量”。这不是我做的吗?还是我错过了什么?
关键是消息的一部分:requires a WithEvents variable defined in the containing type
。您foo
未在包含类型中定义(在这种情况下为您的表格)。有两种方法可以做到这一点。
使用模块/全局声明为Foo对象提供范围:
Public mainFoo As FooBar
它确实只需要存在Friend
,但是由于这里没有什么要订阅事件的,因此它不需要是WithEvents
。仅需要访问Foo
(而不是事件)的表单/对象可以引用此mainFoo
对象。
接下来,任何希望订阅Foo事件的表单或类都需要将局部WithEvents
变量设置为全局对象:
Private WithEvents myFoo As FooBar ' variable declaration
myFoo = mainFoo ' set myFoo to reference the real object
此方法的优点在于,在表单代码中,您应该能够从左侧菜单中选择myFoo,然后从右侧菜单中选择FooEvent,以便VB / VS像在控件上那样插入正确的事件处理程序。事件:
Private Sub myFoo_FooChanged(sender As Object, newFoo As String) _
Handles myFoo.FooChanged
这个其他方法稍微简单一些,只需使用AddHandler手动连接该主变量即可:
AddHandler mainFoo.FooChanged, AddressOf sub_FooChanged
它避免了必须创建局部WithEvents
变量,但也阻止了VS为您创建事件过程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句