2013-06-18 5 views
7

Windowsフォームで使用されるすべてのコントロールのリストを見つけて収集する方法を知っています。このような 何か:Windowsフォームでコンポーネントを検索するC#(コントロールではない)

static public void FillControls(Control control, List<Control> AllControls) 
{ 
    String controlName = ""; 
    controlName = control.Name; 

    foreach (Control c in control.Controls) 
    { 
     controlName = c.Name; 
     if ((control.Controls.Count > 0)) 
     { 
      AllControls.Add(c); 
      FillControls(c, AllControls); 
     } 
    } 
} 

ただし、この機能はなどは、HelpProvider、イメージリストのようなフォームの下部に非ビジュアルコンポーネント、TableAdapters、データセット、

を取得しない方法はありますこれらのコンポーネントのリストも取得できますか?

編集:

おかげで同様の機能に代わりSystem.ComponentModel.Componentを使用するように私を指しているため@HighCore私部品などのImageList、ヘルププロバイダとのBindingSourceのリストを取得しています。 しかし、私はまだこのリストからTableAdaptersとDataSetsを見逃しています。私はそれらがObjectから直接継承されるためだと思います。

を入力してください。似たような機能を持ち、コントロールのリストしか取得していない古い投稿を参照しないでください。

編集:なぜ否定票ですか?この質問はこれまでに決して答えられていません!

+0

私はwinformsに慣れていませんが、探しているものが 'Components'(I.E' System.ComponentModel.Component')であれば、 'Control'の代わりにそれを使うべきです。そして、BTWは、この恐ろしいforeachコードを美しい '.SelectMany()'に変更してください。 –

+0

http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls-and-all-components-into- form-in-c –

+1

重複:[すべてのコントロールとすべてのコンポーネントをC#でフォームにアクセスするにはどうすればよいですか?](http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls- and-all-components-in-c) – SwDevMan81

答えて

12

驚くべきことに、これを行うための唯一の方法は反射によるものだと思われます。

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; 
} 
+0

はい、これが勝者です。どうもありがとうございました!! –

+1

申し訳ありませんが、このスレッドは古くなっていますが、これはフォームのコンポーネントを取得する唯一の方法です。質問はCraig、答えはMichaelに感謝します。これは私を助けました。 – nurchi

関連する問題