gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:23:55 25 4
gpt4 key购买 nike

我有一个 VB.NET 程序,其中有多个表单和一些我想在所有表单上访问的变量,所以我创建了一个包含一些公共(public)变量的模块文件。我发现虽然这些变量已被声明 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 为您创建事件过程。

关于vb.net - 处理在另一个类/文件中定义的对象事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com