假设我有MenuStrip 和ToolStripMenuItem,名为fileToolStripMenuItem(带有文本File),其中包含子项New 和Open。此外,Open 具有From file 和Recent。要访问所有File 的ToolStripMenuItems(它是孩子),您需要递归方法,它会遍历所有级别(访问孩子、孙子......)
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> 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)
希望这会有所帮助。