TableLayoutPanel 中每个控件的递归布尔方法
Recursive Boolean method foreach control in a TableLayoutPanel
我知道我遗漏了一些基本的东西,但我对递归还是陌生的,很难知道要寻找什么。我用 void 递归方法做得很好,但是这个布尔值让我很困惑。
我需要检查我的 TableLayoutPanel 中的每个控件,看看它是否是一个文本框,然后看看它是否有文本。 (如果它 return 为真,如果所有文本框都为空,则 return 为假。)
这就是我的开始,我明白为什么它不起作用,但我不知道解决方案是什么。
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;
}
我认为发生的事情是它到达最后一个控件并发现它没有子控件,然后返回 false 因为它跳过了循环。
您只是检查了 children 而不是 parent。你也return false
即使有更多children 来检查。 Return 仅 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- 运算符
我知道我遗漏了一些基本的东西,但我对递归还是陌生的,很难知道要寻找什么。我用 void 递归方法做得很好,但是这个布尔值让我很困惑。
我需要检查我的 TableLayoutPanel 中的每个控件,看看它是否是一个文本框,然后看看它是否有文本。 (如果它 return 为真,如果所有文本框都为空,则 return 为假。)
这就是我的开始,我明白为什么它不起作用,但我不知道解决方案是什么。
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;
}
我认为发生的事情是它到达最后一个控件并发现它没有子控件,然后返回 false 因为它跳过了循环。
您只是检查了 children 而不是 parent。你也return false
即使有更多children 来检查。 Return 仅 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- 运算符