0

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

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

Delphi: Self.Controls[i]; //其中 i = 0 到 ControlCount-1

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

在这两种语言/技术中,这可以在基本表单方法中使用,以列出甚至添加到派生表单上的所有控件。

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

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

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

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

此外,在任何情况下,添加到派生表单的那些组件不能在基础对象中枚举,即使它们是使用ComponentModel.Container创建的,因为ComponentModel.Container实例对于每个表单对象都是本地的。

4

1 回答 1

0

你试过反射吗?

 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;
    }
于 2016-11-19T11:38:38.190 回答