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

Delphi到C#WinForms:在表单上迭代表单组件,c#,winforms,delphi,C#,Winforms,Delphi,在Delphi中,您可以遍历窗体组件(而不是控件),如下所示: 然而,在c#Winforms中,我尝试了以下方法: foreach (var component in this.components.Components) { MessageBox.Show(component.ToString()); } 我在谷歌上找不到任何关于如何迭代组件的例子。我所发现的只是如何遍历控件 我想在表单上列出所有控件和组件。 例如,如果

在Delphi中,您可以遍历窗体组件(而不是控件),如下所示:

然而,在c#Winforms中,我尝试了以下方法:

        foreach (var component in this.components.Components)
        {
            MessageBox.Show(component.ToString());
        }
我在谷歌上找不到任何关于如何迭代组件的例子。我所发现的只是如何遍历控件

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

这在c#
使用继承的表单时也要非常小心。
与Delphi不同,UnvisualDesigner在组件集合方面不支持oop,它为每个表单创建了一个新集合,甚至为子体也创建了一个集合

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


Delphi中的组件是什么?什么使它不同于控件?delphi中的组件可以是任何东西,例如editbox,也可以是imagelist。它们都保存在同一个集合中。组件列表包含给定组件所拥有的所有组件,控件列表包含唯一的给定组件所属的所有组件difference@GuidoG不是这样。Delphi中的控件是指从
TControl
派生的任何东西。这些都是可视的,它们的识别特征是它们有一个
父对象
。当我后来说它们被分离时,我的意思不是在Delphi的更高版本中,而是在Delphi的对象层次结构中。我刚才说的话有点误会。有些组件是TwinControl的后代,有些是TGraphicControl的后代,如果我没记错的话?但所有这些都是作为对象出生的,还是我真的已经完全忘记了Delphi?TControl从何而来?t从TObject继承的持久性?如果我没记错的话。在Borland课程中,他们从未调用过控件(我将它们交给Delphi5)。我第一次学习控件这个术语是在VisualStudio中。不管怎样,我想解释的是,与VisualStudio不同,VisualStudio有两个集合,一个用于控件,一个用于组件,而Delphi中只有一个集合。
        foreach (var component in this.components.Components)
        {
            MessageBox.Show(component.ToString());
        }
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)
    {
    }
}