关闭二级窗体时如何保留主窗体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:规范实现(显式管理窗体实例,避免默认实例坑)
不用静态成员,而是把子窗体的赋值对象绑定到你已经打开的那个主窗体实例:
- 主窗体打开子窗体时,把自身实例传给子窗体:
' FrmMenu中打开FrmExtras的代码 Dim frmExtras As New FrmExtras() frmExtras.Owner = Me ' 绑定当前主窗体实例为子窗体所有者 Me.Hide() frmExtras.Show()
- 子窗体赋值时,直接操作绑定的主窗体实例,不要用类名访问:
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:全局存储(关闭主窗体也能保留值)
如果需要关闭主窗体后赋值依然保留,把变量放到单独的全局模块中:
- 项目中新建
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
- 所有窗体直接访问模块中的变量即可,比如子窗体赋值写
GlobalVars.SwedgeLC = "A",主窗体读取也直接读GlobalVars.SwedgeLC,完全不依赖窗体实例生命周期。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

