1

私はこのコードを試しました:

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

しかし、それでも時間が含まれていると思います。「構文エラー:「12」演算子の後にオペランドがありません。」というエラーが表示されます。

私が本当にやりたいのは、データブルの日時フィールドを、その時刻を無視して、日付だけをフィルタリングすることです。

これが私の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();
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'にキャストできません。null許容タイプを使用してください。

次にnulls、このフィールドにあります。このFieldメソッドはnull許容型をサポートしているため、直接使用できます。

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();
}
于 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 に答える