【问题标题】:Recursive Boolean method foreach control in a TableLayoutPanelTableLayoutPanel 中每个控件的递归布尔方法
【发布时间】:2017-07-22 10:03:37
【问题描述】:

我知道我缺少一些基本的东西,但我对递归还是很陌生,很难知道要寻找什么。我在 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;
        }

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

【问题讨论】:

    标签: c# winforms recursion boolean tablelayoutpanel


    【解决方案1】:

    你只是检查孩子而不是父母。即使有更多的孩子要检查,您也会返回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- 和空条件运算符

    【讨论】:

    • 现在你只是检查所有的孩子两次,而 OP 的代码检查他们一次。
    • @Servy:反正我不喜欢递归,所以我现在展示了一个不同的
    • 就是这样!非常感谢,我想我现在明白了。我缺少的是,如果它在任何时候都为真,它需要一直返回真。我只是不知道该怎么做。我觉得我尝试过这样的事情,但我在错误的位置声明了虚拟布尔值。无论如何,谢谢。
    • @WillLatourelle:我很高兴你能成功。但请注意,我现在更改了答案以提出不同的方法。也许你也想测试一下。
    • 这也可以,谢谢。这个我不太了解逻辑,因为我以前从未使用过 Queue。它在哪里从队列中删除控件?对不起,如果问题很愚蠢。我只是看不到 controlQueue.Count 在循环中是如何减少的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2015-12-27
    • 2022-11-12
    • 2012-10-22
    • 2011-12-12
    • 2015-01-17
    • 2016-06-05
    相关资源
    最近更新 更多