在包含空格的字符串上使用.contains方法时出现“对象引用未设置为对象的实例”。

9 浏览
0 Comments

在包含空格的字符串上使用.contains方法时出现“对象引用未设置为对象的实例”。

首先,我对C#和Windows Forms还很陌生。通常我能在网上找到答案,但这个问题一直困扰着我。

我想我想做的事情非常简单,但错误一直在我的路上。我在一个窗体上有一个文本框和一个列表框。我希望用户能够通过在文本框中开始输入名称来快速查找数据表中的名称,并显示符合搜索条件的名称列表在列表框中。

因此,我有一个Access数据库,我将其放入Tableadapters中。然后,我将包含员工名单的表中的数据放入数据表中。我的文本框名为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("Full Name") == * + textbox1.Text + *
                        select Employees.Field("Full Name");
    this.listBox1.DataSource = EmployeeNames.ToList();
}

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

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

问题是当我运行这段代码时,我会收到“对象引用未设置为对象的实例”的错误。我相信这是由于我的数据表中的“Full Name”数据列包含了在形式上将名字和姓氏之间用空格隔开的姓名,如“Tom Riddle”。我的表中有另一个数据列,只包含没有空格的名字,如果我改为如下所示:

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

这样做没有错误。\'第一名\'列具有与\'全名\'列相同的属性,但不包含空格。我会使用这个,但我希望窗体用户能够从文本框中开始输入名字或姓氏,并且列表框显示任何匹配项。

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

var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                    select Employees.Field("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");

这个没有问题。

我有点困惑。此外,我知道还有其他方法,比如将字符串拆分并搜索每个单独的字符串,或在主表单上有一个单独的文本框用于名字和姓氏,然后根据名字和姓氏列分别搜索数据表。这是做我想要的事情最干净的方法,所以我只是想理解我做错了什么。感谢大家的帮助。

admin 更改状态以发布 2023年5月21日
0
0 Comments

你不能把代码改成检查空值吗?

!String.IsNullOrEmpty(string)

var EmployeeNames = from Employees in EmployeeTable.AsEnumerable()
                    select Employees.Field("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)

0