在C#中获取Flowlayoutpanel的所有孩子

时间:2013-10-07 18:33:18

标签: c# winforms flowlayoutpanel

我有一个包含未知数量儿童的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 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

递归函数可以工作:

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