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

时间:2012-11-30 07:31:15

标签: c# .net contextmenu

网格控件中有一个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 个答案:

答案 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;
}