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

VB中MDI子窗口单实例打开及切换关闭指定窗口问题

VB.NET MDI子窗体单实例实现方案

需求说明

  • 打开frmProgramme子窗体时,确保仅存在一个实例,避免重复创建
  • 打开frmEtudiants子窗体时,确保仅存在一个实例,同时自动关闭所有已打开的frmProgramme窗口

修改后的完整代码

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub mnuProgramme_Click(sender As Object, e As EventArgs) Handles mnuProgramme.Click
        Try
            ' 检查是否已存在frmProgramme实例
            Dim existingForm As frmProgramme = Nothing
            For Each f As Form In Me.MdiChildren
                If TypeOf f Is frmProgramme Then
                    existingForm = DirectCast(f, frmProgramme)
                    Exit For
                End If
            Next

            If existingForm IsNot Nothing Then
                ' 激活已存在的窗口
                existingForm.BringToFront()
            Else
                ' 创建新实例并显示
                Dim frm As New frmProgramme
                frm.MdiParent = Me
                frm.Show()
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub mnuEtudiants_Click(sender As Object, e As EventArgs) Handles mnuEtudiants.Click
        Try
            ' 关闭所有已打开的frmProgramme窗口(ToList避免遍历中修改集合报错)
            For Each f As Form In Me.MdiChildren.ToList()
                If TypeOf f Is frmProgramme Then
                    f.Close()
                End If
            Next

            ' 检查是否已存在frmEtudiants实例
            Dim existingForm As frmEtudiants = Nothing
            For Each f As Form In Me.MdiChildren
                If TypeOf f Is frmEtudiants Then
                    existingForm = DirectCast(f, frmEtudiants)
                    Exit For
                End If
            Next

            If existingForm IsNot Nothing Then
                ' 激活已存在的窗口
                existingForm.BringToFront()
            Else
                ' 创建新实例并显示
                Dim frm1 As New frmEtudiants
                frm1.MdiParent = Me
                frm1.Show()
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

关键逻辑说明

  • 单实例判断:遍历MdiChildren集合检查对应类型窗体是否存在,存在则激活前置,不存在再创建新实例,避免重复打开。
  • 指定窗体关闭:使用ToList()复制集合后遍历,避免修改原集合导致的遍历异常,确保所有frmProgramme窗口被关闭。
  • 异常处理:保留原有Try-Catch块,捕获并显示运行时错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:51:17