如何枚举基窗体中的所有组件(甚至是以派生形式添加的组件)

本文关键字:组件 添加 派生 枚举 何枚举 窗体 | 更新日期: 2023-09-27 18:31:23

有没有办法枚举.NET表单对象上的所有组件并在c#中更改其某些属性?基窗体中的方法应该能够枚举所有组件,包括在派生窗体中添加的组件。

与 Delphi 一样,.NET 中的 C# 可以在窗体中列出所有可视控件。

Delphi: Self.Controls[i];//where i = 0 to ControlCount-1

C#:foreach(Control c in Controls) {}

在这两种语言/技术中,这都可以在基窗体方法中用于列出甚至在派生窗体上添加的所有控件。

到目前为止一切顺利,但这与非可视组件的工作方式不同。

在德尔福中,可以通过以下方式列出所有非可视组件:

Self.Components[i]; //其中 i = 0 到 ComponentCount-1请注意,该列表还包括在派生窗体中添加的所有组件。

它在 c# 中不以类似的方式工作。您可以使用表单的components容器获取有关某些组件的一些信息 - 仅获取使用该组件的组件System.ComponentModel.Container。它不会列出所有组件。例如,不能枚举不是使用该ComponentsModel.Container创建的DevArt的MySQL组件。

此外,在任何情况下,添加到

派生表单的那些组件都不能在基对象中枚举,即使它们是使用 ComponentModel.Container 创建的,因为 ComponentModel.Container 实例是每个表单对象的本地实例。

如何枚举基窗体中的所有组件(甚至是以派生形式添加的组件)

你试过反思吗?

 private 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;
    }