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
相关产品推荐
相关产品推荐

