我有一个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变量”。这不是我做的吗?或者我错过了什么?
答案 0 :(得分:3)
密钥是邮件的一部分:requires a WithEvents variable defined in the containing type
。您的foo
不是在包含类型中定义(在本例中为您的表单)。有两种方法可以做到这一点。
使用module / global声明为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为您创建事件过程。