2013-10-07 33 views
2

我有一個Flowlayoutpanel與未知量的孩子。我怎樣才能找回所有的孩子?到目前爲止,我已經嘗試過沒有成功:C#中的Flowlayoutpanel的所有子代#

private LoopReturn(Control control) 
     {  
      Control c = control; 

      var ls = new List<Control>(); 

      while (c != null) 
      { 
       ls.Add(c); 
       c = c.GetNextControl(c, true);      
      } 

      foreach (Control control1 in ls) 
      { 
       Debug.Print(control.Name); 
      }  
     } 

但我只得到前兩個孩子。有人知道爲什麼嗎?

編輯:

我需要所有兒童等所有兒童的兒童

回答

2

如何:

var controls = this.flowLayoutPanel.Controls.OfType<Control>(); 

記住,這是線性的,不分層,就像你是目前的算法。


爲了讓所有的兒童,不分級別,你需要做這樣的事情:

private IEnumerable<Control> GetChildren(Control ctrl = null) 
{ 
    if (ctrl == null) { ctrl = this.flowLayoutPanel; } 
    List<Control> list = ctrl.Controls.OfType<Control>().ToList(); 
    foreach (var child in list) 
    { 
     list.AddRange(GetChildren(child)); 
    } 
    return list; 
} 

,然後當你想要的總名單只是這樣做:

var ctrls = GetChildren(); 
+0

我只使用該獲得的第一個孩子,不是孩子的孩子等 – Dimo

+0

@Dimo,那麼這將做到這一點你。 –

+0

我想讓孩子的孩子,你的代碼不這樣做。它只得到第一個孩子。或者我錯過了什麼? – Dimo

0

遞歸函數將工作:

private IEnumerable<Control> ChildControls(Control parent) { 
    List<Control> controls = new List<Control>(); 
    controls.Add(parent); 
    foreach (Control ctrl in parent.Controls) { 
    controls.AddRange(ChildControls(ctrl)); 
    } 
    return controls; 
} 

然後調用它:

foreach (Control ctrl in ChildControls(flowLayoutPanel1)) { 
    Debug.Print(ctrl.Name); 
}