网格控件中有一个ContextMenuStrip。
我将其命名为GridContextMenu。
GridContextMenu使用以下代码填充4-5个项目:
gridcontextMenu.Items.Add(new ToolStripMenuItem
{
Name = Plants,
Text = Plants,
Tag = Plants,
Width = 100,
Image = <image source is put here>
});
gridcontextMenu.Items.Add(new ToolStripMenuItem
{
Name = Animals,
Text = Animals,
Tag = Animals,
Width = 100,
Image = <image source is put here>
});
对于工具条中的动物菜单,我按以下方式添加了子菜单
(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)
{
}
如何检查此事件中选择了哪个动物子菜单的条件? 请分享答案。
答案 0 :(得分:10)
您可以这样做:
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;
. ...
}
}
答案 1 :(得分:3)
如果您应该本地化您的应用程序,可以使用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;
...
}
}
答案 2 :(得分:0)
当我发现这里没有其他答案时,我进行了深入研究并找到了正确的解决方案。这可能仅适用于.NET Framework 4+,但这是我发现可以使用的功能。
从本质上讲,ItemClicked
控件中的ContextMenuStrip
事件在引发该事件时将自己作为发送方传递,并且将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;
...
}
希望这可以帮助将来寻找此答案的人:)
答案 3 :(得分:0)
如果已动态创建ContextMenuStrip,则这是一种检索ToolStripMenuItem索引的方法。获得枚举值确实很有帮助。我的上下文菜单是动态创建的,并用枚举名称填充。希望对您有所帮助。很抱歉,该格式对于发布仍然是新的。
`private void DynamiallyCreatedContextMenu_Click(object sender, EventArgs e)
{
ToolStripMenuItem item = sender as ToolStripMenuItem;
var parent = (item.Owner as ContextMenuStrip);
for (int i = 0; i < parent.Items.Count; i++)
{
if (item == parent.Items[i])
{
index = i;
break;
}
}
}`
答案 4 :(得分:-1)
private void SubmenuItem_Click(object sender, EventArgs e)
{
string clickedItemName=e.ClickedItem.Text;
}