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

多副本窗体中的公共变量指定引用问题

如何引用特定的FormX窗体副本的公共变量

你当前的代码每次Dim FormA As New FormX都会创建一个全新的FormX实例,FormA变量只会保留最后一次创建的实例引用,所以无法通过它定位之前的窗体副本。要引用特定实例,核心是把所有创建的FormX实例统一管理起来,再通过标识定位:

步骤1:用集合存储所有窗体实例

在主窗体或全局模块中声明一个集合来追踪所有FormX实例:

' 主窗体类内或模块中声明
Private formXInstances As New List(Of FormX)

创建窗体时,把新实例加入集合,并设置唯一标识方便后续定位:

Dim newForm As New FormX
' 可以用GUID、业务ID或序号做唯一标识
newForm.Tag = Guid.NewGuid().ToString()
formXInstances.Add(newForm)
newForm.Show()

为避免内存泄漏,在FormX的FormClosed事件中把当前实例从集合移除:

' FormX代码内的事件处理
Private Sub FormX_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    MainForm.formXInstances.Remove(Me)
End Sub

步骤2:定位并引用特定实例

根据预设的标识从集合中筛选目标实例,再访问其公共变量:

示例1:通过Tag标识查找

' 假设目标实例的Tag为"xxxx-xxxx-xxxx"
Dim targetForm = formXInstances.FirstOrDefault(Function(f) f.Tag.ToString() = "xxxx-xxxx-xxxx")
If targetForm IsNot Nothing Then
    ' 直接访问公共变量
    Dim targetValue = targetForm.Varname
End If

示例2:通过业务属性查找

如果FormX有业务相关的公共变量(比如每个窗体对应一个用户ID),可直接用该变量筛选:

' 假设FormX有公共变量UserId,查找UserId=123的实例
Dim targetForm = formXInstances.FirstOrDefault(Function(f) f.UserId = 123)
If targetForm IsNot Nothing Then
    Dim targetValue = targetForm.Varname
End If

注意事项

  • 多线程环境下创建窗体时,建议用ConcurrentBag(Of FormX)替代List(Of FormX),避免线程安全问题
  • 必须在窗体关闭时移除实例,否则集合会保留已销毁的窗体引用,触发空引用异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:27:09