Tabbed Mdi

    • VB.NET
    • .NET (FX) 4.0
      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. :)


      • 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 Eigenschaften Dock = 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 Eigenschaften Visible = 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 :thumbup:
        Der Code wird komplett auf der Hauptform plaziert - bei den Childs braucht es keinen Code.

        VB.NET-Quellcode

        1. Private Sub ShowMdiChild(frm As Form)
        2. With frm
        3. If .Visible Then
        4. .BringToFront()
        5. Else
        6. .MdiParent = Me
        7. .Show()
        8. End If
        9. End With
        10. End Sub
        11. Private Sub MdiOpen(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
        12. If Me.ActiveMdiChild Is Nothing Then
        13. TabControl1.Visible = False
        14. Else
        15. Me.ActiveMdiChild.WindowState = FormWindowState.Maximized
        16. Dim tp As New TabPage(Me.ActiveMdiChild.Text)
        17. If Me.ActiveMdiChild.Tag Is Nothing Then
        18. tp.Tag = ActiveMdiChild
        19. tp.Parent = TabControl1
        20. TabControl1.SelectedTab = tp
        21. Me.ActiveMdiChild.Tag = tp
        22. AddHandler Me.ActiveMdiChild.FormClosed, AddressOf MdiClose
        23. End If
        24. If Not TabControl1.Visible Then TabControl1.Visible = True
        25. End If
        26. End Sub
        27. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
        28. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
        29. End Sub
        30. Private Sub MdiActivate(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged, Me.MdiChildActivate
        31. If TabControl1.SelectedTab IsNot Nothing AndAlso TabControl1.SelectedTab.Tag IsNot Nothing Then TryCast(TabControl1.SelectedTab.Tag, Form).Select()
        32. End Sub
        33. Private Sub btnChild_Click(sender As Object, e As EventArgs) Handles btnChild1.Click, btnChild2.Click, btnChild3.Click
        34. Select Case True
        35. Case sender Is btnChild1 : ShowMdiChild(My.Forms.childForm1)
        36. Case sender Is btnChild2 : ShowMdiChild(My.Forms.childForm2)
        37. Case sender Is btnChild3 : ShowMdiChild(My.Forms.childForm3)
        38. End Select
        39. End Sub

      • Das Ergebnis kann sich, wie ich finde, sehen lassen :)
        Alle 3 Childs geöffnet:
        Child 2 selektiert:
        Chidl 3 geschlossen:
      [list=1][/list]
      Dateien
      • TabbedMdi.zip

        (51,99 kB, 117 mal heruntergeladen, zuletzt: )
      "Na, wie ist das Wetter bei dir?"
      "Caps Lock."
      "Hä?"
      "Shift ohne Ende!" :thumbsup: