2017-03-02 24 views
0

我知道我错过了一些基本的东西,但我仍然对递归感到陌生,并且很难知道要寻找什么。我用void递归方法做得很好,但是这个布尔值让我感动。递归布尔方法在TableLayoutPanel中的foreach控制

我需要检查我的TableLayoutPanel中的每个控件,看它是否是一个TextBox,然后看看它是否有文本。 (如果它确实返回true,如果所有文本框都为空,则返回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

你只是检查孩子,但不是父母。即使有更多的孩子需要检查,也可以返回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 - 与空conditional-运营商

+0

现在你只是检查所有的孩子的两倍,而OP的代码,一旦检查它们。 – Servy

+0

@Servy:我不喜欢递归,所以我现在展示了一个不同的 –

+0

就是这样!非常感谢,我想我现在明白了。我错过的一点是,如果它在任何时候都是真的,它就需要一直返回真实。我只是看不到如何去做。我觉得我尝试了这样的事情,但是我错误地宣布了虚拟布尔。无论如何,谢谢。 –