Delphi到C#WinForms:在表单上迭代表单组件

时间:2016-07-11 14:56:54

标签: c# winforms delphi

在Delphi中,您可以像这样迭代表单组件(不是控件):

        foreach (var component in this.components.Components)
        {
            MessageBox.Show(component.ToString());
        }

然而在c#Winforms中我尝试了以下内容:

{{1}}

我无法在谷歌上找到有关如何迭代组件的任何示例。我发现的只是如何迭代控件。

我想列出表单上的所有控件和组件。 例如,如果有2个按钮和2个图像列表,我想列出所有4个项目。

1 个答案:

答案 0 :(得分:3)

这在c#中并不容易 使用继承表格时也要非常小心 与Delphi不同,在组件集合方面,不可见的设计师不支持oop,甚至为后代创建了为每个表单创建的新集合!

我是这样做的:(它只列出组件而非控件!)

IEnumerable<Component> EnumerateComponents()
{
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
               where typeof(Component).IsAssignableFrom(field.FieldType)
               let component = (Component)field.GetValue(this)
               where component != null
               select component;
    }
你可以这样称呼它:

foreach (Component component in EnumerateComponents())
{
    if (component is ImageList)
    {
    }
}