2011-12-21 98 views
10

我正在尋找一個代碼示例如何獲得父級控制的所有子級。如何獲得父母控制的所有孩子?

我不知道它是怎麼做到的。

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

你的問題不清楚。你想如何「獲得」這些控件,看看你已經知道如何遍歷它們? – 2011-12-21 19:51:44

+0

您已經在使用foreach循環迭代子項。至少這個孩子。控制,大概是形式。 「父母控制」的含義並不明確。 – 2011-12-21 19:54:01

回答

15

如果只想眼前的孩子,使用

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

如果你想從層次結構(即,一切都在樹一定的控制之下),使用的所有控件:

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); 

    } 

然後,你可以使用類似這樣的形式:

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 
     } 
    } 

注意.ToList()會立即評估整個Enumerable,從而消除了從協程實現中可能獲得的性能優勢。

4

控件有一個MyControl.Controls集合,你可以做一個foreach

每個控件也有一個Parent屬性,它給你父控件。

如果您需要降低未知數量的級別,則可以編寫遞歸方法。

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所有DropDownLists和他所有的孩子

0

可能過於複雜,但使用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; 
     } 
    } 
相關問題