我知道我遗漏了一些基本的东西,但我仍然不熟悉递归,而且很难知道要寻找什么。我已经用void递归方法做得很好,但是这个布尔让我绊倒了。
我需要检查TableLayoutPanel中的每个Control,看看它是否是TextBox,然后查看它是否包含文本。 (如果确实返回true,如果所有TextBox都为空,则返回false。)
这就是我的开始,我理解为什么它不起作用,但我无法弄清楚解决方案是什么。
private bool CheckNewRecord(Control Con)
{
foreach (Control C in Con.Controls)
{
if (C is TextBox && ((TextBox)C).Text != "")
{
return true;
}
else
{
return CheckNewRecord(C);
}
}
return false;
}
我认为正在发生的事情是它到达最后一个控制并看到它没有孩子,并且因为它跳过循环而踢回假。
答案 0 :(得分:0)
您只是检查孩子而不是父母。即使有更多孩子要检查,您也会返回false
。仅立即返回true
。
我可以使用Queue<T>
public static bool ContainsNonEmptyTextBox(Control con)
{
var controlQueue = new Queue<Control>();
controlQueue.Enqueue(con);
while (controlQueue.Count > 0)
{
Control current = controlQueue.Dequeue();
TextBox txt = current as TextBox;
if (!String.IsNullOrEmpty(txt?.Text))
return true;
foreach (Control c in current.Controls)
controlQueue.Enqueue(c);
}
return false;
}
在我的观点中,这更容易阅读和理解,根本没有递归。
我还使用了as
- 和null-conditional-运算符