Mam ContextMenuStrip
przypisany do kilku różnych list. Próbuję dowiedzieć się, kiedy ContextMenuStrip
kliknięto, na czym ListBox
był używany. Na początek wypróbowałem poniższy kod, ale nie działa. sender
Ma prawidłową wartość, ale gdy próbuję go przypisać do menuSubmitted
to jest null.
private void MenuViewDetails_Click(object sender, EventArgs e)
{
ContextMenu menuSubmitted = sender as ContextMenu;
if (menuSubmitted != null)
{
Control sourceControl = menuSubmitted.SourceControl;
}
}
Każda pomoc byłaby świetna. Dzięki.
Korzystając z poniższej pomocy, rozgryzłem to:
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
źródło
źródło
if
instrukcji i używać,if (menuItem == null) return;
jeśli jesteś podobny do mnie i nie chcesz, aby twój kod, który go obsługuje, był zagnieżdżony na dodatkowych niepotrzebnych 2 poziomach.Odpowiedzi:
Dla
ContextMenu
:Problem polega na tym, że
sender
parametr wskazuje element w menu kontekstowym, które zostało kliknięte, a nie samo menu kontekstowe.Jest to jednak prosta poprawka, ponieważ każda z nich
MenuItem
ujawniaGetContextMenu
metodę , która powie ci, któraContextMenu
zawiera dany element menu.Zmień kod na następujący:
private void MenuViewDetails_Click(object sender, EventArgs e) { // Try to cast the sender to a MenuItem MenuItem menuItem = sender as MenuItem; if (menuItem != null) { // Retrieve the ContextMenu that contains this MenuItem ContextMenu menu = menuItem.GetContextMenu(); // Get the control that is displaying this context menu Control sourceControl = menu.SourceControl; } }
Dla
ContextMenuStrip
:Jeśli użyjesz a
ContextMenuStrip
zamiast aContextMenu
. Te dwie kontrolki nie są ze sobą powiązane, a instancji jednej nie można rzutować na instancję drugiej.Tak jak poprzednio, kliknięty element jest nadal zwracany w
sender
parametrze, więc będziesz musiał określić, do kogo należyContextMenuStrip
ten pojedynczy element menu. Robisz to zOwner
nieruchomością . Na koniec użyjeszSourceControl
właściwości do określenia, która kontrolka wyświetla menu kontekstowe.Zmodyfikuj swój kod w następujący sposób:
private void MenuViewDetails_Click(object sender, EventArgs e) { // Try to cast the sender to a ToolStripItem ToolStripItem menuItem = sender as ToolStripItem; if (menuItem != null) { // Retrieve the ContextMenuStrip that owns this ToolStripItem ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip; if (owner != null) { // Get the control that is displaying this context menu Control sourceControl = owner.SourceControl; } } }
źródło
ContextMenu
iContextMenuStrip
. (Ach, i widzę, że już to rozgryzłeś. Cóż, tym lepiej jest uczyć się na własną rękę!)SourceControl
niestety jest zerowe w chwili, gdy uruchamiane jestClick
zdarzenie elementuToolStripItem
podrzędnegoContextMenuStrip
. Wydaje się, żeContextMenuStrip
„sClosed
Zdarzenie przed tymClick
wydarzeniem, które jest chyba to, co powoduje ten problem; Zakładam, że nieruchomość jest czyszczona po zamknięciu menu.OwnerItem
właściwości, aż znajdziesz obiekt,ToolStripItem
który maContextMenuStrip
w swojejOwner
właściwości. Ale jak właśnie powiedziałem, to nie działa; wSourceControl
menu kontekstowym będzie mieć wartość null. Powiedziałeś, że nie możesz tego odtworzyć ... może problem występuje tylko w przypadku menu głębszych niż jeden poziom? Mój był głęboki na dwa poziomy.Starszy post, ale na wypadek, gdyby ktoś taki jak ja go spotkał:
W przypadku ContextMenuStrip powyższe nie działało dla mnie, ale doprowadziło do znalezienia tego, co zrobiło.
void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { ContextMenuStrip menu = sender as ContextMenuStrip; Control sourceControl = menu.SourceControl; MessageBox.Show(sourceControl.Name); }
To dało mi oczekiwaną nazwę kontrolki. Możesz wprowadzić walidację itp. Za pomocą instrukcji if, po prostu piszę, aby przejść do sedna.
źródło
ContextMenu
. Problem polega na tym,ItemClicked
że nie uruchamia się po kliknięciu elementów podmenu ; potrzebują własnegoClick
wydarzenia, które miałoby samą pozycję jako nadawcę, a nie menu.Miałem duże trudności z uruchomieniem któregokolwiek z tych kodów. Oto najprostsze rozwiązanie, jakie udało mi się znaleźć:
W przypadku ContextMenuStrip:
Control _sourceControl = null; private void contextMenuStrip_Opened(object sender, EventArgs e) { _sourceControl = contextMenuStrip.SourceControl; } private void contextMenuItem_Click(object sender, EventArgs e) { var menuItem = (ToolStripMenuItem)sender; _sourceControl.Text = menuItem.Text; MessageBox.Show(menuItem.Name); MessageBox.Show(sourceControl.Name); }
źródło
Najłatwiejszym rozwiązaniem byłoby:
Control parentControl = ((sender as MenuItem).GetContextMenu()).SourceControl;
źródło