我有一个带有一堆标签和文本框的面板。
代码:
foreach (Control ctrl in this.pnlSolutions.Controls)
似乎只能在面板和2升内找到html表。 但它没有得到html表中的文本框。 是否有简单方法来获取所有面板内的控件,无论嵌套?
谢谢!
答案 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指出的那样,你需要递归地遍历控件以找到它们。