"Owner/Parent" eines ContextMenuStrip ermitteln, das per DropDown in einem ToolStripMenuItem geladen wurde

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DanCooper.

    "Owner/Parent" eines ContextMenuStrip ermitteln, das per DropDown in einem ToolStripMenuItem geladen wurde

    Hallo miteinander

    sorry für den tollen Titel, aber mir fällt nichts besseres ein.

    Zum Problem bzw. meiner Idee:
    Ich hatte bis anhin ein mehrere ToolStripmenuItems, die wiederum jeweils mehrere (viele!) ToolStripMenuItems enthielten, die aber alle gleich waren (was für ne tolle Aussage). Zum Verständnis hier ein Ausschnitt:

    Brainfuck-Quellcode

    1. Movies (Tag = movie (String))
    2. ---------- Auto (Tag = auto (String))
    3. ---------------- Poster (Tag = poster (String))
    4. ---------------- Fanart (Tag = fanart (String))
    5. ---------------- Trailer (Tag = trailer (String))
    6. ---------- Ask (Tag = ask (String))
    7. ---------------- Poster (Tag = poster (String))
    8. ---------------- Fanart (Tag = fanart (String))
    9. ---------------- Trailer (Tag = trailer (String))


    ... und so weiter.
    Bei Click auf Poster, Fanart oder Trailer habe ich dann in einer gemeinsamen Sub ermittelt, was genau gewählt wurde:

    VB.NET-Quellcode

    1. Dim Menu As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
    2. ModifierType = Menu.Tag.ToString
    3. ScrapeType = Menu.OwnerItem.Tag.ToString
    4. ContentType = Menu.OwnerItem.OwnerItem.OwnerItem.Tag.ToString



    Nun habe ich gesehen, das ich eigentlich auch einen einzigen ContextMenuStrip erstellen könnte, in dem nur die Poster, Fanart und Trailer Items enthalten sind. Diesen ContextMenuStrip kann ich ja in den ToolStripMenuItems als DropDown an mehreren Stellen laden:

    VB.NET-Quellcode

    1. Me.MenuAuto.DropDown = Me.ContextMenuStrip_Liste
    2. Me.MenuAuto.Name = "MenuAll"
    3. Me.MenuAuto.Size = New System.Drawing.Size(152, 22)
    4. Me.MenuAuto.Tag = "all"
    5. Me.MenuAuto.Text = "All"
    6. Me.MenuAsk.DropDown = Me.ContextMenuStrip_Liste
    7. Me.MenuAsk.Name = "MenuAsk"
    8. Me.MenuAsk.Size = New System.Drawing.Size(152, 22)
    9. Me.MenuAsk.Tag = "all"
    10. Me.MenuAsk.Text = "All"


    Klappt soweit ohne Probleme und ich erspare mir viele Items und Handles...
    Was ich jetzt nicht kapiere ist wie ich ermitteln kann, aus welchen ToolStripMenuItem der ContextMenuStrip bzw. das ToolStripMenuItem darin gerade aufgerufen worden ist. Mit OwnerItem komme ich nur bis ContextMenuStrip_Liste, danach weiss ich nicht, wie ich tiefer gehen kann. Ich finde sozusagen den Owner mit dem DropDown nicht...

    Hat da jemand die Lösung... oder vielleicht eine bessere Idee, wie man das lösen kann (wobei mir ne Lösung besser passen würde, ist doch recht viel und verschachtelt ;) )
    das sieht mir sehr originell aus, ein ContextMenu als SubMenü eines MenüstripItems zu verwenden statt als Contextmenü. Noch dazu dasselbe ContextMenu einbauen in mehreren MenuItems gleichzeitig 8|

    Kannst du davon mal eine Sample-Solution zippen und anhängen? Ansonsten bin ich völlig unsicher, richtig zu verstehen, was du da treibst.
    Hehe, kann ich mir vorstellen. Ich hab das auch erste heute so entdeckt, keine Ahnung ob das auch so gedacht ist. Wobei ich auch nichts anderes gefunden habe, dass sich in dieser DropItem Einstellungen setzten lässt.

    Nun denn, hier ein Testprojekt, in dem beide Varianten drin sind.
    Das tolle an der neuen Lösung wäre halt einfach, dass ich nur noch 3 Items hätte, anstelle von 3x N (und N dürfte zur Zeit in etwas 36 sein dürfte, also total 108 Items, wobei es auch nicht nur die 3 Poster, Fanart und Trailer sind, sondern in Wirklichkeit etwa 15 x 36).
    Dateien
    Edit: Verbessert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _ContextOwner As ToolStripItem
    3. Private Sub ListItemFanart_Click(sender As Object, e As EventArgs) Handles _
    4. ListItemFanart.Click, _
    5. ListItemPoster.Click, _
    6. ListItemTrailer.Click
    7. MessageBox.Show(String.Join(".", _ContextOwner.OwnerItem.Text, _ContextOwner.Text, DirectCast(sender, ToolStripItem).Text))
    8. End Sub
    9. Private Sub ContextMenuStrip1_Opened(sender As Object, e As EventArgs) Handles ContextMenuStrip1.Opened
    10. _ContextOwner = ContextMenuStrip1.OwnerItem
    11. End Sub
    12. End Class
    (Ansonsten würde ich dir auch Visual Studio - Empfohlene Einstellungen sehr empfehlen!)

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