C# 对象引用未设置为实例异常

C# 对象引用未设置为实例异常,c#,sql,winforms,C#,Sql,Winforms,我有一个绑定到数据源的DataGridView。我还有一个文本框来过滤记录。在文本框的TextChanged事件中,我有一行代码:我通过表单的designview绑定gridview拖动gridview并选择datasource。。。然后是成员表 (gvSideMember.DataSource as DataTable).DefaultView.RowFilter = string.Format("F_NAME LIKE '%{0}%'", textSearch.Text); 但当

我有一个绑定到数据源的
DataGridView
。我还有一个
文本框来过滤记录。在文本框的
TextChanged
事件中,我有一行代码:我通过表单的designview绑定gridview拖动gridview并选择datasource。。。然后是成员表

(gvSideMember.DataSource as DataTable).DefaultView.RowFilter = 
    string.Format("F_NAME LIKE '%{0}%'", textSearch.Text);

但当我尝试过滤记录时,它显示对象引用未设置为实例。数据源有记录。我不知道发生了什么,请指导我,谢谢你的帮助。

你可以在语句之前测试空值-在下面的示例中,我只是记录它们为空,所以你仍然会得到错误,但是你可以使用这些检查来决定不执行操作或提供默认值等

if (gvSideMember == null) {
    Debug.WriteLine("gvSideMember is null");
}

if (textSearch == null) {
    Debug.WriteLine("textSearch is null");
}

(gvSideMember.DataSource as DataTable).DefaultView.RowFilter = 
    string.Format("F_NAME LIKE '%{0}%'", textSearch.Text);

您可以测试任何可能为空的内容-甚至
(gvSideMember.DataSource作为DataTable)。如果愿意,可以使用DefaultView

您使用的是
作为
关键字。可能是
gvSideMember.DataSource
虽然有记录,但不是DataTable类型,因此
(gvSideMember.DataSource作为DataTable)
null

如果
DataSource
不是
DataTable
,那么
(DataSource作为DataTable)
返回
null

例如,你能做的是:

var src = gvSideMember.DataSource;
在该行之后放置一个断点,然后当您点击它时,在VisualStudio中的QuickWatch
src
查看它的类型和内容

然后,您可以更新源代码以使用适当类型的
数据源

编辑如果数据源是数据集,它将包含一个或多个表。如果它包含一个表,则很容易检索:

var src = (DataSet) gvSideMember.DataSource;
var table = src.Tables[0];
但如果它包含更多表,则可以使用正确的数字(0,1,…)或名称检索它:

var table = src.Tables["MyTable"];

textSearch
null吗?不,在调试期间不是nul,它显示值如果
DataSource
不是
DataTable
,则
(DataSource作为DataTable)
返回
null
。是的,这就是如何将数据源创建为表的原因。我只是通过设计而不是编程将其绑定。如果您不准备接受结果可能为
null
,请不要使用
作为
关键字!如果您说
(源代码为表)。View
您不接受
as
运算符可能给出
null
。在这种情况下,您应该使用cast语法,
((表)source.)。而不是View
。当前者失败时,您会得到一条非信息性异常消息,对象引用未设置为实例。但对于后者,您会得到一些类似于无法将类型为“interest_INFO”的对象强制转换为类型为“Table”的结果,这有助于您理解您所做的工作。因此,简而言之:在这种情况下避免
as
。我认为datasource不是一个表,而是通过datasetAvoid
as
来实现的。然后,您将在异常文本中看到实际的类型,您不必调试就可以找到该类型。