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?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
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.
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
CompTIA Security+

Learn the essential functions of CompTIA Security+, which establishes the core knowledge required of any cybersecurity role and leads professionals into intermediate-level cybersecurity jobs.

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
bhlangAuthor Commented:
xersoft, I didn't see your solution before accepting the first one. Sorry mate.
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.