gpt4 book ai didi

c# - 使用 ToString 捕获整个 ToolStripMenu 树

转载 作者:行者123 更新时间:2023-11-30 17:34:01 24 4
gpt4 key购买 nike

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

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

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

所以上面只会显示文件或保存或打开,而不是文件打开或文件保存。

我应该将 foreach 与我的 toolstripmenuitems 一起使用吗?

最佳答案

假设我有 MenuStripToolStripMenuItem名为 fileToolStripMenuItem (带文字 File )有子项目 NewOpen .此外,OpenFrom fileRecent .访问所有 FileToolStripMenuItems (它是 child ),你需要递归方法,它遍历所有级别(访问 child ,孙子......)

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)

希望这对您有所帮助。

关于c# - 使用 ToString 捕获整个 ToolStripMenu 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com