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

6

在网格控件中有一个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)
{
}

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

12

您可以这样做:

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;
         . ...
    }
}

这个答案很有帮助,谢谢Tigran。 - Vikas Kunte

4

我发现其他答案都不适用于这里,于是我进行了挖掘并找到了正确的解决方案。这可能只适用于.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;
    ...
}

希望这篇内容能帮助到将来需要这个答案的人:)

2
获取ContextMenuStrip项的方法简单多了,谢谢! - Marcelo Scofano Diniz

3
您可以使用标签来本地化应用程序。此外,标签是一个对象,您可以在其中放置任何类型的数据,例如枚举类型。
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;
         ...
    }
}

1

如果您动态创建了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;
            }
        }
    }`

这个代码片段中,你可以用 var index = parent.Items.IndexOf(item); 来代替 for 循环。 - BdR

-1
private void SubmenuItem_Click(object sender, EventArgs e)
{        
    string clickedItemName=e.ClickedItem.Text;
}

欢迎来到Stack Overflow!虽然这段代码可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - kayess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接