繁体   English   中英

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

[英]Check which submenu item was clicked in context menu strip

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

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

你可以这样做:

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

当我发现其他答案都没有在这里工作时,我去挖掘并找到了合适的解决方案。 这可能仅适用于.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;
    ...
}

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

如果您已动态创建 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;
            }
        }
    }`
private void SubmenuItem_Click(object sender, EventArgs e)
{        
    string clickedItemName=e.ClickedItem.Text;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM