【问题标题】:Capturing whole ToolStripMenu tree with ToString使用 ToString 捕获整个 ToolStripMenu 树
【发布时间】:2022-03-30 02:42:11
【问题描述】:

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

我的代码只显示了每个应用区域的 1 个阶段

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

所以上面只会显示 File 或 Save 或 Open,而不是 File Open 或 File Save。

我应该在我的工具条菜单中使用 foreach 吗?

【问题讨论】:

  • 这段代码还能编译吗?
  • 是的,伙计,直接从编译器中删除。我只是使用 messagebox.show 来快速查看 tostring 转换
  • MenuTreeToolStripMenuItem是什么类型?
  • 抱歉,意思是删掉我重命名的版本,这只是一个toolStripMenuItem
  • 您是要搜索一个顶级菜单项(如文件)还是搜索所有顶级菜单项(获取文件、编辑、视图等的所有子项)?

标签: c# toolstripmenu


【解决方案1】:

假设我有MenuStripToolStripMenuItem,名为fileToolStripMenuItem(带有文本File),其中包含子项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&lt;ToolStripMenuItem&gt; sou,然后您可以遍历它(获取名称、更改某些属性等)。

像这样使用它:

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)

希望这会有所帮助。

【讨论】:

  • 该框明确表示不要使用以表示感谢,但我感谢您付出的努力,只是花时间消化它,但已经被标记了。赞赏
【解决方案2】:

最后我使用了围绕以下语法的逻辑,然后在最后构建字符串

ToolStripMenuItem ThisMenuItem = (ToolStripMenuItem)sender;
string WhatClicked = ThisMenuItem.ToString();
ToolStripMenuItem ThisMenuItemOwnerItem = (ToolStripMenuItem)(ThisMenuItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

那么你显然可以更深入地了解

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

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

【讨论】:

    猜你喜欢
    • 2023-01-25
    • 2012-03-10
    • 2020-06-18
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2012-03-10
    • 2011-03-26
    • 2017-06-11
    相关资源
    最近更新 更多