Limit a MDI Child Form to only one instance

I have an MDI application with multiple child forms. Some of these child forms need to be limited to only one instance loaded at any given time. How would you do this and why?
bhlangAsked:
Who is Participating?
 
Jorge PaulinoIT Pro/DeveloperCommented:
Check is is there any open MDI form before open it. Something like this

For Each frm In frmParent.MdiChildren
   If frm.Name = frmName.Name Then Exit Sub
Next
0
 
xersoftCommented:
This happens to me a lot. For example, say you are writing a program to edit product information and you choose to create a MDI style application. You do this because your users want to have multiple products open for editing at the same time. Of course you are going to create one form that has the ability to show a products information and allow editing of that information. Now it most cases (I’m sure not all) you won’t want your users to open the same product for editing twice in two different forms.

So here is what I do to stop this:

I create a form that will be used to edit products. In that form I create a public readonly property called ProductUniqueIdent.

My open routine goes in the MDI parent. In this case it will probably ask the user what product they wish to edit, possibly by showing them a list of editable products.

After the user choose a product they wish to edit I find the UniqueIdent for that product.

Then I scan all MDI child forms known to a MDI parent in a for/each loop.
        For Each child As Windows.Forms.Form In Me.MdiChildren

        Next

In this loop I check to see if the typeof child is of the ProductEditorForm’s type.
         If TypeOf child Is ProductEditorForm Then

         End If

After I have identified that the child in question is of the correct type I create a reference to that form like this:
      dim ProductEditor as ProductEditorForm = directcast(child, ProductEditorForm)

Then I check the unique identifier property on that form to see if it matches the one the user is trying to open:
                If UserChoosenIdent = ProductEditor.ProductUniqueIdent Then
                    Exit Sub
                End If

If you have not exited at the end of the loop, open a new product editor form in the normal way, ensuring you set the ProductUniqueIdent property of that new form to the value of the UserChoosenIdent.

That should do it.
0
 
xersoftCommented:
Here is the entire function I wrote above:

    Private Sub OpenProductEditor(ByVal UserChoosenIdent As String)
        For Each child As Windows.Forms.Form In Me.MdiChildren
            If TypeOf child Is ProductEditorForm Then
                Dim ProductEditor As ProductEditorForm = DirectCast(child, ProductEditorForm)
                If UserChoosenIdent = ProductEditor.ProductUniqueIdent Then
                    Exit Sub
                End If
            End If
        Next

        'code to open a new form goes here
    End Sub
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
bhlangAuthor Commented:
Thanks. Here's my full solution for anyone else interested:
Private Sub MenuItem_Click
        Dim frm As Form
        For Each frm In Me.MdiChildren
            If frm.Name = frmName.Name Then
                Exit Sub
            End If
        Next
        Dim F As New frmName
        F.MdiParent = Me
        F.Show()
End Sub
0
 
bhlangAuthor Commented:
xersoft, I didn't see your solution before accepting the first one. Sorry mate.
0
 
bhlangAuthor Commented:
Here's an alternate method using xersoft's advice:
Private Sub MenuItem_Click
        Dim frm As Form
        For Each frm In Me.MdiChildren
            If TypeOf frm Is frmName Then
                Exit Sub
            End If
        Next
        Dim F As New frmCName
        F.MdiParent = Me
        F.Show()
    End Sub
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.