做机房重构的时候,发现每次执行打开某个窗体的命令,如打开“注册”,都会新建一个新窗体。
分析了下原因,因为每个窗体在打开之前都会进行实例化,每次实例化后的都是新窗体,所以会出现这个问题。
<pre class="vb" name="code"> Dim frmCR As New frmRegister '实例化注册窗体frmRegister
frmCR.MDIParent=Me 'frmCR为父窗体的子窗体,Me指父窗体(frmMain)
frCR.Show()
为解决此问题,我们可以用下面的方法,大家如果有更简单的可以提出来或分享链接~~~
请看Code。
Public Class PreventSameForm '防止出现重复窗体
Public Shared Sub ShowMDIForm(ByVal MDIChildForm As Form, ByVal MDIParentForm As Form)
Dim MDIChildFrm As Form = MDIChildForm ' 定义MDI子窗体
MDIChildFrm.MdiParent = MDIParentForm ' 定义MDI父窗体
MDIChildFrm.Show() '打开窗体
End Sub
'*过程名称:PreventSameForm
'*参数说明:MDIParentForm--父窗体;MDIChildForm——子窗体;MDIChildFormName ——子窗体的名字
'*功能说明:首先检测是否有MDI子窗体,如果没有,则创该MDI子窗体的窗体实例
'* 如果有,则检测当中有没有其窗体实例,有则激活;没有则创建其窗体实例
Public Shared Sub PreSameForm(ByVal MDIParentForm As Form, ByVal MDIChildForm As Form, ByVal MDIChildFormName As String)
'如果没有任何一个MDI子窗体,则创该MDI子窗体的窗体实例
If MDIParentForm.MdiChildren.Length < 1 Then
'调用ShowMDIForm过程,显示子窗体
ShowMDIForm(MDIChildForm, MDIParentForm)
Exit Sub
Else
Dim i As Integer '定义一个表示循环的整数型变量i
'定义一个布尔型变量IsFrmSame,True表示重复,False表示不重复
Dim IsFrmSame As Boolean
For i = 0 To (MDIParentForm.MdiChildren.Length) - 1 '遍历所有子窗体
'Child表示父窗体的某个子窗体
Dim Child As Form = CType(MDIParentForm.MdiChildren(i), Form)
'若要打开的新窗体和已经打开的窗体命名相同,设为TRUE 并退出循环
If Child.Name = MDIChildFormName Then
IsFrmSame = True
Exit For
Else
IsFrmSame = False
End If
Next
'若没有检测到命名相同,则在打开的窗体中检测则激活
If IsFrmSame = False Then
ShowMDIForm(MDIChildForm, MDIParentForm)
Else
Dim MDIChildFrm As Form = CType(MDIParentForm.MdiChildren(i), Form)
MDIChildFrm.Activate()
End If
End If
End Sub
End Class
我把它写在了一个类模块里,只需要UI层直接调用就可以了。