我试过这段代码:
(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();
答案 0 :(得分:3)
要比较日期时,请勿使用字符串。您可以使用Linq-To-DataTable
和强类型DataRow
扩展方法Field
。然后使用Date
的{{1}}属性。
DateTime
修改(根据您的评论)
“无法将DBNull.Value强制转换为'System.DateTime'。请使用可空类型。
然后您在此字段中有DateTime dt = DateTime.Parse(dtpDate.Text);
DataTable filteredRows = table.AsEnumerable()
.Where(r => r.Field<DateTime>("date_time").Date == dt.Date)
.CopyToDataTable();
。由于Field
方法支持nullable-types,因此您可以直接使用它。
nulls
编辑因此,当表为空时,您会收到异常。是的,当源表为空时,DataTable filteredRows = table.AsEnumerable()
.Where(r => r.Field<DateTime?>("date_time").HasValue
&& r.Field<DateTime?>("date_time").Value.Date == dt.Date)
.CopyToDataTable();
会抛出CopyToDataTable
。
请注意,您可能根本不需要将结果复制到新的InvalidOperationException
中。您可以将查询本身绑定到datagridview的datasource属性,因此请尝试简单地省略DataTable
。
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;
答案 1 :(得分:1)
DataView dv = new DataView(Datatable1);
dv.RowFilter = "StartDate >= #" + DtpDateRangeFrom.Value + "# AND StartDate <= #" + DtpDateRangeTo.Value + "#";