捕获整个ToolStripMenu树并使用ToString方法输出

3

如果我在菜单树的不同区域运行代码,我只得到一个元素,你如何首先将此逻辑应用于菜单树的所有子组件,其次,说明整个菜单树。

我拥有的代码仅显示每个区域应用的一个阶段。

  MessageBox.Show((ToolStripMenuItem).ToString());

因此,上面的内容只会显示“文件”、“保存”或“打开”,而不是“文件打开”或“文件保存”。

我是否应该在我的toolstripmenuitems中使用foreach?


是的伙计,直接从编译器中剪切。我只是使用了 messagebox.show 来快速查看 tostring 转换。 - CO2 Software
MenuTreeToolStripMenuItem 是什么类型? - Uwe Keim
抱歉,我本意是要剪切我的重命名版本,这只是一个toolStripMenuItem。 - CO2 Software
你想要搜索一个顶级菜单项(例如文件)还是所有顶级菜单项(获取文件、编辑、视图等的所有子菜单项)? - Nino
哎呀,现在我看到了你的评论。让我编辑我的答案。 - Nino
显示剩余2条评论
2个回答

1

假设我有一个名为fileToolStripMenuItem(文本为File)的ToolStripMenuItem,它有子项NewOpen。此外,Open还有From fileRecent。要访问所有FileToolStripMenuItems(它的子级),您需要递归方法,遍历所有级别(以访问子级,孙级...)。

private IEnumerable<ToolStripMenuItem> GetChildToolStripItems(ToolStripMenuItem parent)
{
    if (parent.HasDropDownItems)
    {
        foreach (ToolStripMenuItem child in parent.DropDownItems)
        {
            
            yield return child;

            foreach (var nextLevel in GetChildToolStripItems(child))
            {
                yield return nextLevel;
            }
        }
    }
}

这个方法获取第一级菜单项并返回 IEnumerable<ToolStripMenuItem>,你可以通过迭代来获取名称、更改某些属性等。使用方法如下:
var list = GetChildToolStripItems(fileToolStripMenuItem);

在我的例子中,这将会返回一个子项集合,如下所示:New, Open, From File, Recent
您可以轻松地遍历集合并获取项目的文本(以显示在MessageBox中),如下所示:
MessageBox.Show(string.Join(", ", list.Select(x=>x.Text).ToArray()))

或者,如果您喜欢,可以像这样:

foreach (ToolStripMenuItem menuItem in list)
{
    MessageBox.Show(string.Format("item named: {0}, with text: {1}", menuItem.Name, menuItem.Text));
}

编辑: 在看到评论后,我发现OP的想法是获取MenuStrip中的所有项,这里提供一个示例。

我编写了一个额外的方法,以MenuStrip为参数,遍历所有ToolStripMenuItems,并为每个项调用GetChildToolStripItems方法。返回所有顶级项、子项和孙子项的列表...

private List<ToolStripMenuItem> GetAllMenuStripItems(MenuStrip menu)
{
    List<ToolStripMenuItem> collection = new List<ToolStripMenuItem>();
    foreach (ToolStripMenuItem item in menu.Items)
    {
        collection.Add(item);
        collection.AddRange(GetChildToolStripItems(item));
    }
    return collection;
}

使用方法:

 var allItems = GetAllMenuStripItems(menuStrip1)

希望这有所帮助。

盒子上明确写着不要用于感谢,但我很感激你所付出的努力,只是需要时间来消化它,但已经点赞了。非常感谢。 - CO2 Software

0
最终我使用了以下语法的逻辑,然后在结尾构建字符串。
ToolStripMenuItem ThisMenuItem = (ToolStripMenuItem)sender;
string WhatClicked = ThisMenuItem.ToString();
ToolStripMenuItem ThisMenuItemOwnerItem = (ToolStripMenuItem)(ThisMenuItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

然后你可以显然地更深入地了解

ToolStripMenuItem ThisOwnersOwnerItem = (ToolStripMenuItem)(ThisMenuItemOwnerItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

等等,添加检查以避免空异常。


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