我有一个表单,我有很多文本框,所有这些都需要填写。在C#中,如果检查是否有一组具有null或空格的字段,我该怎么做?
我熟悉string.isNullOrWhiteSpace(string here)
,但我不想做多个if语句,这会导致代码错误。
我试图避免这样的事情
if(string.isNullOrWhiteSpace(string here)
|| string.isNullOrWhiteSpace(string here)
|| string.isNullOrWhiteSpace(string here))
{
// do something
}
是否有针对此类错误代码的修复程序?
答案 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);