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中的QuickWatchsrc
查看它的类型和内容
然后,您可以更新源代码以使用适当类型的数据源
编辑如果数据源是数据集,它将包含一个或多个表。如果它包含一个表,则很容易检索:
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不是一个表,而是通过datasetAvoidas
来实现的。然后,您将在异常文本中看到实际的类型,您不必调试就可以找到该类型。