根据标题文本访问MenuItemCollection

时间:2011-06-08 14:13:05

标签: c# winforms contextmenu menuitem

我正在使用ContextMenu并通过执行以下操作向MenuItems MenuItemCollection添加了一些Menu

private const string ADD_MENU_ITEM = "Add";
private const string REMOVE_MENU_ITEM = "Remove";
...
mContextMenu.MenuItems.Add(ADD_MENU_ITEM, new EventHandler(...));
mContextMenu.MenuItems.Add(REMOVE_MENU_ITEM, new EventHandler(...));
...

现在稍后,我想根据标题文字访问Menu中的MenuItemCollection。所以像这样:

Menu m = mContextMenu.MenuItems[ADD_MENU_ITEM]; // This doesnt work

我知道我可以使用索引,但我觉得应该有一种方法可以根据标题名称获取Menu,因为这是它的添加方式。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我有类似的问题。 我们不能通过标题,我们必须枚举项目并比较文本。

            var enumerator = node.ContextMenu?.MenuItems?.GetEnumerator();
            while ((bool)enumerator?.MoveNext())
            {
                var item = (MenuItem)enumerator.Current;
                if (item.Text == command)
                {
                    var menuItemCollection = item.MenuItems;
                    menuItemCollection.Remove(item);
                    break;
                }
            }

答案 1 :(得分:0)

您无法使用现有API执行此操作 - 您必须具有创造性。我知道这是有道理的,因为这就是你如何调用构造函数,但这只是他们在制作新的MenuItem时节省时间的方式,而不是内部组织方式。

我可能会维护一个System.Collections.Generic.Dictionary,其键是标题字符串,值是对MenuItem对象的引用,然后创建一个包装函数,将菜单项添加到菜单和Dictionary中。当菜单项改变时删除那些词典条目是一个不同的练习。

答案 2 :(得分:0)

你可以尝试(我假设C#3或更高)

mContextMenu.MenuItems.Cast<MenuItem>().FirstOrDefault(i=>i.Text == text);

在相关的说明中,我不知道您的意图是什么,但您可能需要查看Tag中的MenuItem属性。是专门用于存储私人数据,以便您不必依赖字幕或词典来存储信息。