UserControl-based-Forms

    • VB.NET

    Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von vbnoooob.

      UserControl-based-Forms

      Da ich mir gedacht habe, dies könnte hilfreich für einige Programme hier im VB-Paradise sein, gibts
      heute ein Tutorial wie man ganz einfach eine "UserControl-based-Form" macht.

      Was ist das überhaupt?
      Eine "UserControl-based-Form" ist eine Anwendung, die auf MDI, Tabs und mehrere Forms verzichtet.
      Sie ist ungefähr wie Tabs, verhält sich aber wie eine normale Anwendung mit Forms, da die Forms unabhängig sind und nicht, wie bei Tabs auf das Hauptfenster angewiesen sind.
      Ich persönlich bevorzuge diese Technik, weil es die Probleme mit Tabs und mehreren Forms aus dem Weg schafft.
      Ich hoffe, das ist gut erklärt.

      Was man dafür braucht:
      1 Form
      x Buttons
      1 Panel

      Vorbereitung:
      Erstelle eine Windows Forms Anwendung
      Ziehe zwei Buttons auf die Form und platziere sie unter der Titelleiste ( Name: Hauptmenü, Über )
      Nimm ein Panel und breite es über die ganze Form ( ausgenommen der Buttons ) aus
      Gebe dem Panel folgende Eigenschaften:
      - Anchor=Top, Left, Right, Bottom
      Öffne das Codefenster mit F7

      Okay...das wäre fertig. Die Form ist eingerichtet.
      Der etwas knifflige Schritt bei dem ganzen, ist die Übersicht, da der Code schnell über mehrere hundert Zeilen lang werden kann auf der Hauptform.
      Aber das soll ja nicht stören, also ignorieren.

      Am anfang sieht die Form folgendermaßen im Code aus:

      VB.NET-Quellcode

      1. Public Class Form1
      2. End Class


      Da muss erstmal ein Enumerater rein.
      Mit folgenden Werten:
      - main = 0
      - about = 1
      also so:

      VB.NET-Quellcode

      1. Public Enum content
      2. main = 0
      3. about = 1
      4. End Enum


      Nachdem der Schritt getan ist, gehts ans Verarbeiten der Daten in der Methode "changeContent"

      VB.NET-Quellcode

      1. Sub changeContent(ByVal content As content)
      2. If Not myUC Is Nothing Then ' wenn nicht myUC Nichts
      3. Select Case myUC.Name
      4. Case "uc_main" ' wenn myUC.Name = "uc_main"
      5. RemoveHandler uc_main.changeUC, AddressOf changeUC ' lösche den Handler von uc_main auf changeUC
      6. End Select
      7. End If
      8. Select Case content
      9. Case Form1.content.main ' wenn content = content.main
      10. myUC = New uc_main ' erstelle neues UserControl von uc_about
      11. myUC.Name = "uc_main" ' setze Namen
      12. AddHandler uc_main.changeUC, AddressOf changeUC ' erstelle Handler changeUC
      13. Case Form1.content.about ' wenn content = content.about
      14. myUC = New uc_about ' erstelle neues UserControl von uc_about
      15. myUC.Name = "uc_about" ' Namen setzen
      16. End Select
      17. mainContent.Controls.Clear() ' mainContent ist das Panel
      18. If myUC IsNot Nothing
      19. myUC.Dock = DockStyle.Fill ' fülle das Panel mit dem UserControl aus
      20. mainContent.Controls.Add(myUC) ' füge myUC dem mainContent hinzu
      21. End If
      22. End Sub

      Ich hoffe die Kommentare sind einleuchtend, weil ich nicht so gut erklären kann^^

      Hier wird der Editor einige Fehler werfen, was nicht stören soll, kommt alles noch.

      Was auffält, es wird immer myUC benutzt, aber nirgendwo deklariert.
      Also:

      VB.NET-Quellcode

      1. Dim myUC As UserControl

      fertig

      Das wäre schonmal der erste Fehler.
      Jetzt müssen die UserControls angelegt werden.

      Dafür einfach ein neues BenutzerSteuerelement zum Projekt hinzufügen und "uc_main" nennen.
      Gleich ein zweites dazu und das wird "uc_about" genannt, und schon sind nurnoch vier Fehler drin.

      Die auch sogleich behoben werden.

      In der Codeansicht von uc_main schreibt man folgendes rein:

      VB.NET-Quellcode

      1. Public Shared Event changeUC(content As Object)

      Und gleich zwei weitere Fehler terminiert

      Die letzten zwei Fehler kann man so in der Hauptform terminieren:

      VB.NET-Quellcode

      1. Sub changeUC(content As Object)
      2. changeContent(content)
      3. End Sub


      Und keine Fehler mehr.

      Nun werden die Buttons belegt.

      Der erste mit "Hauptmenü" muss so belegt werden:

      VB.NET-Quellcode

      1. Private Sub btn_mainmenu_Click() Handles btn_mainmenu.Click()
      2. changeContent(Form1.content.main)
      3. End Sub


      Den zweiten belegt man wie folgt:

      VB.NET-Quellcode

      1. Private Sub btn_about_Click() Handles btn_about.Click()
      2. changeContent(Form1.content.about)
      3. End Sub


      und voilà, da ist das Programm, dass keine zweiten Forms braucht, keine Tabs und viel schöner ist.
      Der Code kann natürlich mit zehntausend verschiedenen Möglichkeiten verbessert, erweitert, auf persönliche Bedürfnisse angepasst werden,
      aber dies ist nur der Grundstein, deswegen: tu was immer du willst mit dem Code solange du ihn nicht unter deinem Namen verteilst,
      ohne meine Einwilligung irgendwo Veröffentlichst und auch nicht verkaufst.

      Ich hoffe, dieses Tutorial hat irgendwo einen Sinn, denn sonst wäre die Arbeit umsonst gewesen.

      Im Anhang das Beispielprojekt. Natürlich Option Strict On!

      Fragen bitte hier posten und nicht per PN.
      Dateien

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AliveDevil“ () aus folgendem Grund: "Beschreibung" eingefügt und Titel umbenannt

      Der Coode ist sehr gut gelungen, aber ich mache dass mit Eigenschaften, ich habe ein root hoster (UserControll) und darin verwalte ich dann die InhaltsElemente (ContentUserControls)!
      Irgendwie klappt es nicht bei mir. Ich habe den Code kopiert und trotzdem zeigt es immer noch Fehler an.

      "RemoveHandler uc_main.changeUC, AddressOf changeUC"

      changeUC ist kein Ereignis von < Programmname >.uc_main

      sind noch weitere Fehler die später noch posten werde.
      Danke im voraus