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に関する情報を取得できます。. すべてのコンポーネントがリストされているわけではありません。たとえば、 を使用して作成されていない DevArt の MySQL コンポーネントは列挙できません。System.ComponentModel.ContainerComponentsModel.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 に答える