浏览控件和组件

时间:2011-10-18 13:37:07

标签: c# winforms

我需要遍历我正在开发的UserControl中的所有控件和组件 我试过了:

public void Traverse(Control cnt)
{
    foreach (Control c in cnt.Controls)
    {
        if (c.HasChildren) Traverse(c);
        Debug.Print(c.Name); // For debugging purpose only
        // My code goes here
    }
}

当函数遇到 ToolStrip 时出现问题:它没有子项,但是项目(ToolStripItemCollection: IList, ICollection, IEnumerable)。

我不关心类型:使用Reflection我需要设置一些属性,所以我觉得对象结果很好。
如何获取UserControl中的每个组件的名称?
感谢

1 个答案:

答案 0 :(得分:1)

我编写了一个版本,该版本遍历控件的属性,并查找IComponentICollection的版本:

方式:

private void GetControls(ICollection controls, IList<string> names)
{
    foreach (var ctl in controls)
    {
        if (ctl is IComponent)
        {
            var name = ctl.GetType().GetProperty("Name");
            if (name != null)
                names.Add((string) name.GetValue(ctl, null));

            foreach (var property in ctl.GetType().GetProperties())
            {
                var prop = property.GetValue(ctl, null);
                if (prop is ICollection)
                    GetControls((ICollection)prop, names);
            }
        }
    }
}

<强>调用

var ctlNames = new List<string>();
GetControls(Controls, ctlNames);

我已经对此进行了测试,似乎找到了表单上的所有控件。我没有对每种控制进行测试,我也不能保证它的效率。