Ich habe eine ContextMenuStrip
, die mehreren verschiedenen Listenfeldern zugeordnet ist. Ich versuche herauszufinden, wann auf das ContextMenuStrip
geklickt wird, worauf ListBox
es verwendet wurde. Ich habe den folgenden Code zunächst einmal ausprobiert, aber er funktioniert nicht. Das sender
hat den richtigen Wert, aber wenn ich versuche, es dem zuzuweisen, menuSubmitted
ist es null.
private void MenuViewDetails_Click(object sender, EventArgs e)
{
ContextMenu menuSubmitted = sender as ContextMenu;
if (menuSubmitted != null)
{
Control sourceControl = menuSubmitted.SourceControl;
}
}
Jede Hilfe wäre großartig. Vielen Dank.
Mit der folgenden Hilfe habe ich es herausgefunden:
private void MenuViewDetails_Click(object sender, EventArgs e)
{
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null)
{
ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;
if (calendarMenu != null)
{
Control controlSelected = calendarMenu.SourceControl;
}
}
}
c#
.net
winforms
contextmenustrip
Taryn
quelle
quelle
if
Anweisungenif (menuItem == null) return;
zu verschachteln und zu verwenden, wenn Sie wie ich sind und nicht möchten, dass Ihr Code, der damit umgeht, um zusätzliche unnötige 2 Ebenen verschachtelt wird.Antworten:
Für eine
ContextMenu
:Das Problem ist, dass der
sender
Parameter auf das Element im Kontextmenü zeigt, auf das geklickt wurde, und nicht auf das Kontextmenü selbst.Es ist jedoch eine einfache Lösung, da jede
MenuItem
eineGetContextMenu
Methode verfügbar macht , die Ihnen sagt, welcheContextMenu
diesen Menüpunkt enthält.Ändern Sie Ihren Code wie folgt:
Für eine
ContextMenuStrip
:Es ändert sich geringfügig, wenn Sie a
ContextMenuStrip
anstelle von a verwendenContextMenu
. Die beiden Steuerelemente sind nicht miteinander verknüpft, und eine Instanz des einen kann nicht in eine Instanz des anderen umgewandelt werden.Nach wie vor wird das angeklickte Element weiterhin im
sender
Parameter zurückgegeben, sodass Sie bestimmen müssenContextMenuStrip
, wem dieses einzelne Menüelement gehört. Das machen Sie mit derOwner
Immobilie . Schließlich bestimmen Sie anhand derSourceControl
Eigenschaft, auf welchem Steuerelement das Kontextmenü angezeigt wird.Ändern Sie Ihren Code wie folgt:
quelle
ContextMenu
undContextMenuStrip
. (Ah, und ich sehe, Sie haben es bereits herausgefunden. Umso besser, Dinge selbst zu lernen!)SourceControl
ist leider null, wenn einClick
Ereignis eines UnterelementsToolStripItem
vonContextMenuStrip
ausgelöst wird. Es scheint , dass dieContextMenuStrip
s‘Closed
Ereignis ausgelöst wird vor diesemClick
Ereignis, das wahrscheinlich ist , was das Problem verursacht; Ich gehe davon aus, dass die Eigenschaft gelöscht wird, nachdem das Menü geschlossen wird.OwnerItem
Eigenschaftskette durchlaufen, bis Sie eine findenToolStripItem
,ContextMenuStrip
derenOwner
Eigenschaft a enthält. Aber wie ich gerade kommentiert habe, funktioniert es nicht; DasSourceControl
im Kontextmenü ist null. Sie sagten, Sie können es jedoch nicht reproduzieren ... Vielleicht tritt das Problem nur bei Menüs auf, die tiefer als eine Ebene liegen? Meins war zwei Unterebenen tief.Älterer Beitrag, aber falls jemand wie ich darauf stößt:
Bei einem ContextMenuStrip hat das oben Genannte bei mir nicht funktioniert, aber es hat dazu geführt, dass ich herausgefunden habe, was funktioniert hat.
Dies gab mir den Namen der erwarteten Kontrolle. Sie können eine Validierung usw. mit if-Anweisungen vornehmen. Ich poste nur, um auf den Punkt zu kommen.
quelle
ContextMenu
. Das Problem ist, dassItemClicked
beim Klicken auf Untermenüelemente nicht ausgelöst wird . Sie benötigen ein eigenesClick
Ereignis, bei dem der Artikel selbst als Absender und nicht das Menü angezeigt wird.Ich hatte große Schwierigkeiten, diesen Code zum Laufen zu bringen. Dies ist die einfachste Lösung, die ich finden konnte:
Für einen ContextMenuStrip:
quelle
Die einfachste Lösung wäre:
quelle