检查在上下文菜单条中单击了哪个子菜单项

网格控件中有ContextMenuStrip。

我把它命名为GridContextMenu。

GridContextMenu使用以下代码填充4-5个项目:

gridcontextMenu.Items.Add(new ToolStripMenuItem { Name = Plants, Text = Plants, Tag = Plants, Width = 100, Image =  }); gridcontextMenu.Items.Add(new ToolStripMenuItem { Name = Animals, Text = Animals, Tag = Animals, Width = 100, Image =  }); 

对于工具条中的动物菜单,我按以下方式添加子菜单

 (gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Tiger", image_source, new EventHandler(SubmenuItem_Click)); (gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Lion", image_source, new EventHandler(SubmenuItem_Click)); (gridcontextMenu.Items[1] as ToolStripMenuItem).DropDownItems.Add("Elephant", image_source, new EventHandler(SubmenuItem_Click)); 

在SubmenuItem_Click事件处理程序中,我需要知道单击了哪个动物子菜单。

怎么做到这一点?

目前我有以下方式的事件处理程序代码:

 private void SubmenuItem_Click(object sender, EventArgs e) { } 

如何在这个事件中检查哪个动物子菜单被选中了? 请分享答案。

你可以这样做:

 private void SubmenuItem_Click(object sender, EventArgs e) { var clickedMenuItem = sender as MenuItem; var menuText = clickedMenuItem.Text; switch(menuText) { case "Tiger": break; case "Lion": break; . ... } } 

如果您应该将应用程序本地化,则可以使用Tag来实现此目的。 此外, Tag是一个对象,因此您可以在其中放置任何数据。 例如Enum类型。

 private void SubmenuItem_Click(object sender, EventArgs e) { var clickedMenuItem = sender as MenuItem; EnumType item = (EnumType)clickedMenuItem.Tag; switch(item) { case TigeItem: break; case LionItem: break; ... } } 
 private void SubmenuItem_Click(object sender, EventArgs e) { string clickedItemName=e.ClickedItem.Text; } 

当我发现其他答案都没有在这里工作时,我去挖掘并找到了合适的解决方案。 这可能仅适用于.NET Framework 4+,但这是我发现的工作方式。

实质上, ContextMenuStrip控件中的ItemClicked事件在引发事件时将自身作为发送者和ToolStripItemClickedEventArgs对象传递。 由于无法从ContextMenuStrip本身获取单击的项目,获取此信息的唯一方法是询问ToolStripItemClickedEventArgs对象,并且单击的项目作为ToolStripItem对象驻留在那里。 然后,可以根据需要使用它来提取要在if / switch语句中使用的选项的名称。 见下文:

要配置EventHandler:

 ... contextMenuStrip1.ItemClicked += OnContextMenuItem_Clicked; ... 

要处理事件并检索所单击项目的文本:

 private void OnContextMenuItem_Clicked(object sender, ToolStripMenuItemClickedEventArgs e) { ToolStripItem clickedItem = e.ClickedItem; string itemName = clickedItem.Text; ... } 

希望这有助于将来寻找这个答案:)