2017-03-02 23 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

就是這樣!非常感謝,我想我現在明白了。我錯過的一點是,如果它在任何時候都是真的,它就需要一直返回真實。我只是看不到如何去做。我覺得我嘗試了這樣的事情,但是我錯誤地宣佈了虛擬布爾。無論如何,謝謝。 –