我有一个绑定到数据源的DataGridView
。我还有一个TextBox
来过滤记录。在文本框的TextChanged
事件中,我有一行代码:我通过表单的designview绑定gridview,拖动gridview并选择datasource ...然后选择成员表。
(gvSideMember.DataSource as DataTable).DefaultView.RowFilter =
string.Format("F_NAME LIKE '%{0}%'", textSearch.Text);
但是当我尝试过滤记录时,它向我显示对象引用未设置为实例。数据源有记录。我不知道发生了什么,请指导我,帮助将不胜感激。
答案 0 :(得分:1)
您使用的是as
关键字。可能是gvSideMember.DataSource
虽然有记录,但不属于DataTable类型,因此(gvSideMember.DataSource as DataTable)
是null
?
答案 1 :(得分:1)
如果DataSource
不是DataTable
,则(DataSource as DataTable)
会返回null
。
例如,你可以做的是:
var src = gvSideMember.DataSource;
在该行之后放置一个断点,然后当你点击它时,在Visual Studio中使用QuickWatch src
来查看它的类型和内容。
然后,您可以更新源代码以使用正确类型的DataSource
。
编辑如果DataSource是DataSet,它将包含一个或多个表。如果它包含单个表,则很容易检索:
var src = (DataSet) gvSideMember.DataSource;
var table = src.Tables[0];
但如果它包含更多表,您可以使用正确的数字(0,1,...)或名称检索它:
var table = src.Tables["MyTable"];
答案 2 :(得分:0)
你可以在语句之前测试nullity - 在下面的例子中我只是记录它们是null,所以你仍然会得到错误,但你可以使用这些检查来决定不执行操作或供应默认等。
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 as DataTable).DefaultView
。