我尝试了这段代码:
(datagridview1.DataSource as DataTable).Select("date_time=" + Convert.ToDateTime(dtpDate.Text.ToString()));
但是我认为它仍然包含时间,并且出现错误“语法错误:'12'运算符后缺少操作数”。
我真正想发生的事情是过滤datable的datetime字段,而不考虑它的时间,只是日期。
这是我的datagridview的样子:
1 1 1/24/2013 12:34 AM
1 2 1/24/2013 12:34 AM
2 3 1/24/2013 12:53 AM
3 1/25/2013 12:30 AM
4 1/25/2013 12:53 AM
5 4 1/25/2013 2:10 AM
6 5 1/25/2013 2:26 AM
7 6 1/25/2013 2:39 AM
8 7 1/25/2013 2:40 AM
更新的代码:
datagridview1.DataSource = (datagridview1.DataSource as DataTable).AsEnumerable()
.Where(r => r.Field<DateTime?>("date_time").HasValue
&& r.Field<DateTime?>("date_time").Value.Date == dt.Date).CopyToDataTable();
最佳答案
要比较日期时不要使用字符串。您可以使用Linq-To-DataTable
和强类型DataRow
扩展方法Field
。然后使用Date
的DateTime
属性。
DateTime dt = DateTime.Parse(dtpDate.Text);
DataTable filteredRows = table.AsEnumerable()
.Where(r => r.Field<DateTime>("date_time").Date == dt.Date)
.CopyToDataTable();
编辑(根据您的评论)
“无法将DBNull.Value强制转换为类型'System.DateTime'。请使用可为空的类型。
然后,在此字段中有
nulls
。由于Field
方法支持nullable-types,因此可以直接使用它。DataTable filteredRows = table.AsEnumerable()
.Where(r => r.Field<DateTime?>("date_time").HasValue
&& r.Field<DateTime?>("date_time").Value.Date == dt.Date)
.CopyToDataTable();
编辑因此,当表为空时,您将获得异常。是的,当源表为空时,
CopyToDataTable
会引发InvalidOperationException
。请注意,也许您根本不需要将结果复制到新的
DataTable
中。您可以将查询本身绑定到datagridview的datasource属性,因此尝试简单地省略CopyToDataTable
。var filteredRows = table.AsEnumerable()
.Where(r => r.Field<DateTime?>("date_time").HasValue
&& r.Field<DateTime?>("date_time").Value.Date == dt.Date);
datagridview1.DataSource = filteredRows;
否则,您还可以检查查询是否返回任何内容:
DataTable table = new DataTable();
if(filteredRows.Any())
{
table = filteredRows.CopyToDataTable();
}