是否有任何通用的递归方法可以在Windows窗体中迭代所有控件(包括工具条及其项,bindingnavigator及其项,...)? (其中一些不是从Control类继承的)或至少迭代工具条及其项目,bindingnavigator及其项目?
答案 0 :(得分:0)
由于ToolStrip
使用Items
代替Controls
,而ToolStripItem
不会从Control
继承,因此您会遇到麻烦。 ToolStripItem
和Control
都继承自Component
,因此最多可以获得IEnumerable<Component>
。
您可以使用以下扩展方法完成此操作:
public static class ComponentExtensions
{
public static IEnumerable<Component> GetAllComponents(this Component component)
{
IEnumerable<Component> components;
if (component is ToolStrip) components = ((ToolStrip)component).Items.Cast<Component>();
else if (component is Control) components = ((Control)component).Controls.Cast<Component>();
else components = Enumerable.Empty<Component>(); // figure out what you want to do here
return components.Concat(components.SelectMany(x => x.GetAllComponents()));
}
}
在Windows窗体上,您可以在foreach
循环中处理所有这些组件:
foreach (Component component in this.GetAllComponents())
{
// Do something with component...
}
不幸的是,你会做很多手动类型检查和转换。