Click here to Skip to main content
Click here to Skip to main content

A Simple Tabbed MDI

By , 12 Mar 2005
 

Sample Image - simpleTabbedMDI.jpg

Introduction

I have tinkered with using a tab control to keep track of open MDI child forms. This has been part of my introduction to .NET, coming from the VB6 needed to find out how to do the basics.

My team is working on rewriting a large legacy application, and we have been working on getting a GUI framework set out. We didn't want the child forms appearing on the Windows task bar, but still wanted users to be able to switch between forms in a similar manner.

Key Components

The tab control has all the functionality, look and feel we were looking for. What we needed was a way to link forms to the tab pages. So we created a private variable as a TabPage object to hold the tab page, basically the description of the form.

How do we get this tab page onto the tab control which is located on the MDI form. Enter stage left, property ParentForm, and Friend function identifier.

When the child form loads we set a variable to the ParentForm of the child form, which leads to the MDI form. On the MDI form we have two functions, AddTabPage and RemoveTabPage.

Friend Sub AddTabPage(ByVal tp As TabPage)
    With TabControl1
        .TabPages.Add(tp)
        .SelectedTab = tp
    End With

End Sub
Friend Sub RemoveTabPage(ByVal tp As TabPage)
    TabControl1.TabPages.Remove(tp)

End Sub

Using the Friend identifier allows the methods to be called from child forms. So when the child form loads we call the AddTabPage, and when the form closes we call RemoveTabPage.

Private Sub Form2_Load(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles MyBase.Load
    pForm = Me.ParentForm
    pForm.AddTabPage(tp)

End Sub
Private Sub Form2_Closing(ByVal sender As Object, _ 
          ByVal e As System.ComponentModel.CancelEventArgs) _
          Handles MyBase.Closing
    pForm.RemoveTabPage(tp)

End Sub

Final Step

What to do when the tab control pages change? We have used minimizing and maximizing of the child forms. Since the MDI children and the tab pages are managed in parallel, the index of the MDIChildren collection corresponds to the tab pages. So all we need to do is maximize the form which corresponds to the index of the tab page selected.

Private Sub TabControl1_SelectedIndexChanged( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) _
    Handles TabControl1.SelectedIndexChanged

Dim i As Integer
    If TabControl1.TabPages.Count > 0 Then
        For i = 0 To Me.MdiChildren.Length - 1
            If i = TabControl1.SelectedIndex Then
                Me.MdiChildren(i).WindowState = FormWindowState.Maximized
            Else
                Me.MdiChildren(i).WindowState = FormWindowState.Minimized
            End If
        Next
    End If

End Sub

Conclusion

This seems to work for us, we thought it was very simple and couldn't find anything similar out there.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Darryl Preen
Web Developer
United States United States
I have been programming since mid 80's. Work mostly with VB / ASP. SQL Server for the longest time.
 
I am currently at a manufacturing company, running a small development team. We are moving to .Net.
 
Also have an insane obsession with fractals.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralDoesn't seem to support Ctrl-Tabmemberemunews14-May-10 8:46 
This doesn't seem to allow users to cycle through the child windows using Ctrl+Tab. Also, there seems to be bug in handling the arrow keys to switch child windows when the tab control has focus.
QuestionUse MDIParent and MDIChildren in Application What is mean?memberusarrow2321-Aug-06 17:14 
Who's know use MDIParent and MDIChildren in Application ?
and all mean of using it ?
Confused | :confused:
I think it has 2 reason:
1. Browse and process for each form MDIChildren in MDIParent if you need.
2. Process to update parallel data.
How do you think ?
 
=-=-=-=-=-=--=-=-=-=-=-=-=-=
Thanh Tran Trung
Mobile: +84 989099454
Email: ttthanh23@gmail.com
=-=-=-=-=-=--=-=-=-=-=-=-=-=

GeneralMinor picky points .....memberfwsouthern13-Mar-05 9:29 
1. Shouldn't this be listed under "VB.NET" rather than "C#.NET"?
2. Your use of "Maximized" and "Minimized" in TabControl1_SelectedIndexChanged seems to be counterproductive -- aside from a gross buffering problem (look at double buffering), wouldn't it be simpler and eliminate the flashing to use Me.MdiChildren(i).BringToFront() and scratch the "else"?
3. And wouldn't it simplify things and make less code to pass the "index" variable to this routine and not have to iterate through all occurrences?
GeneralRe: Minor picky points .....memberdp_batman13-Mar-05 14:22 
Thanks.
 
I tried using Bring to front, but I kept having the forms loose the maximized window state. I have a Outlook style menu control on the left hand side of the MDI form.
 
Have not worked out if it has to do with the Splitter control, status bar or the outlook bar.
 
Also, good comment about the index, will look into that too.

GeneralRe: Minor picky points .....memberfwsouthern14-Mar-05 5:12 
Might help to see the actual code you are using rather than the sample provided -- the only change I made was:
 
Private Sub TabControl1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged
Dim i As Integer
If TabControl1.TabPages.Count > 0 Then
For i = 0 To Me.MdiChildren.Length - 1
If i = TabControl1.SelectedIndex Then
Me.MdiChildren(i).BringToFront()
' Me.MdiChildren(i).WindowState = FormWindowState.Maximized
' Else
' Me.MdiChildren(i).WindowState = FormWindowState.Minimized
End If
Next
End If
End Sub
 
which seems to work maximized (minimizing a child form minimizes all child forms, maximizing a child form maximizes all child forms).
QuestionScreenshot and Source???memberAxelM12-Mar-05 22:14 
Where's the Screenshot and the source??

AnswerRe: Screenshot and Source???memberdp_batman13-Mar-05 6:10 
Sorry, thought I had lost the article after I typed it. Attachments should be in place now.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130619.1 | Last Updated 12 Mar 2005
Article Copyright 2005 by Darryl Preen
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid