处理在另一个类/文件中定义的对象事件

时间:2014-07-11 13:30:59

标签: vb.net events

我有一个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变量”。这不是我做的吗?或者我错过了什么?

1 个答案:

答案 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为您创建事件过程。