VB.NET跨窗体RaiseEvent触发事件Form2不生效问题求解
问题说明
实现目标为在Form1中声明自定义事件,在Form2中响应该事件,现有代码运行后Form2始终无法触发事件响应逻辑。
原有Form1实现代码
Public Class Form1 Private Sub btnOpenForm2_Click(sender As Object, e As EventArgs) Handles btnOpenForm2.Click Form2.Show() End Sub Public Event show_My_Message() Private Sub btnShowMessageOnForm2_Click(sender As Object, e As EventArgs) Handles btnShowMessageOnForm2.Click RaiseEvent show_My_Message() End Sub End Class
原有Form2实现代码
Public Class Form2 Public WithEvents My_Form1 As Form1 = New Form1 Private Sub Show_My_Message_On_Form2() Handles My_Form1.show_My_Message MsgBox("Hello") End Sub End Class
问题原因
核心错误是事件订阅对象和事件触发对象不是同一个Form1实例:
Form2中通过WithEvents绑定事件的My_Form1是代码里手动New出来的独立Form1实例,这个实例从未被显示、也不会被用户操作;用户实际看到、点击按钮触发事件的是程序启动时创建的那个Form1实例,Form2根本没有订阅这个实例的事件,自然无法收到事件通知。
修复方案
按以下步骤调整代码即可:
- 移除Form2中
My_Form1声明后的New Form1初始化逻辑,仅保留带事件绑定能力的变量声明 - 打开Form2时,将当前运行的Form1实例(用
Me关键字指代当前窗体自身)赋值给Form2的My_Form1变量,保证事件订阅指向正确的实例 - 显式创建Form2实例后再完成传值、显示操作,不要直接使用VB.NET提供的默认窗体实例,避免出现实例不匹配的隐性问题
修复后的Form1代码
Public Class Form1 Private Sub btnOpenForm2_Click(sender As Object, e As EventArgs) Handles btnOpenForm2.Click ' 显式创建Form2实例 Dim frm2 As New Form2() ' 将当前Form1实例传给Form2,绑定事件订阅关系 frm2.My_Form1 = Me frm2.Show() End Sub Public Event show_My_Message() Private Sub btnShowMessageOnForm2_Click(sender As Object, e As EventArgs) Handles btnShowMessageOnForm2.Click RaiseEvent show_My_Message() End Sub End Class
修复后的Form2代码
Public Class Form2 ' 仅声明带WithEvents的变量,不在这里创建新的Form1实例 Public WithEvents My_Form1 As Form1 Private Sub Show_My_Message_On_Form2() Handles My_Form1.show_My_Message MsgBox("Hello") End Sub End Class
内容的提问来源于stack exchange,提问作者Imad
相关产品推荐
相关产品推荐

