【问题标题】:"object reference not set to an instance of an object" when using .contains method on string with white space对带有空格的字符串使用 .contains 方法时,“对象引用未设置为对象的实例”
【发布时间】:2014-03-07 15:41:37
【问题描述】:

首先,我对 C# 和 windows 窗体还很陌生。通常我可以在网上找到我的问题的答案,但这个问题让我望而却步。

我认为我想做的事情很简单,但错误不断地阻碍我。我在表单上有一个文本框和一个列表框。我希望用户能够通过开始在文本框中键入名称来快速在数据表中找到一个名称,并且所有符合他迄今为止键入的名称的名称都将出现在列表框中。

所以,我有一个要放入 Tableadapter 的 Access 数据库。然后,我将列出员工的表中的数据放入 DataTable 中。我的文本框称为 textbox1。理想情况下,我可以像这样在搜索中使用“*”字符作为通配符:

private void textBox1_TextChanged(object sender, EventArgs e)
{    
    //Put data into the datatable and seach
    DataTable EmployeeTable = this.tblEmployeesTableAdapter.GetData();
    var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                        where Employees.Field<string>("Full Name") == * + textbox1.Text + *
                        select Employees.Field<string>("Full Name");
    this.listBox1.DataSource = EmployeeNames.ToList();
}

由于似乎没有任何通配符,我使用 .Contains 方法,如下所示:

DataTable EmployeeTable = this.tblEmployeesTableAdapter.GetData();
var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                    where Employees.Field<string>("Full Name").Contains(textBox1.Text) 
                    select Employees.Field<string>("Full Name");
this.listBox1.DataSource = EmployeeNames.ToList()

问题是当我运行此代码时,我收到错误“对象引用未设置为对象的实例”。我相信这是因为我的数据表中的“全名”数据列包含名字和姓氏之间的空格,格式为“Tom Riddle”。我的表中有另一个数据列,只包含没有空格的名字,如果我说:

where Employees.Field<string>("First Name").Contains(textBox1.Text)

这工作正常,没有错误。 “名字”列与“全名”列具有相同的属性,但不包含空格。我会使用它,但我希望表单用户能够开始在文本框中输入名字或姓氏,并在列表框中显示任何匹配项。

为了让我更加困惑,如果我只是选择数据表中的所有全名,然后像这样遍历每个全名,我仍然会收到错误:

var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                    select Employees.Field<string>("Full Name");

foreach (string EmployeeName in EmployeeNames)
    if (EmployeeName.Contains(textbox1.Text))
         this.listBox1.Items.Add(EmployeeName);

如果我自己定义一个字符串:

string name = "Tom Riddle";
bool does_contain = name.Contains("To");

这很好用。

我想我对此有点困惑。另外,我知道还有其他方法可以做到这一点,例如拆分字符串并搜索每个单独的字符串,或者在主窗体上为名字和姓氏设置一个单独的文本框,然后根据名字和姓氏搜索数据表列分开。这是做我想做的最干净的方法,所以我只是想了解我做错了什么。感谢大家的帮助。

【问题讨论】:

  • 嗯,很明显,返回的字符串之一是null-reference。带空格的名称不是这里的原因。该列中很可能存在具有 NULL 值的行,并且某些行具有空字符串。根据您用于查看数据的工具,它们可能看起来相同,但读取和处理方式不同。

标签: c# winforms visual-studio-2010


【解决方案1】:

您不能更改代码以检查空值吗?

!String.IsNullOrEmpty(string)

var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                    select Employees.Field<string>("Full Name");

foreach (string EmployeeName in EmployeeNames)
    if (!String.IsNullOrEmpty(EmployeeName) && EmployeeName.Contains(textbox1.Text))
         this.listBox1.Items.Add(EmployeeName);

按照 aevitas 的建议,考虑使用 IsNullOrWhitespace。

string.IsNullOrEmpty(string) vs. string.IsNullOrWhiteSpace(string)

【讨论】:

  • 您可能想改用!string.IsNullOrWhiteSpace,因为在这种情况下空格也不是有效的条目。
  • 添加了一个比较两者的链接:)
  • 射击。我的数据库中有一个空引用,我以前没有修复过。这解释了它。不过,我会为您提供建议并更改代码以应对未来的问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多