2017-12-18 11 views
-1

特定のインターフェイスを実装するフォーム内のすべてのコントロールを探したいとします(ITestInterfaceとしましょう)。私はこの試みている:コントロールチェーン全体のタイプのコントロールを見つけるには?

this.Controls.OfType<ITestInterface>(); 

を、それは(MSDNに書かれているにもかかわらず - @dasblinkenlight)深い唯一のレベルだGOE、例えば、私は形で、パネルとパネルの内側ITestInterfaceコントロールを持っているので、もしそれを見つけることはできません。

どうすればよいですか?


編集: @HansPassantコメントで書いたように、私はハードコード私のパネル名をできたが、しかし、私は一般的な解決策ではなく、特定のフォームに固有のソリューションを必要としています。

+1

ヒント:再帰を使用します。 (Control.Controls/Control.Parent) –

+0

this.Controlsの代わりにpanel1.Controlsを検討してください。 –

+0

@HansPassant - 私は解決策が一般的で、特定のフォームに固有ではないことが必要です。 – Sipo

答えて

2

あなたがあなたのコントロールのControlsプロパティを介して再帰とステップを使用する必要があります。

private IEnumerable<T> GetAllOfType<T>(Control rootControl) 
{ 
    return rootControl.Controls.OfType<T>(). 
      Concat(rootControl.Controls.OfType<Control>().SelectMany(GetAllOfType<T>)); 

} 

あなたはこのように使用することができます。

var allOfTestInterface = GetAllOfType<ITestInterface(this); 

それは直接含まれているそのインターフェイスですべてのコントロールを取ります(あなたのOfType<>()呼び出しで)ルートコントロールによって呼び出され、その後、そのコントロールに含まれるすべてコントロールのメソッドを再度呼び出すため、すべてのコンテナを再帰的に呼び出します。 SelectManyは、このネストされたリストを1つのリストにまとめます。

+1

@dasblinkenlightはい、言葉遣いはむしろ曖昧で、ネストされたコントロールが含まれているとは言いません。ネストされたコントロールを含むフォームのすべてのコントロールを反復するために「コントロール」を使用できます同じ;) –

関連する問題