如果多个文本框为空或空格,则检查它们

时间:2012-02-26 03:17:33

标签: c# .net winforms textbox

我有一个表单,我有很多文本框,所有这些都需要填写。在C#中,如果检查是否有一组具有null或空格的字段,我该怎么做?

我熟悉string.isNullOrWhiteSpace(string here),但我不想做多个if语句,这会导致代码错误。

我试图避免这样的事情

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

是否有针对此类错误代码的修复程序?

3 个答案:

答案 0 :(得分: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控件。如果每个GroupBox都加载到表单上而没有嵌套在另一个控件中,这可能会让你开始。

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

答案 1 :(得分: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
}

答案 2 :(得分:0)

另一个解决方案。 这将以递归方式遍历整个控件树,并在所有文本框中检查null或空文本。 警告 - 如果您有一些花哨的控件没有继承标准的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);