Hallo liebe User.
Da ich selbst lange danach auf der Suche war, stelle ich euch gerne eine Kurzanleitung für das Tabbed Mdi-Handling bereit.
Ich habe ein Tutorial in C# auf codeproject.com gefunden "Tabbed MDI Child Forms" von "Serdar YILMAZ" und konnte es mit
Hilfe von @ErfinderDesRades aus diesem Forum hier erfolgreich für VB.Net umbauen.
Prinzipiell werden hier die Pages eines TabControl "missbraucht", um die Childs zu steuern. Der Vorteil davon ist genial und in meinen
Augen absolut brauchbar. Man kann zwischen offenen Childs hin- und her switchen, es wird beim Öffnen eine TabPage erstellt, beim Schließen
wird diese wieder gelöscht. Klickt man auf die TabPage des entsprechenden Childs, wird das Child automatisch aktiviert.
Noch ein großer Vorteil: Arbeitet man auf der Hauptform mit einem MenuStrip, so wird das MenuStrip der Childs "hinten dran gehangen" - so
als wäre nur ein einziges vorhanden.
Da ich selbst lange danach auf der Suche war, stelle ich euch gerne eine Kurzanleitung für das Tabbed Mdi-Handling bereit.
Ich habe ein Tutorial in C# auf codeproject.com gefunden "Tabbed MDI Child Forms" von "Serdar YILMAZ" und konnte es mit
Hilfe von @ErfinderDesRades aus diesem Forum hier erfolgreich für VB.Net umbauen.
Prinzipiell werden hier die Pages eines TabControl "missbraucht", um die Childs zu steuern. Der Vorteil davon ist genial und in meinen
Augen absolut brauchbar. Man kann zwischen offenen Childs hin- und her switchen, es wird beim Öffnen eine TabPage erstellt, beim Schließen
wird diese wieder gelöscht. Klickt man auf die TabPage des entsprechenden Childs, wird das Child automatisch aktiviert.
Noch ein großer Vorteil: Arbeitet man auf der Hauptform mit einem MenuStrip, so wird das MenuStrip der Childs "hinten dran gehangen" - so
als wäre nur ein einziges vorhanden.
- Erstellt wird ein neues Projekt "Windows Forms-App (.NET Framework)"
- Die Hauptform (Form1) setzen wir als MdiContainer. Dazu in den Eigenschaften
IsMdiContainer = True
- Auf der gleichen Form benötigen wir noch ein Panel oder Ähnliches, um unsere Buttons, TreeViews oder sonst was unterzubringen
Dazu "Panel" aus der Toolbox auswählen und im Anschluss in den EigenschaftenDock = Left
einstellen.
- Jetzt erstellen wir unsere Buttons, Labels, TreeViews (oder whatever) auf dem Panel und benennen die sinnvollerweise.
- Als nächstes ist unser TabControl an der Reihe. Dazu aus der Toolbox das TabControl auf die Form ziehen, in den Eigenschaften
Dock = Top
einstellen und soweit zusammenschieben, dass nur noch die TabPages zu sehen sind.
- Die TabPages werden im Anschluss alle gelöscht, sodass nur noch ein weißer Balken zu sehen ist. Für das TabControl
sollte noch in den EigenschaftenVisible = False
eingestellt werden, damit ist es nicht mehr sichtbar wenn keine
Childs geöffnet sind.
- Nun können auch schon die Childs erstellt werden. Das sind prinzipiell ganz normale Forms - ich setze deren Eigenschaft
WindowState = Maximized
, was aber eigentlich der Code später auch übernimmt. Auf den Forms könnt ihr euch nun austoben und
alles draufpacken, was benötigt wird. In meinem Beispiel ist auf jeder Form nur ein Label mit Text "Hallo, ich bin Child#"
- Zum Schluss natürlich noch ein bisschen Code, danke an der Stelle nochmal an @ErfinderDesRades für deine Hilfe
Der Code wird komplett auf der Hauptform plaziert - bei den Childs braucht es keinen Code.
VB.NET-Quellcode
- Private Sub ShowMdiChild(frm As Form)
- With frm
- If .Visible Then
- .BringToFront()
- Else
- .MdiParent = Me
- .Show()
- End If
- End With
- End Sub
- Private Sub MdiOpen(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
- If Me.ActiveMdiChild Is Nothing Then
- TabControl1.Visible = False
- Else
- Me.ActiveMdiChild.WindowState = FormWindowState.Maximized
- Dim tp As New TabPage(Me.ActiveMdiChild.Text)
- If Me.ActiveMdiChild.Tag Is Nothing Then
- tp.Tag = ActiveMdiChild
- tp.Parent = TabControl1
- TabControl1.SelectedTab = tp
- Me.ActiveMdiChild.Tag = tp
- AddHandler Me.ActiveMdiChild.FormClosed, AddressOf MdiClose
- End If
- If Not TabControl1.Visible Then TabControl1.Visible = True
- End If
- End Sub
- Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
- TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
- End Sub
- Private Sub MdiActivate(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged, Me.MdiChildActivate
- If TabControl1.SelectedTab IsNot Nothing AndAlso TabControl1.SelectedTab.Tag IsNot Nothing Then TryCast(TabControl1.SelectedTab.Tag, Form).Select()
- End Sub
- Private Sub btnChild_Click(sender As Object, e As EventArgs) Handles btnChild1.Click, btnChild2.Click, btnChild3.Click
- Select Case True
- Case sender Is btnChild1 : ShowMdiChild(My.Forms.childForm1)
- Case sender Is btnChild2 : ShowMdiChild(My.Forms.childForm2)
- Case sender Is btnChild3 : ShowMdiChild(My.Forms.childForm3)
- End Select
- End Sub
- Das Ergebnis kann sich, wie ich finde, sehen lassen
Alle 3 Childs geöffnet:
Child 2 selektiert:
Chidl 3 geschlossen:
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"