Controls mit Contextmenü

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

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

    Controls mit Contextmenü

    Hey liebe Community. Ich habe mal wieder ein Problem, vllt auch nur einen Denkfehler :) und hoffe ihr könnt mir helfen :)

    Also ich will mit einer Schleife Controls erstellen und jedem erstellten Control ein Contextmenü zuweisen dass beim click-event geöffnet wird. Hier teile des Codes den ich verwenden wollte, vllt wird hier mein Problem klar:

    VB.NET-Quellcode

    1. Sub Erstellepanels(Liste As List(Of String))
    2. For x = 0 To Liste.Count - 1
    3. DesignPanel(85, x)
    4. Next
    5. End Sub
    6. Function DesignPanel(Addwert As Integer, Anzahl As Integer) As Panel
    7. Try
    8. Dim Link As New Windows.Forms.Panel()
    9. Link.Location = New System.Drawing.Point(xPanel, yPanel + Addwert)
    10. Link.Name = "P" & Anzahl
    11. Link.Size = New System.Drawing.Size(1366, 61)
    12. Link.TabIndex = 0
    13. Link.Cursor = Cursors.Hand
    14. Link.BackColor = Color.White
    15. Controls.Add(Link)
    16. Link.Parent = Panel1
    17. AddHandler Link.MouseEnter, Sub() Setselected(Link)
    18. AddHandler Link.MouseLeave, Sub() Setnoselected(Link)
    19. AddHandler Link.Click, Sub() ContextMenuStrip1.Show(Link, Link.Location) 'Hier will ich das Contextmenu beim CLicken auf das panel öffnen
    20. 'Hier jetzt mein Problem, Denkfehler: Ich möchte hier beim Klicken auf den Contextmenübutton informationen über das senderpanel bekommen. Da das ja immer das gleiche Menü ist war für mich logisch hier einen Handler mit den Senderinformationen zu defenieren
    21. AddHandler TextInDieZwischenablageKopierenToolStripMenuItem.Click, Sub() Contextmenuitemclick(Link) 'TextInDieZwischenablageKopierenToolStripMenuItem.Click ist mein Contextmenübutton
    22. Return Link
    23. Catch ex As Exception
    24. Return Nothing
    25. End Try
    26. End Function
    27. Sub Contextmenuitemclick(sender As Panel)
    28. MsgBox(sender.Name.ToString)
    29. End Sub


    Das Problem, ich denke man merkt es, der Contextmenübutton hat am ende so viele Handler wie x (von der Schleife), sprich bei einem click werden alle Informationen von allen Panels gezeigt. Ich hoffe man verstehts einigermaßen :)

    Meine Frage: Wo ist mein Fehler, bzw wie kann man es realisieren dass immer das gleiche Contextmenü die Informationen des Panels hat das ich angeklickt habe, oder ist das gar nicht möglich?

    Danke für eure Hilfe :) MFG

    PS: Der gepostete Code besteht nur aus Ausschnitten die das Problem zeigen soll, nur falls jemand sich fragt warum ich da eine Function drinnen habe obwohl das da keinen Sinn gibt :)

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

    SidezockingLP schrieb:

    dass beim click-event geöffnet wird.
    ContextMenüs werden gewühnlich per Rechtsklick geöffnet.
    Weise der Property ContextMenu Deines Controls die betreffende ContextMenu-Instanz zu und feddich, den Rest übernimmt das Framework.
    Wenn Du das ContextMenu dynamisch befüllen willst, nimm das Open-Event des ContextMenus.
    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!
    Hey, Danke für deine schnelle Antwort :)

    ​ContextMenüs werden gewühnlich per Rechtsklick geöffnet.


    Mhh ich weiß, geht es auch ungewöhnlich also mit linksklick oder gibt es zum Contextmenüstrip ein vergleichbares Control was dafür gedacht ist?

    Ich habe jetzt dem Control die Property hinzugefügt, und wie kann ich jetzt mit einem click auf einen Contextmenübutton informationen über das Senderpanel bekommen? Denn so bekomme ich logischerweise als Sender den Contextemenübutton:

    VB.NET-Quellcode

    1. Private Sub TextInDieZwischenablageKopierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TextInDieZwischenablageKopierenToolStripMenuItem.Click
    2. Dim Labels As Label = CType(sender, Label)
    3. MsgBox(Labels.Name.ToString)
    4. End Sub


    MFG :)
    @SidezockingLP Nix Sender. Property ContextMenuStrip zuweisen und feddich.
    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!
    Hey, @RodFromGermany

    Jo, ich weiße dem Control die Property ContextMenuStrip zu. --> Das ContextMenü öffnet sich dann mit Linksklick, soweit so gut :). nur würde ich gerne Informationen wie z.b den Namen des Controls haben auf das ich Linksklick gemacht habe wenn ich einen Contextmenübutton drücke, am besten rechts und Linksklick. Gibt es dafür eine Möglichkeit? :)

    MFG
    Die Frage ist doch erstmal, warum willst du machen?
    Anhand der CopyToClipboard Geschichte, denke ich du hast eine Anzahl an Panels, die irgendwelche Daten representieren und je nachdem welches Panel das ContextMenu öffnet, soll auf die Daten zugegriffen werden. Das einfachste wäre hier, das MouseDown Event der Panels zu nehmen, das angeklickte dann als SelectedPanel festlegen und dann damit zu arbeiten. So wie eine Combo oder ListBox das ja auch macht.

    Grüße
    Vainamo

    SidezockingLP schrieb:

    am besten rechts und Linksklick
    Ganz konkret:
    Was willst Du eigentlich?
    Schreib eine präzise Aufgabenstellung / Problembeschreibung, dann sehen wir weiter:
    • Ich hane n Controls
    • ich habe ein ContextMenuStrip
    • Ich will je nach Control m (m < n) verschiedene Varianten vom ContextMenuStrip erscheinen lassen, je nach
      a)
      b)
      c)
    • ...
    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!
    Hey, @Vainamo
    Die Frage ist doch erstmal, warum willst du machen?

    Das ganze soll am ende eine Liste werden in der jedes Item ein Panel bekommt. Über das Contextmenüstrip will ich dann die Informationen abrufen können

    @RodFromGermany
    - Ich habe n Panels
    - Beim Click-Event jedes Panels soll ein Contextmenüstrip geöffnet werden
    - Beim Click-Event eines ContextMenüitems soll der Name des Panels ausgegeben werden

    Mir ist jetzt auch selbst noch eine Idee gekommen:

    VB.NET-Quellcode

    1. Sub Contextmenuersteller(sender As Panel)
    2. Dim cm As New ContextMenuStrip
    3. AddHandler sender.Click, Sub() cm.Show(sender, sender.Location)
    4. sender.ContextMenuStrip = cm
    5. Dim Mi As New ToolStripMenuItem("Text in Zwischenablage kopieren")
    6. cm.Items.Add(Mi)
    7. AddHandler Mi.Click, Sub() MsgBox(sender.Name)
    8. End Sub


    Wie findet ihr die Lösung, oder gibt es "elegantere" ?

    Danke für eure Antworten :)
    MFG

    SidezockingLP schrieb:

    Das ganze soll am ende eine Liste werden in der jedes Item ein Panel bekommt.
    ja, und das ist üblicherweise Grütze.
    Stell deine items in datengebundenen Listboxen und Datagridviews dar - nicht in beliebigen Mengen generierter Steuerelemente.
    Es kann Ausnahmen geben von dieser Vorgehensweise, aber glaub uns: Die sind selten.
    Und beantworte uns, warum grad in deinem Fall so eine Ausnahme vorliegen sollte.
    Sonst helfen wir dir am Ende zu etwas, was dich letztendlich viel teurer zu stehen kommt, als hätten wir dir ühaupt nicht geholfen.
    @SidezockingLP OK.
    Wann fängst Du an, die Suchfunktionen zu frequentieren und uns mit der Lösung zu überraschen?

    VB.NET-Quellcode

    1. Private Sub ContextMenuStrip1_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
    2. Label1.Text = ContextMenuStrip1.SourceControl.Name
    3. 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!