ContextMenü auswerten

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

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

    ContextMenü auswerten

    Sorry, ich studiere stundenlang an einem so blöden und einfachen Problem herum! Aber ich krieg es einfach nicht hin!

    Ich setze ein ganz einfaches ContextMenü auf:

    ConMenu.Items.Add("Neues Bild öffnen...")
    ConMenu.Items.Add("Bild speichern...")
    ConMenu.Items.Add("Bild aus Datenbank löschen...")
    ConMenu.Items.Add("Bild aus Datenbank und von Festplatte löschen...")

    Dann möchte ich ganz einfach bei die Clicks auswerten:

    Private Sub ConMenu_Click(sender As Object, e As EventArgs) Handles ConMenu.Click
    Select Case sender????????
    Case "Diese Spalte ausblenden"
    Dim vHeader As String = grRes.Columns(mouseLocation.ColumnIndex()).HeaderText
    grRes.Columns(mouseLocation.ColumnIndex).Visible = False
    If vHeader <> "Titel" And vHeader <> "Art" Then
    dbSysDao = dbEn.OpenDatabase(vdbSysPath, Nothing, False)
    dbSysDao.Execute("UPDATE Optionen SET grRes" & vHeader & "JaNein = False WHERE rDbName = '" & rDbName & "'")
    dbSysDao.Close()
    Else
    MessageBox.Show("Die Spalten >Art< und >Titel< können nicht ausgeblendet werdenl", "Hinweis für Ressourcen-Tabelle", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End If
    Case "Neues Bild öffnen..."
    Case "Bild speichern..."
    Case "Bild aus Datenbank löschen..."
    Case "Bild aus Datenbank und von Festplatte löschen..."
    End Select
    End Sub

    Das Problem: Ich weiss einfach nicht, wie ich diese ContextMenuItems.Text mit SelectCase auswerten kann. Irgendwie brauche ich ja dazu ja den selektierten Index des Menüs, welches gewählt wird. Dann könnte ich die Abfrage so machen:

    if ConMenu.Items.item(???? Index).text = "Neues Bild öffnen" then ...

    Aber wie geht das? Ich krieg das einfach nicht hin. Kann mir jemand helfen?
    Ganz herzlichen Dank!

    Ps. Wie kann man den Code besser formatieren? Habe auf Qellcode geklickt, bringt aber nichts
    Nach was'n Zufall, dass ich gerade meinen Code schöner mache und da genau die gebrauchte Funktion habe:

    VB.NET-Quellcode

    1. Dim tp_selectedConMenuText = "" 'ggf. mit As String, falls Du kein "Option Infer On" hast
    2. For Each lp_MenuItem As ToolStripItem In ConMenu.Items
    3. If lp_MenuItem.Selected Then tp_selectedConMenuText = lp_MenuItem.Text: Exit For
    4. Next
    5. Select Case tp_selectedConMenuText
    6. Case "Neues Bild öffnen...": 'und hier geht Dein Code entsprechend weiter
    7. [...]
    8. End Select
    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.
    Gestalte dein ContextMenü im Designer.
    Und doppelklickse dort die Menu-Item, dann generiert er dir auch den EreignisHandler.
    Den Text der MenuItems solltest du nicht auslesen und verarbeiten - das bringt langfristig Probleme, weil man den immer mal ändern will, und dann alle Stellen mit-ändern muss, die sich darauf beziehen - wie gesagt: das wäre sehr schlechter Stil.

    icewather schrieb:

    Wie kann man den Code besser formatieren?

    Na sehr schön, dass ich genau den von EDR genannten Link noch nachträglich reinbringen wollte (da ich den selber neulich erst verwendet hatte) und dann gleich auch noch mit meinem Code in das von EDR genannte Fettnäpfchen trete :S
    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 empfehle das Kontext Menü über den Designer zusammen zu klicken. Falls das nicht geht da Elemente dort diverse Abhängigkeiten haben und entsprechend dynamisch bleiben müssen, muss eben das Kontext Menü zur Laufzeit erstellt werden. Dann aber den "AddHandler" der zur entsprechenden Methode führt nicht vergessen.

    Hab die Funktionalität des WinForms Kontext Menüs nicht parat. Bei devexpress z.B. kann ich meinen Kontext Menü Einträgen "Tags" hinterlegen, welche dann entsprechend später ausgewertet werden können. Evtl. gibts das auch bei WinForms.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Guten Morgen die freundlichen "Nachtarbeiter"
    Hei, hab mich wirklich gefreut, dass ihr mir so rasch verschiedene Antworten schreibt. Das Kontextmenü erstelle ich laufend. Mit dem MouseEnter-Event schreibe ich jeweils die KontextMenü Inhalte in den ContextMenuStrip und kann diese Menüpunkte jeweils direkt mit der Funktion von VaporiZed auswerten. Auf diese Weise brauche ich nur ein einziges ContextMenuStrip für die ganze Applikation. - Allerdings stellt sich schon die Frage, ob es nicht einfacher wäre, für jeden KontextMenü ein eigenes ContextMenuStrip im Designer zu erstellen und dann auch entsprechend abzufragen. Weiss es auch nicht...
    Vielen herzlichen Dank.
    @icewather So was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ConMenu As New ContextMenuStrip
    3. Dim item1 As ToolStripMenuItem
    4. Dim item2 As ToolStripMenuItem
    5. Dim item3 As ToolStripMenuItem
    6. Dim item4 As ToolStripMenuItem
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. item1 = New ToolStripMenuItem("Neues Bild öffnen...")
    9. item2 = New ToolStripMenuItem("Bild speichern...")
    10. item3 = New ToolStripMenuItem("Bild aus Datenbank löschen...")
    11. item4 = New ToolStripMenuItem("Bild aus Datenbank und von Festplatte löschen...")
    12. ConMenu.Items.AddRange({item1, item2, item3, item4})
    13. AddHandler item1.Click, AddressOf ToolStripMenuItem_Click
    14. AddHandler item2.Click, AddressOf ToolStripMenuItem_Click
    15. AddHandler item3.Click, AddressOf ToolStripMenuItem_Click
    16. AddHandler item4.Click, AddressOf ToolStripMenuItem_Click
    17. Me.ContextMenuStrip = ConMenu
    18. End Sub
    19. Private Sub ToolStripMenuItem_Click(sender As Object, e As EventArgs)
    20. If sender Is item1 Then
    21. MessageBox.Show("item1")
    22. ElseIf sender Is item2 Then
    23. MessageBox.Show("item2")
    24. ElseIf sender Is item3 Then
    25. MessageBox.Show("item3")
    26. ElseIf sender Is item4 Then
    27. MessageBox.Show("item4")
    28. End If
    29. End Sub
    30. End Class
    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!
    kann man machen - aber warum nicht einfach den Designer nehmen? Dazu isser doch da.
    Solltest es zumindest mal probieren, bevor du dich an mehr oder weniger exotische Vorgehensweisen gewöhnst (die meist neben eiglich entbehrlichen Code auch noch iwelche Fußangeln mitbringen - hier zB: was, wenn der User mehrmals den Button klickst?).

    ErfinderDesRades schrieb:

    den Designer nehmen
    Weil er es halt so wollte.
    Klar, würde ich auch nur über den Designer machen.
    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!
    Hallo zusammen, unterdessen habe ich euren Ratschlag befolgt. Ich wollte mir verschiedenen ContextMenüsStrips ersparen. Aber das hat sich nicht gelohnt. Wie EDR schreibt, ist das je länger je mehr zu einer unsauberen Vorgehensweise geworden. Habe nun für jede ContextMenü einen eigenen MenüStrip programmiert - und es ist wirklich so: Im Designer geht es viel einfacher. Danke nochmals für eure Geduld und eure Unterstützung! Ich hätte mir Zeit sparen können, wenn ich gleich von Anfang auf euch gehört hätte...

    icewather schrieb:

    wenn ich gleich von Anfang auf euch gehört hätte...
    Damit hast Du es auf den Punkt gebracht. :thumbup:
    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!