foreach在SomePanel.Controls中控制ctrl不会获得所有控件

时间:2010-05-13 15:59:08

标签: c# asp.net controls textbox

我有一个带有一堆标签和文本框的面板。

代码:

foreach (Control ctrl in this.pnlSolutions.Controls)

似乎只能在面板和2升内找到html表。 但它没有得到html表中的文本框。 是否有简单方法来获取所有面板内的控件,无论嵌套

谢谢!

5 个答案:

答案 0 :(得分:8)

这是一个懒惰的解决方案:

public IEnumerable<Control> GetAllControls(Control root) {
  foreach (Control control in root.Controls) {
    foreach (Control child in GetAllControls(control)) {
      yield return child;
    }
  }
  yield return root;
}

还要记住,某些控件会保留项目的内部集合(例如ToolStrip),但这不会枚举这些项目。

答案 1 :(得分:4)

你需要通过控件递归“树木行走”,想一想就像走过文件夹结构一样。

有一个示例Here

答案 2 :(得分:2)

据我所知,你必须亲自实现递归,但这并不困难。

草图(未经测试):

void AllControls(Control root, List<Control> accumulator)
{
    accumulator.Add(root);
    foreach(Control ctrl in root.Controls)
    {
        AllControls(ctrl, accumulator);
    }
}

答案 3 :(得分:2)

我确实遇到了问题所述的问题,所以这可能对某人有所帮助。我试图在重写之前清除控件集合。

private void clearCollection(Control.ControlCollection target)
{
    foreach (Control Actrl in target)
    {
        if (Actrl is Label || Actrl is Button)
        {
            target.Remove(Actrl);
        }
    }
 }

通过删除foreach循环中的控件,它必须弄乱内部指针,结果是错过了集合中的控件。 我的解决方案是找到所有控件,然后在一个单独的循环中删除。

private void clearCollection(Control.ControlCollection target)
    {
        List<Control> accumulator = new List<Control>();

        foreach (Control Actrl in target)
        {
            if (Actrl is Label || Actrl is Button)
            {
                accumulator.Add(Actrl);  // find all controls first. 
            }
        }

        for (int i = 0; i < accumulator.Count; i++)
        {
            target.Remove(accumulator[i]);
        }
    }

答案 4 :(得分:1)

原因是因为您面板中直接子项的唯一控件是表和您提到的文字,只有this.pnlSolutions.Controls返回的控件才会出现。

文本框中的标签是表格的子控件,使其成为面板的孙子。

正如@Yoda指出的那样,你需要递归地遍历控件以找到它们。