2

我有一个Flowlayoutpanel数量不详的孩子。我怎样才能找回所有的孩子?到目前为止,我已经尝试过这个没有成功:

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

    var list = new List<Control>();

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

    foreach (var control1 in list)
        Debug.Print(control.Name);  
}

但我只得到前两个孩子。有人知道为什么吗?

编辑:

我需要所有孩子的所有孩子的孩子等等。

4

2 回答 2

2

这个怎么样:

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

请记住,这是线性的,而不是分层的,就像您当前的算法一样。


要获得所有孩子,无论级别如何,您都需要执行以下操作:

private IEnumerable<Control> GetChildren(Control control = null)
{
    if (control == null) control = flowLayoutPanel;

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

    foreach (var child in list)
        list.AddRange(GetChildren(child));

    return list;
}

然后当您想要整个列表时,只需执行以下操作:

var controls = GetChildren();
于 2013-10-07T18:37:19.907 回答
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);
}
于 2013-10-07T20:00:01.877 回答