Menüpanel links & oben mit Inhaltsbereich

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von cube.

    Menüpanel links & oben mit Inhaltsbereich

    Hallo,

    ich bin nicht wirklich fündig geworden...

    Ich möchte ein kleines Tool mit einem Hauptmenü und mehreren Untermenüs schreiben.
    Die Standard-Menüleiste möchte ich nicht benutzen, sondern mein eigenes Menüdesign benutzen...

    Folgendes Layout habe ich in einer Userform
    • links eine Menüleiste als Hauptmenü: ein Panel mit einem UserControl
    • oben eine Menüleiste als Untermenü welches sich je nach Menüpunkt aus dem linken Hauptmenü anpassen soll: Panel mit wechselnden UserControls
    Also ein Panel mit UserControl links, ein Panel mit USercontrol oben, ein Panel was den rest ausfüllt = Inhaltsbereich

    ​Leider schaffe ich es nicht das UserControl im Menü oben zu wechseln, wenn ich im Menü links auf einen Button klicke.
    Ich habe keinen Zugriff auf das PanelOben.
    Mit einem Button direkt auf der Userform kann ich das UserControl oben löschen und neu hinzufügen. Nur eben aus aus einem anderen Panel nicht.

    Mache ich da grundsätzlich was falsch? Darf ich keine Panels benutzen? Wie baue ich am besten die Menüstruktur auf?
    Ich habe es auch mit einem Splitter und SplitContainer ausprobiert.

    Gibt es vielleicht eine Hilfestellung/Beschreibung an der ich mich entlanghangeln kann??

    Danke schonmal !!

    mfg Thorsten
    mir fällt es etwas schwer aus deiner Beschreibung ein Design abzuleiten und daher kapiere ich gerade auch nicht, was genau du da erreichen willst.

    Wie wäre es, wenn du 1-2 Entwürfe mit Paint kritzelst, damit wir verstehen können, wo die Reise hingehen soll?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Klar kannst Du nicht einfach aus Hauptmenü-UserControl1 mal so nebenbei das Untermenü/UserControl2 löschen. Das wäre eine Verletzung des was-meins-ist-bestimme-noch-immer-ich-selbst-Prinzips (oder kurz: Kapselung). Es sehe daher momentan zwei Möglichkeiten: Das ganze Menü wird ein eigenes, in sich geschlossenes CE gepackt. Oder Du schickst z.B. per EventRaising vom Hauptmenü eine "Bitte" an das Formular, dass es sich doch mal bitte das Untermenü kümmert und es wechselt.
    Kurz zur Erklärung: Das Formular (kurz: Form) beinhaltet das Hauptmenü links (User-CE1) und zum anderen das Untermenü oben (User-CE2). Damit ist Form der Boss und User-CE1 und User-CE2 innerhalb des Forms gleichberechtigt und parallel nebeneinander. Daher Ist User-CE1 nicht berechtigt (unter Umgehung von Form) das User-CE2 direkt selbst zu ändern. Es muss den Boss schon bitten, dies zu tun.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich habe mich nun daran versucht...
    Ich schaffe es lediglich, im oberen Panel die UserControls zu wechseln, wenn ich Button2 und Button3 drücke (diese liegen direkt auf der Userform).
    Die Buttons 1 und 2 liegen auf einem Usercontrol im linken Panel - damit schaffe ich es nicht.

    Hier der Code der klappt.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Event Panel2UserControl2()
    3. Public Event Panel2UserControl3()
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim usrcontrol As New UserControl1
    6. Panel1.Controls.Add(usrcontrol)
    7. End Sub
    8. Private Sub OpenUC2() Handles Me.Panel2UserControl2
    9. Dim usrcontrol As New UserControl2
    10. Panel2.Controls.Clear()
    11. Panel2.Controls.Add(usrcontrol)
    12. End Sub
    13. Private Sub OpenUC3() Handles Me.Panel2UserControl3
    14. Dim usrcontrol As New UserControl3
    15. Panel2.Controls.Clear()
    16. Panel2.Controls.Add(usrcontrol)
    17. End Sub
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. RaiseEvent Panel2UserControl2()
    20. End Sub
    21. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    22. RaiseEvent Panel2UserControl3()
    23. End Sub
    24. End Class


    Was muss ich tun, damit ich vom UserControl1 im Panel1 diese Aktionen ausführen kann?

    Danke nochmals!!

    mfg Thorsten
    Bilder
    • Layout.png

      11,41 kB, 612×388, 75 mal angesehen
    Nee, das EventRaising kannste Dir im Formular sparen. Das sieht man ja ab den Zeilen#12 und #18. Das Formular kann mit dem UserForm machen, was es will. Nur musst Du das so machen, dass das linke UserControl ein Event "raised" und das Formular dann reagiert. Also die Prozeduren ab Z#12 und #18 lassen, aber Zeile#3, #4, #25, #29 ins linke UserControl verfrachten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke schonmal für den Tip.
    An meiner Umsetzung scheitert es aber gerade :(

    Das linke UserControl habe ich angepasst.
    Wie kriegen die beiden Sub's in der Form nun mit, dass sie ausgeführt werden sollen (Handles-Bereich)?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim usrcontrol As New UserControl1
    4. Panel1.Controls.Add(usrcontrol)
    5. End Sub
    6. Private Sub uc1_OpenUC1() Handles ......
    7. Dim usrcontrol As New UserControl2
    8. Panel2.Controls.Clear()
    9. Panel2.Controls.Add(usrcontrol)
    10. End Sub
    11. Private Sub uc1_OpenUC2() Handles ......
    12. Dim usrcontrol As New UserControl3
    13. Panel2.Controls.Clear()
    14. Panel2.Controls.Add(usrcontrol)
    15. End Sub
    16. End Class


    VB.NET-Quellcode

    1. Public Class UserControl1
    2. Public Event Panel2UserControl2()
    3. Public Event Panel2UserControl3()
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. RaiseEvent Panel2UserControl2()
    6. End Sub
    7. Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
    8. RaiseEvent Panel2UserControl3()
    9. End Sub
    10. End Class


    Danke nochmals!!

    mfg Thorsten
    Es gibt m.E. 2 Möglichkeiten, dem Formular klarzumachen, dass es auf UC1-Events reagieren soll. Statische und dynamische Bindung.

    Wenn Du mit Handles arbeiten willst, dann ist das die statische Bindung und Du musst in Form1 das UserControl1 folgendermaßen definieren:

    VB.NET-Quellcode

    1. Public WithEvents UserControl1 As UserControl1

    Dieses WithEvents müsstest Du, wenn Du das UserControl einfach auf Dein Formular ziehst, in der Form1.Designer.VB-Datei einbauen. Da sollte eine ähnlich lautende Zeile irgendwo auftauchen. Nur eben bisher ohne dieses WithEvents.

    Ansonsten arbeitest Du mit dynamischer Event-Bindung. Dazu z.B. im Form1_Load-EventHandler:

    VB.NET-Quellcode

    1. AddHandler UserControl1.Panel2UserControl2, AddressOf uc1_OpenUC2

    Damit sagst Du: "Hey, Form1! Es kann sein, dass das Objekt UserControl1 ein Event namens Panel2UserControl2 durch die Gegend schmeißt. Sobald das passiert, rufe die Prozedur uc1_OpenUC2 auf." So ungefähr ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank!!
    Nachdem ich es mir zwischendrin etwas schwer gemacht habe, klappt es nun.

    So sieht nun der Code in Form1 aus:

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Public WithEvents UserControl1 As New UserControl1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Panel1.Controls.Clear()
    5. Panel1.Controls.Add(UserControl1)
    6. End Sub
    7. Public Sub Panel2_UserControl2() Handles UserControl1.Panel2UserControl2
    8. Dim usrcontrol As New UserControl2
    9. Panel2.Controls.Clear()
    10. Panel2.Controls.Add(usrcontrol)
    11. End Sub
    12. '
    13. Public Sub Panel2_UserControl3() Handles UserControl1.Panel2UserControl3
    14. Dim usrcontrol As New UserControl3
    15. Panel2.Controls.Clear()
    16. Panel2.Controls.Add(usrcontrol)
    17. End Sub
    18. End Class


    mfg Thorsten