Я использую следующую технику, но она требует определенного Sub для каждого типа формы (я использую VB.NET). Однако я уверен, что может быть способ упростить это, чтобы обрабатывать все дочерние формы с одним подпунктом
Dim blExists As Boolean = False
For Each f As Form In Me.MdiChildren
If TypeOf (f) Is FormName Then
f.Focus()
blExists = True
Exit For
End If
Next
If Not blExists Then
fAnalysis = New FormName
fAnalysis.MdiParent = Me
fAnalysis.Show()
End If
Следующий подпункт работает для всех форм.
Private Sub ShowNewForm(ByVal frmName As Form)
Dim blExists As Boolean = False
Dim f as Form
For Each f In Me.MdiChildren
If f.Name Is frmName.Name Then
f.Focus()
blExists = True
Exit For
End If
Next
If Not blExists Then
f = DirectCast(New Form, frmName.Type)
fAnalysis.MdiParent = Me
f.Show()
End If
End Sub