Link to home
Start Free TrialLog in
Avatar of bhlang
bhlangFlag for Canada

asked on

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?
ASKER CERTIFIED SOLUTION
Avatar of Jorge Paulino
Jorge Paulino
Flag of Portugal image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of xersoft
xersoft

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.
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
Avatar of bhlang

ASKER

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
Avatar of bhlang

ASKER

xersoft, I didn't see your solution before accepting the first one. Sorry mate.
Avatar of bhlang

ASKER

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