2012-02-26 148 views
0

我有一個表單,其中有很多文本框,並且需要填寫所有文本框。在C#中,如果檢查是否存在具有null或空白的字段組,我該如何處理呢?檢查多個文本框,如果它們爲空或空白

我熟悉string.isNullOrWhiteSpace(string here)但我不想做多重if語句,這會導致錯誤的代碼。

我試圖避免這樣的事情

if(string.isNullOrWhiteSpace(string here) 
    || string.isNullOrWhiteSpace(string here) 
    || string.isNullOrWhiteSpace(string here)) 
{ 
    // do something 
} 

是否有這種類型的惡意代碼修復?

回答

3

您可以查詢表單(或相關容器)的控件集合並過濾文本框,並進一步查詢是否有任何內容爲空(沒有內容應該具有空值)。例如:

var emptyTextboxes = from tb in this.Controls.OfType<TextBox>() 
        where string.IsNullOrEmpty(tb.Text) 
        select tb; 

if (emptyTextboxes.Any()) 
{ 
    // one or more textboxes are empty 
} 

您可以使用流暢的語法有效地做同樣的事情。

bool isIncomplete = this.Controls.OfType<TextBox>().Any(tb => string.IsNullOrEmpty(tb.Text)); 
if (isIncomplete) 
{ 
    // do your work 
} 

對於此代碼,您應該至少使用Visual Studio 2008/C#3/.NET 3.5。您的項目需要引用System.Core.dll(默認情況下應該有一個),並且您需要類文件中的using System.Linq;指令。


根據您的意見,如果您無法理解或使用linq版本,請考慮另一種方法。你當然可以在一個明確的循環中做到這一點(Linq代碼最終也將是一個循環)。考慮

bool isIncomplete = false; 
foreach (Control control in this.Controls) 
{ 
    if (control is TextBox) 
    { 
      TextBox tb = control as TextBox; 
      if (string.IsNullOrEmpty(tb.Text)) 
      { 
       isIncomplete = true; 
       break; 
      } 
    } 
} 

if (isIncomplete) 
{ 

} 

最後,如果所有的文本框是在一個容器中的代碼被寫入。該容器可能是窗體,面板等。您將需要指向適當的容器(例如,而不是this(表單)它可能是this.SomePanel)。如果您使用的是多個嵌套容器中的控件,則需要做更多的工作來以編程方式查找它們(遞歸搜索,顯式串聯等),或者您可能只是將引用預加載到數組或其他集合中。例如

var textboxes = new [] { textbox1, textbox2, textbox3, /* etc */ }; 
// write query against textboxes instead of this.Controls 

你說你有多個組框控件。如果每個GroupBox都加載到窗體上,而不是嵌套在另一個控件中,則可能會使您開始。

var emptyTextboxes = from groupBox in this.Controls.OfType<GroupBox>() 
        from tb in groupBox.Controls.OfType<TextBox>() 
        where string.IsNullOrEmpty(tb.Text) 
        select tb; 
+0

你能進一步解釋你的代碼? – user962206 2012-02-26 04:10:06

+0

你有什麼理解麻煩?這是使用Linq,它已經是C#和Visual Studio(2008和2010)的最後兩個版本的一部分。 – 2012-02-26 04:11:25

+0

你可以查詢組件?我從來不知道那裏有沒有在線文檔?我很感興趣我想查看更多關於查詢組件的文檔 – user962206 2012-02-26 04:12:08

1

這取決於你認爲「壞代碼」。根據您的要求,需要填寫的文本框可能會有所不同。此外,即使所有的字段都需要所有的時間,你仍然想給出友好的錯誤信息,讓人們知道他們沒有填寫哪個字段。取決於您如何渲染表單,有多種解決此問題的方法。既然你沒有在這裏指定一個非常直接的方法。

var incompleteTextBoxes = this.Controls.OfType<TextBox>() 
           .Where(tb => string.IsNullOrWhiteSpace(tb.Text)); 

foreach (var textBox in inCompleteTextBoxes) 
{ 
    // give user feedback about which text boxes they have yet to fill out 
} 
0

又一種解決方案。 這將遞歸地遍歷整個控件樹,並在所有文本框中檢查空或空文本。 警告 - 如果你有一些奇特的控制不是從標準的WinForms文本框繼承 - 檢查將不執行

bool check(Control root,List<Control> nonFilled) 
{ 
    bool result =true; 
    if (root is TextBox && string.isNullOrEmpty(((TextBox)root).Text) ) 
    { 
    nonFilled.Add(root); 
    return false; 
    } 
    foreach(Control c in root.Controls) 
    { 
    result|=check(c,nonFilled) 
    } 
    return result; 
} 

用法:

List<Control> emptytextboxes=new List<Control>() 
    bool isOK=check(form, emptytextboxes);