用于在窗体中迭代所有控件及其相关控件的一般递归方法

时间:2013-01-23 16:04:13

标签: c# winforms controls toolstrip

是否有任何通用的递归方法可以在Windows窗体中迭代所有控件(包括工具条及其项,bindingnavigator及其项,...)? (其中一些不是从Control类继承的)或至少迭代工具条及其项目,bindingnavigator及其项目?

1 个答案:

答案 0 :(得分:0)

由于ToolStrip使用Items代替Controls,而ToolStripItem不会从Control继承,因此您会遇到麻烦。 ToolStripItemControl都继承自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...
}

不幸的是,你会做很多手动类型检查和转换。