TableLayoutPanel中的递归布尔方法foreach控件

时间:2017-03-02 15:30:20

标签: c# winforms recursion boolean tablelayoutpanel

我知道我遗漏了一些基本的东西,但我仍然不熟悉递归,而且很难知道要寻找什么。我已经用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;
        }

我认为正在发生的事情是它到达最后一个控制并看到它没有孩子,并且因为它跳过循环而踢回假。

1 个答案:

答案 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-运算符