首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ToolStripMenu捕获整个ToString树

用ToolStripMenu捕获整个ToString树
EN

Stack Overflow用户
提问于 2017-03-27 19:25:34
回答 2查看 121关注 0票数 3

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

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

代码语言:javascript
复制
  MessageBox.Show((ToolStripMenuItem).ToString());

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

我应该在我的工具项目中使用一个程序吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 10:29:14

最后,我在下面的语法中使用了一个逻辑,然后在最后构建字符串

代码语言:javascript
复制
ToolStripMenuItem ThisMenuItem = (ToolStripMenuItem)sender;
string WhatClicked = ThisMenuItem.ToString();
ToolStripMenuItem ThisMenuItemOwnerItem = (ToolStripMenuItem)(ThisMenuItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

那么你显然可以用更深的

代码语言:javascript
复制
ToolStripMenuItem ThisOwnersOwnerItem = (ToolStripMenuItem)(ThisMenuItemOwnerItem.GetCurrentParent() as ToolStripDropDown).OwnerItem;

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-27 20:36:20

假设我有MenuStripToolStripMenuItem,名为fileToolStripMenuItem (带有文本File),其中有子项NewOpen。此外,Open还有From fileRecent。要访问所有FileToolStripMenuItems (它是子),您需要递归方法,该方法贯穿所有级别(访问子代、孙辈.)

代码语言:javascript
复制
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>,然后您可以迭代它(获取名称、更改某些属性等)。

像这样使用它:

代码语言:javascript
复制
var list = GetChildToolStripItems(fileToolStripMenuItem);

在我的示例中,这将返回子项的集合,如:New, Open, From File, Recent

您可以轻松地浏览集合并获取项的文本(在MessageBox中显示,如下所示:

代码语言:javascript
复制
MessageBox.Show(string.Join(", ", list.Select(x=>x.Text).ToArray()))

或者,如果你愿意,像这样:

代码语言:javascript
复制
foreach (ToolStripMenuItem menuItem in list)
{
    MessageBox.Show(string.Format("item named: {0}, with text: {1}", menuItem.Name, menuItem.Text));
}

编辑:在我看到关于OP的想法是从MenuStrip获取所有项目的评论之后,下面是一个例子。

我编写了其他方法,以MenuStrip为参数,遍历所有ToolStripMenuItems,并对每个项调用GetChildToolStripItems方法。返回所有顶级项目以及所有儿童和大孩子的列表.

代码语言:javascript
复制
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;
}

用法:

代码语言:javascript
复制
 var allItems = GetAllMenuStripItems(menuStrip1)

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43054814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档