1

我试过这段代码:

(datagridview1.DataSource as DataTable).Select("date_time=" + Convert.ToDateTime(dtpDate.Text.ToString()));

但我认为它仍然包含时间并让我出错“语法错误:'12' 运算符后缺少操作数。”

我真正想要发生的是过滤数据的日期时间字段而忽略它的时间,只是日期。

这是我的数据网格视图的样子:

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

2 回答 2

3

当你想比较日期时不要使用字符串。您可以使用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方法支持可空类型,因此您可以直接使用它。

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 的数据源属性,因此请尝试简单地省略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();
}
于 2013-02-01T09:27:32.300 回答
1
            DataView dv = new DataView(Datatable1);
            dv.RowFilter = "StartDate >= #" + DtpDateRangeFrom.Value + "# AND StartDate <= #" + DtpDateRangeTo.Value + "#";
于 2013-02-04T09:12:22.697 回答