我尝试了这段代码:

(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。然后使用DateDateTime属性。

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();
}

09-25 17:14