在对带有空格的字符串上使用.contains方法时,“对象引用未设置为对象的实例”

时间:2014-03-07 15:41:37

标签: c# winforms visual-studio-2010

首先,我是C#和Windows窗体的新手。通常我能在网上找到我的问题的答案,但这个问题让我望而却步。

我认为我想做的事情非常简单,但错误一直困扰着我。我在表单上有一个文本框和一个列表框。我希望用户能够通过开始在文本框中键入名称来快速找到数据表中的名称,并且所有符合他目前所键入的名称的名称将显示在列表框中。

所以,我有一个Access数据库,我将其放入Tableadapters。然后,我将表中列出员工的数据放入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)

这样可以正常运行,没有错误。 “First Name”列与“Full Name”列具有相同的属性,但不包含空格。我会使用这个,但我希望表单用户能够在文本框中输入第一个或最后一个名称以及列表框来显示任何匹配项。

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

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");

这很好用。

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

1 个答案:

答案 0 :(得分:1)

你不能改变代码来检查空值吗?

<强>!String.IsNullOrEmpty(字符串)

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)