2017-11-03 6 views
1

datagridviewをx日より古いdatetime field1でフィルタリングするソリューションを探しています。xは同じ行のshort型から別のfield2です。 SQLで可能な構文は次のようになります。c#bindingsource filter datetime x daysより古い

field1 < DATEADD(day, field2, GETDATE()) 

しかし、私は、「フィルタ」のDataGridViewがのBindingSourceとSQLデータベースから充填DataTableに結合されたソースにバインドされているBindingSource のプロパティを使用する必要があります。

+1

フィルタ文字列で許可される式については、https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression(v=vs.110).aspxを参照してください。 – Serg

+0

データはSQLから取得されていますか? – jasttim

+0

はい、DataTableのメモリに保存されています。 – speedone

答えて

0

DataGridViewに何をバインドしていますか?そしてどうやって?

あなたは分離コードでそれに結合していると、あなたのデータソースは、日付時刻のリストである場合:あなたは、より正確な助けが必要な場合

List<DateTime> dtList; //list with datetimes 
dtList.Where(a => DateTime.Now.Subtract(a) > TimeSpan.FromDays(1)); 
//More than 1 day ago 

はあなたのコードのより多くの情報とコードスニペットを提供します。

EDIT 1:

あなたは日時プロパティでカスタムタイプを使用している場合:しかし

List<CustomObject> objList; //list with Custom objects 
objList.Where(a => DateTime.Now.Subtract(a.dateTimePropertyName) > TimeSpan.FromDays(1)) 
.Where(a => a.otherPropertyName == "ExampleValue"); 

DateGridViewName.DataContext = objList; 
+0

ありがとうございますが、バインドされたDataTableでBindingSource "Filter"プロパティの文字列ベースのフィルタクエリを検索しています。 – speedone

0

これは、静的なデータに対して動作します...

DataTable filtered = dt.AsEnumerable().Where(
    x => x.Field<DateTime>("field1") < DateTime.Today.AddDays(x.Field<int>("field2"))). 
    CopyToDataTable(); 

bindingSource1.DataSource = filtered; 

、もしがDataTableでそれを行う方法である間に、私はあなたが望むもの(データバインディング)を理解しています。代わりにドメインオブジェクトの仕事のように思えます。ドメインオブジェクトにデータをロード

class BoundDataObject 
{ 
    public DateTime Field1 { get; set; } 
    public short Field2 { get; set; } 
    public bool PassFail 
    { 
     get { return Field1 < DateTime.Now.AddDays(Field2); } 
    } 
} 

は、データテーブルよりも少し多くの努力かもしれないが、それは一回限りのコストだ、と私はあなたがかなり迅速にメリットを享受すると思います。

関連する問題