VB.NET中跨类调用时NbrName变量值丢失问题求助
问题原因及解决办法
核心原因
你在SuggestComboBox的Enter事件中新建了一个Form1的实例,而非使用当前正在运行的Form1对象:
- Form1的Load事件仅在该实例被加载(比如调用
Show()或自动触发加载)时执行,你新建的Form1实例如果未显示,Load事件根本不会触发,因此NbrName保持默认值0; - 即便调用
Show(),这也是一个全新的Form1窗口,和原Form1是完全独立的两个对象,变量值不会共享。
解决办法
1. 获取当前已运行的Form1实例
不要新建Form1,从应用程序已打开窗体中找到正在运行的Form1对象:
Private Sub SuggestComboBox1_Enter(sender As Object, e As EventArgs) Handles SuggestComboBox1.Enter ' 获取当前打开的Form1实例 Dim currentForm1 As Form1 = Application.OpenForms.OfType(Of Form1)().FirstOrDefault() If currentForm1 IsNot Nothing Then currentForm1.SearchByName() End If End Sub
2. 将NbrName改为共享(静态)变量
如果需要让所有Form1实例共享这个变量值,可把NbrName声明为Shared:
Public Class Form1 ' 改为共享变量,所有实例共用同一个值 Public Shared NbrName As Integer Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load NbrName = 20 End Sub ' ...其他代码 End Class
这种方式下,无论新建多少个Form1实例,NbrName都会是20,但需注意共享变量的全局状态可能带来的副作用。
3. 给SuggestComboBox传递Form1实例引用
创建SuggestComboBox时,把当前Form1的实例传递给它,比如给控件添加属性:
' 自定义SuggestComboBox类中添加属性 Public Property ParentForm As Form1 ' 在Form1中初始化控件时传递引用 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load NbrName = 20 SuggestComboBox1.ParentForm = Me End Sub ' 在SuggestComboBox的Enter事件中使用该引用 Private Sub SuggestComboBox1_Enter(sender As Object, e As EventArgs) Handles SuggestComboBox1.Enter Me.ParentForm?.SearchByName() End Sub
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

