2011-12-21 44 views
10

私は親コントロールのすべての子を取得するコード例を探しています。親コントロールのすべての子を取得するには?

どうすればいいのかわかりません。

foreach (Control control in Controls) 
{ 
    if (control.HasChildren) 
    { 
    ?? 
    } 
} 
+0

ご質問はっきりしていない。これらのコントロールをどのようにして取得したいのですか?既にそれらのコントロールを反復する方法をどのように知っているかを見ていますか? –

+0

foreachループを使用して、子を既に反復しています。少なくともこれの子供たち。コントロール、おそらくフォーム。 「親コントロール」で何を意味するのかが明確ではありません。 –

答えて

15

次に、次のような形式で使用してください:

private void button1_Click(object sender, EventArgs e) 
    { 
     /// get all of the controls in the form's hierarchy in a List<> 
     var controlList = GetControlHierarchy(this).ToList(); 

     foreach (var control in controlList) 
     { 
      /// do something with this control 
     } 
    } 

はすぐにEnumerable全体を評価するので、コルーチンの実装から得られる効果がなくなります。

4

コントロールを使用すると、上foreachを行うことができますMyControl.Controlsコレクションを持っています。

各コントロールには、親コントロールを提供するParentプロパティもあります。

未知数のレベルを下げる必要がある場合は、再帰的な方法を記述できます。

private IEnumerable<Control> GetControlHierarchy(Control root) 
    { 
     var queue = new Queue<Control>(); 

     queue.Enqueue(root); 

     do 
     { 
      var control = queue.Dequeue(); 

      yield return control; 

      foreach (var child in control.Controls.OfType<Control>()) 
       queue.Enqueue(child); 

     } while (queue.Count > 0); 

    } 

:あなたが唯一の直接の子にしたい場合は、階層(すなわち、特定の制御下にあるツリー内のすべてのもの)、使用からすべてのコントロールをしたい場合は、

... 
var children = control.Controls.OfType<Control>(); 
... 

を使用

2

多分それは誰かのために役に立つかもしれません:

public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter) 
{ 
    foreach (Control child in root.Controls) 
    { 
     var childFiltered = filter(child); 
     if (childFiltered != null) AllControls.Add(child); 
     if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter); 
    } 
} 

これは(種類別expample用)フィルタをアプリングの可能性とコントロールのコレクションを取得するための再帰関数です。そして例:

List<Control> resultControlList = new List<Control>(); 
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null)); 

は、それはおそらく過度に複雑rootControlと彼のすべての子供たちに

0

をすべてDropDownListsを返しますが、/他の場所上からのLINQといくつかのアイデアを使用します:

public static IEnumerable<Control> GetAllChildren(this Control root) { 
     var q = new Queue<Control>(root.Controls.Cast<Control>()); 

     while (q.Any()) { 
      var next = q.Dequeue(); 
      next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue); 

      yield return next; 
     } 
    } 
関連する問題