TabPages im Designer entwerfen

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      TabPages im Designer entwerfen

      Findet Ihr es nicht auch lästig, dass es kein dem UserControl äquivalentes Control für eine TabPage gibt?
      Ein TabControl hält, vollständig im Designer erstellt, immer alle Objekte aller TabPages, und das ist meiner Meinung nach nicht unbedingt im Sinne der ObjektOrientierten Programmierung.
      Wenn man eine von TabControl abgeleitete Klasse erstellt, zeigt sich beim Doppelklick drauf im Projektmappen-Explorer solch eine Darstellung:

      Mit einem kleinen Trick lässt sich der Designer dazu benutzen, TabPages solo zu bearbeiten, die dann einfach dem TabControl per Code hinzugefügt werden.
      Also:
      1. ein TabControl auf die betreffende Form ziehen.
      2. wenn nicht gewünscht die beiden Default-TabPages löschen.


      3. fügen wir dem Projekt eine Windows Form hinzu und geben ihr einen ordentlichen Namen: TabTest1
      und weil das so einfach ist, gleich noch eine: TabTest2:

      4. Diese beiden Formen befüllen wir nun mit den im TabControl gewünschten Controls:

      5. und schreiben folgenden Code in die Form1_Load:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      2. Me.TabControl1.Controls.Add(New TabTest1)
      3. Me.TabControl1.Controls.Add(New TabTest2)
      4. End Sub
      Was passiert?
      Nix. Richtig.
      Nun kommt der große Trick:
      6. Wir öffnen die Dateien TabTest1.Designer.vb und TabTest2.Designer.vb um Editor und ändern die Basisklasse von System.Windows.Forms.Form in System.Windows.Forms.TabPage:

      VB.NET-Quellcode

      1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
      2. Partial Class TabTest1
      3. Inherits System.Windows.Forms.TabPage
      4. 'Inherits System.Windows.Forms.Form
      Lasst aber die Original-Zeile als Kommentar stehen, denn wenn Ihr den Designer noch einmal bemühen wollt, müsst Ihr wieder zurück auf Form switchen. 8o
      Nun wird alles compiliert.
      Es zeigt sich, dass der Designer für die Form-Basisklasse 2 Einträge erstellt hat, die eine TabPage nicht kennt:

      7. Diese Zeilen werden einfach für jede so erstellte TabPage gelöscht und feddich.
      Compilieren, starten, staunen:
      Bilder
      • Projekt.png

        16,9 kB, 273×322, 164 mal angesehen
      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).
      VB-Fragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

      Alternativ könnte ich folgende kleine Extension anbieten:

      VB.NET-Quellcode

      1. <Extension()> _
      2. Public Sub AddUserControls(tc As TabControl, ParamArray ucls() As UserControl)
      3. tc.SuspendLayout()
      4. For i = 1 To ucls.Length
      5. Dim ucl = ucls(i - 1)
      6. Dim txt = If(TryCast(ucl.Tag, String), "TabPage" & i)
      7. Dim tp = New TabPage With {.Text = txt}
      8. ucl.Dock = DockStyle.Fill
      9. tp.Controls.Add(ucl)
      10. tc.TabPages.Add(tp)
      11. Next
      12. tc.ResumeLayout()
      13. End Sub
      Das added eine Tabpage, und schmeißt das UserControl drauf - man kann sogar mehrere gleichzeitig initialisieren:

      VB.NET-Quellcode

      1. Public Class frmMain
      2. Public Sub New()
      3. InitializeComponent()
      4. TabControl1.AddUserControls(New uclPersonenInput, New uclArticle)
      5. End Sub
      6. End Class
      Nur für die TabPage-Beschriftung muss man sich was ausdenken, weil ein UserControl hat keine designer-unterstützte Text-Property: Hab ich hier so gelöst, dass man den Text dann halt in die Tag-Property schreibt.

      Hmm - im Grunde auch Quatsch: Warum nicht einfach wie vorgesehen UserControls entwickeln, und die im Designer aufs TabControl packen? (s. frmMain2)
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()