Handles abfragen / MenuStrip Click in Schleife abfragen

  • VB.NET

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

    Handles abfragen / MenuStrip Click in Schleife abfragen

    Hallo zusammen,

    ich habe einen MenuStrip, in dem ein Menüpunkt 'Ansicht' heißt. Unter diesem Punkt befinden sich mehrere Punkte, die der aktuellen Ansicht entspricht.
    Die ausgewählte Ansicht bekommt einen Haken und die vorherige Auswahl bekommt den Haken weg.
    Jetzt wollte ich mir das vereinfachen und nur eine Sub dafür erstellen, die im Handle sämtliche *.click der Ansicht-Auswahlen bekommt.

    Wie aber kann ich selektieren, welcher Punkt jetzt wirklich angeklickt wurde ?
    Ich würde jetzt generell alle Haken entfernen und dann bei dem geklickten einen Haken setzen.

    Kann mir da jemand helfen ?

    Gruß
    HerrFrie
    Vergib für Deine Ansicht menuItems 1 gemeinsamen Eventhandler vergeben, dann steht das aufrufende menuItem beim Ereignis in der Variable sender.

    Du kannst dann
    - den parent von sender ermitteln und die Checkboxen von dessen Children zurücksetzen
    - die checkbox von sender setzen
    Bei der Abfrage des Parents der Checkboxen muss natürlich sichergestellt sein, dass keine weiteren Checkboxen dieses Parent haben. Bei nur einigen Checkboxen ist es vielleicht sinnvoll, diese als Tabelle im Handler abzulegen und dann diese Tabelle so durchzugehen, wie Kangaroo beschrieben hat.
    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!
    Ok,

    mit sender.toString bekomme ich den Namen des angeklickten Eintrags in Ansicht.

    Ich habe jetzt eine Select Case Anweisung gemacht, bei der ich den .text der Item-Einträge unter Ansicht mit sender.toString vergleiche.

    Wie aber komme ich an den parent von sender, bzw. komme ich an das object von sender ran ? Wenn ich den Parent als object habe, kann ich dann wahrscheinlich mit for each control in (parent) --> Haken entfernen machen ?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Ansicht_klick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Bt_Ansicht_Mitglieder.Click, Bt_Ansicht_Ausgetretene.Click, Bt_Ansicht_ChronikMajestäten.Click, Bt_Ansicht_ChronikVorstand.Click, Bt_Ansicht_ChronikOffiziere.Click, Bt_Ansicht_Jubilare.Click
    2. ' Das Hauptitem heißt Bt_Ansicht
    3. TextBox1.Text = sender.ToString
    4. '
    5. Bt_Ansicht_Mitglieder.CheckState = CheckState.Unchecked
    6. Bt_Ansicht_Ausgetretene.CheckState = CheckState.Unchecked
    7. Bt_Ansicht_ChronikMajestäten.CheckState = CheckState.Unchecked
    8. Bt_Ansicht_ChronikVorstand.CheckState = CheckState.Unchecked
    9. Bt_Ansicht_ChronikOffiziere.CheckState = CheckState.Unchecked
    10. Bt_Ansicht_Jubilare.CheckState = CheckState.Unchecked
    11. Select Case sender.ToString
    12. Case Bt_Ansicht_Mitglieder.Text
    13. Bt_Ansicht_Mitglieder.CheckState = CheckState.Checked
    14. Case Bt_Ansicht_Ausgetretene.Text
    15. Bt_Ansicht_Ausgetretene.CheckState = CheckState.Checked
    16. Case Bt_Ansicht_ChronikMajestäten.Text
    17. Bt_Ansicht_ChronikMajestäten.CheckState = CheckState.Checked
    18. Case Bt_Ansicht_ChronikVorstand.Text
    19. Bt_Ansicht_ChronikVorstand.CheckState = CheckState.Checked
    20. Case Bt_Ansicht_ChronikOffiziere.Text
    21. Bt_Ansicht_ChronikOffiziere.CheckState = CheckState.Checked
    22. Case Bt_Ansicht_Jubilare.Text
    23. Bt_Ansicht_Jubilare.CheckState = CheckState.Checked
    24. End Select
    25. End Sub


    Unter Ansicht stehen nur die 6-8 Einträge für die verschiedenen Ansichten. Es ist immer nur eine Ansicht möglich. Die Haken werden mit BetroffenesItem.CheckState = true gesetzt.
    Hole Dir das Control direkt, nicht über .ToString oder .Text:

    VB.NET-Quellcode

    1. Private Sub CheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    2. Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged
    3. Dim cb As CheckBox = CType(sender, CheckBox)
    4. If (cb Is CheckBox1) Then
    5. ElseIf (cb Is CheckBox2) Then
    6. End If
    7. End Sub
    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!
    Das heißt dann

    VB.NET-Quellcode

    1. Dim Menü_klick As System.Windows.Forms.ToolStripMenuItem = CType(sender, System.Windows.Forms.ToolStripMenuItem)

    so.
    Danach mit

    VB.NET-Quellcode

    1. Menü_klick.CheckState = CheckState.Checked

    wird der angeklickte Eintrag ge-checked.

    Noch schöner wäre es jetzt, wenn ich alle Untereinträge des Parent von Menü_klick in einer Schleife unchecken könnte.
    Mit

    VB.NET-Quellcode

    1. Menü_klick.OwnerItem.Text
    bekomme ich den Parent-Text.

    Allerdings tue ich mich immer mit den for each Schleifen schwer.
    Ich bräuchte also eine for each Schleife, mit denen ich alle Controls unter dem Parent von Menü_klick unchecken kann.

    For Each System.Windows.Forms.ToolStripMenuItem In Menü_klick.Owner as Test
    Test.CheckState = CheckState.Unchecked
    Next

    Wie genau muß ich die Schleife dafür schreiben ?