MDI-Projekt mit einem TabControl

    • VB.NET
    • .NET (FX) 4.5–4.8

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      MDI-Projekt mit einem TabControl

      In diesem Theread kam mir die Idee, mal ein Rudiment für ein Multi-Document-Interface zu bauen, bei dem die Dokumente in einem TabControl aufgelistet sind.
      Elementar einfach, deswegen nur ein Button zum Hinzufügen eines neuen Dokuments, das Close-Handling wird dann über das Dokument selbst ausgelöst und per Event im Hauptfenster durchgeführt.
      Zunächst wird eine ganz normale MDI-Applikation generiert mit Form1 als MDI-Parent und Form2 als MDI-Child.
      Nach dem Erstellen eines MDI-Childs werden die MDI-Properties gesetzt und eine TabPage für dieses MDI-Childs generiert.
      Diese TabPage wird zum Parent für das MDI-Child, eine laufende Nummer wird als Tabulator angezeigt und dem MDI-Child als Property mitgegeben.
      Feddich.
      Die Bilder zeigen das Programm nach dem Start, nach dem Erstellen von 5 MDI-Tab-Childs sowie nach dem Löschen der Dokumente / Tabs 1 und 3.

      Viel Spaß.
      Dateien
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Zum einen ist dein Projekt kein MDI, jdfs nicht was in WinForms darunter verstanden wird (mit MdiParent und MdiChildren).
      Es ist ein Tabbed-UI (und solch ist für Multi-Documents tatsächlich meist ergonomischer als MDI)

      Zum andern finde ich sehr unschicklich, dass du die Form-Klasse als UserControl missbrauchst.
      Warum nimmst du nicht, was dafür vorgesehen ist: UserControl?
      Einfach Menu-Project-UserControl_Hinzufügen - und loslegen mit Designen. Ist dasselbe wie wenn man ein Form zufügt, nur ist ein UserControl

      Das Einbasteln von Ucl-Instanzen im TabControl ist prinzipiell dasselbe, nur kommt halt mit Framework-Bordmitteln aus, ohne Rückgriff auf Win-Api:

      VB.NET-Quellcode

      1. Private Sub OpenDocument(name As String)
      2. Dim ucl = New uclDocument With {.Dock = DockStyle.Fill}
      3. Dim tp = New TabPage With {.Text = name}
      4. tp.Controls.Add(ucl)
      5. Me.TabControl1.Controls.Add(tp)
      6. TabControl1.SelectedTab = tp
      7. 'weitere Konfiguration des Ucls, Daten laden, Events abonnieren...
      8. End Sub
      Dateien
      • TabbedUI.zip

        (14,99 kB, 188 mal heruntergeladen, zuletzt: )

      ErfinderDesRades schrieb:

      Zum einen ist dein Projekt kein MDI

      Form1.Designer.vb schrieb:

      VB.NET-Quellcode

      1. Me.IsMdiContainer = True

      Form1.vb schrieb:

      VB.NET-Quellcode

      1. dlg.MdiParent = Me
      Sondern?
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      ich sags doch: Das sind einfach Forms, die als UserControls missbraucht werden. Es ist kein MDI, sondern ist Tabbed-UI - und zwar auf eigentümliche Weise umgesetzt.
      Die MDI-Funktionalität deiner Forms funktioniert ja auch garnet - ist unterbunden durch diesen Einbau als Control.

      Guck - MDI im Sinne von WinForms sähe so aus:

      Dateien
      • TestMdiForms.zip

        (15,2 kB, 170 mal heruntergeladen, zuletzt: )
      @ErfinderDesRades Sorry, das war eine Uminterpretation der Worte "Dokument" und "Document.View" (MFC). ;)
      An diese ursprüngliche MDI-Philosophie halten sich eh nicht mehr ganz alle Entwickler & Co.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!