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

Ali*_*den 5 .net vb.net events

我有一个 VB.NET 程序,其中有多个表单和一些我想在所有表单上访问的变量,因此我创建了一个包含一些公共变量的模块文件。我发现,尽管这些变量已被声明WithEvents,但如果不首先复制到局部变量,则无法在表单上处理它们的事件。

正在发生的事情的伪代码:

在 Main.vb(模块文件)中

Public WithEvents foo As VarType1
Run Code Online (Sandbox Code Playgroud)

在 Someform.vb 中(Windows 窗体)

Private Sub fooEventHandler(sender as System.Object, e As fooEventArgs) Handles foo.fooEvent
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息“Handles 子句需要在包含类型或其基本类型之一中定义的 WithEvents 变量”。这不是我所做的吗?或者我错过了什么?

Ňɏs*_*arp 5

关键是消息的部分:requires a WithEvents variable defined in the containing type。您foo在包含类型(本例中为您的表单)中定义。有两种方法可以做到这一点。

使用模块/全局声明为 Foo 对象提供范围:

Public mainFoo As FooBar
Run Code Online (Sandbox Code Playgroud)

它确实只需要是Friend,但由于这里没有任何可以订阅事件的内容,所以不需要是WithEvents。只需访问Foo(而不是事件)的表单/对象可以引用该mainFoo对象。

接下来,任何希望订阅 Foo 事件的表单或类都需要将局部WithEvents变量设置为全局对象:

Private WithEvents myFoo As FooBar    ' variable declaration

myFoo = mainFoo       ' set myFoo to reference the real object
Run Code Online (Sandbox Code Playgroud)

此方法的优点是,在表单代码中,您应该能够从左侧菜单中选择 myFoo,然后从右侧菜单中选择 FooEvent,以便 VB/VS 插入正确的事件处理程序,就像使用控件一样事件:

Private Sub myFoo_FooChanged(sender As Object, newFoo As String) _
       Handles myFoo.FooChanged
Run Code Online (Sandbox Code Playgroud)

另一种方法稍微简单一些,只需使用 AddHandler 手动挂接该主变量即可:

AddHandler mainFoo.FooChanged, AddressOf sub_FooChanged
Run Code Online (Sandbox Code Playgroud)

它可以防止必须创建局部WithEvents变量,但它也可以防止 VS 为您创建事件过程。