Delphi to C# WinForms:循环访问窗体上的窗体组件

本文关键字:窗体 组件 访问 循环 to WinForms Delphi | 更新日期: 2023-09-27 17:56:26

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

for i := 0 to Form1.ComponentCount - 1 do begin

但是在 c# Winforms 中,我尝试了以下方法:

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

我在谷歌上找不到任何关于如何迭代组件的示例。我发现的只是如何循环访问控件。

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

Delphi to C# WinForms:循环访问窗体上的窗体组件

这在 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)
    {
    }
}