【发布时间】:2012-09-09 22:03:49
【问题描述】:
我的应用程序中有两种表单,一种是创建新连接,另一种是主表单,其中包含带有连接名称的菜单。
当我在frmNewConnection 表单下创建新连接并尝试单击生成的菜单项时,它不会像我重新打开程序时那样显示测试消息。
在主窗体中,我有以下公共子窗体。
主窗体frmMain
Public Sub Connect_SubMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
Messagebox.Show("Test")
End Sub
除非我重新启动我的应用程序,否则该代码永远不会被执行,然后当我单击新生成的菜单项时它工作正常。但是,如果我要加载应用程序并单击“新建连接”菜单项并创建新连接,然后尝试在“连接”菜单下单击它,则没有任何反应,我没有收到“测试”消息框。
我在 frmNewConnection Accept 按钮下有如下代码,它将连接的名称保存到“Connections”菜单中。
frmMain.menuConnections.DropDownItems.Add(ConnectionName, Nothing, AddressOf frmMain.Connect_SubMenuItem_Click) ' save to menu
我还有一个在 frmMain_load() 上执行的代码版本:
menuConnections.DropDownItems.Add(finalData(1).ToString, Nothing, AddressOf Connect_SubMenuItem_Click) ' save to menu
我的问题是,为什么在程序中生成新菜单项时不会出现测试消息,但是当我关闭程序并重新打开它时它会显示..
【问题讨论】:
-
这段代码中使用“Form1”是VB.NET的悲剧。它是一个类型名称,而不是引用用户正在查看的 Form1 对象的变量。继承自 VB6,一种根本不支持线程的语言。当您确实使用线程时,它会爆炸。就像 BeginConnect() 方法调用的回调一样。现在您在另一个线程上运行代码,该线程创建 Form1 的 new 实例。不可见是因为您没有调用它的 Show() 方法,而功能失调是因为线程不泵送消息循环。一只死鹦鹉。
-
@Hans Passant,这很有趣,我完全不知道。谢谢你提供的信息。将 form1 重命名为诸如 frmMain 之类的唯一名称就足够了吗?
-
不,重命名表单是不够的。您需要将项目添加到您之前使用的 Form1 的特定实例的下拉列表中。
-
我一直在尝试获取 Form1 的正确实例,有什么提示吗?