You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:25:28