Я бы предложил использовать некоторые методы расширения для:
- Получить всех потомков (детей, детей детей, ...) для
MenuStrip
, ToolStrip
или ContextMenuStrip
илиStatusStrip
- Получить всех потомков элемента
- Получить элемент и всех его потомков
Методы расширения потомков
Следующие методы расширения будут работать для MenuStrip
, ToolStrip
, ContextMenuStrip
или StatusStrip
:
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
public static class ToolStripExtensions
{
public static IEnumerable<ToolStripItem> Descendants(this ToolStrip toolStrip)
{
return toolStrip.Items.Flatten();
}
public static IEnumerable<ToolStripItem> Descendants(this ToolStripDropDownItem item)
{
return item.DropDownItems.Flatten();
}
public static IEnumerable<ToolStripItem> DescendantsAndSelf (this ToolStripDropDownItem item)
{
return (new[] { item }).Concat(item.DropDownItems.Flatten());
}
private static IEnumerable<ToolStripItem> Flatten(this ToolStripItemCollection items)
{
foreach (ToolStripItem i in items)
{
yield return i;
if (i is ToolStripDropDownItem)
foreach (ToolStripItem s in ((ToolStripDropDownItem)i).DropDownItems.Flatten())
yield return s;
}
}
}
Пример
Отключить всех потомков определенного элемента:
fileToolStripMenuItem.Descendants().ToList()
.ForEach(x => {
x.Enabled = false;
});
Отключить всех потомков полосы меню:
menuStrip1.Descendants().ToList()
.ForEach(x => {
x.Enabled = false;
});