We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

Limit a MDI Child Form to only one instance

bhlang
bhlang asked
on
Medium Priority
1,193 Views
Last Modified: 2008-03-17
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?
Comment
Watch Question

IT Pro/Developer
CERTIFIED EXPERT
Top Expert 2008
Commented:
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

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Commented:
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.

Commented:
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

Author

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

Author

Commented:
xersoft, I didn't see your solution before accepting the first one. Sorry mate.

Author

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
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.