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