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

关闭二级窗体时如何保留主窗体frmmenu中的存储信息?

VB.NET 窗体间传值丢失问题解决方案

问题核心是VB.NET默认窗体实例特性的坑:你当前声明的SwedgeLC等变量是实例级成员,每新生成一个FrmMenu实例,这些变量都会被初始化为空值。你直接用类名FrmMenu.SwedgeLC访问时,VB会自动调用默认实例,如果过程中默认实例被重新生成、或者你赋值的实例不是你之前隐藏的那个主窗体实例,就会出现值丢失的情况。

方案1:快速修复(变量全局共享)

直接把FrmMenu中的变量改为Shared静态成员,所有窗体实例共享同一份值,不会因为实例切换被重置:

Public Class FrmMenu
    ' 所有变量前加Shared关键字
    Friend Shared PinLC As String,
    Shared SwedgeLC As String,
    Shared MonoLC As String,
    Shared StrandLC As String,
    Shared WireLC As String,
    Shared TipLC As String,
    Shared LenLC As String,
    Shared TailLC As String,
    Shared PackLC As String,
    Shared LabelLC As String
End Class

修改后原来子窗体的赋值逻辑FrmMenu.SwedgeLC = "A"不用改,即可正常保留值。

方案2:规范实现(显式管理窗体实例,避免默认实例坑)

不用静态成员,而是把子窗体的赋值对象绑定到你已经打开的那个主窗体实例:

  1. 主窗体打开子窗体时,把自身实例传给子窗体:
' FrmMenu中打开FrmExtras的代码
Dim frmExtras As New FrmExtras()
frmExtras.Owner = Me ' 绑定当前主窗体实例为子窗体所有者
Me.Hide()
frmExtras.Show()
  1. 子窗体赋值时,直接操作绑定的主窗体实例,不要用类名访问:
Private Sub CboOptions2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboOptions2.SelectedIndexChanged
    Swage = UCase(CboOptions2.Text)
    If Swage.Substring(0, 5) = "SWAGE" Then
        ' 转换Owner为FrmMenu类型,赋值给原实例的变量
        CType(Me.Owner, FrmMenu).SwedgeLC = "A"
    End If
    CType(Me.Owner, FrmMenu).Show()
    Me.Close()
End Sub

方案3:全局存储(关闭主窗体也能保留值)

如果需要关闭主窗体后赋值依然保留,把变量放到单独的全局模块中:

  1. 项目中新建Module,命名为GlobalVars:
Module GlobalVars
    Friend PinLC As String,
    SwedgeLC As String,
    MonoLC As String,
    StrandLC As String,
    WireLC As String,
    TipLC As String,
    LenLC As String,
    TailLC As String,
    PackLC As String,
    LabelLC As String
End Module
  1. 所有窗体直接访问模块中的变量即可,比如子窗体赋值写GlobalVars.SwedgeLC = "A",主窗体读取也直接读GlobalVars.SwedgeLC,完全不依赖窗体实例生命周期。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:24:01