4

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

在这种情况下如何检查选择了哪个动物子菜单的情况?请分享答案。

4

5 回答 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;
         . ...
    }
}
于 2012-11-30T07:44:53.257 回答
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;
         ...
    }
}
于 2012-11-30T08:18:48.823 回答
2

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

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

要配置事件处理程序:

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

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

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

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

于 2018-06-26T13:59:20.723 回答
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;
            }
        }
    }`
于 2019-09-25T20:32:31.713 回答
-1
private void SubmenuItem_Click(object sender, EventArgs e)
{        
    string clickedItemName=e.ClickedItem.Text;
}
于 2017-05-23T07:47:42.133 回答