c#bindingsource过滤日期时间早于x天

时间:2017-11-03 08:13:49

标签: c# sql datagridview filter bindingsource

我正在寻找一种解决方案,通过比x天更早的日期时间字段1过滤数据网格视图,其中x是同一行中类型为short的另一个字段2。在sql中,可能的语法是:

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

但我必须使用BindingSource的“过滤器”属性 DataGridView绑定到BindingSource,源绑定到从SQL数据库填充的DataTable

2 个答案:

答案 0 :(得分:0)

你绑定到DataGridView是什么?怎么样?

如果您在代码隐藏中绑定它并且您的DataSource是DateTimes列表:

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

如果您需要更准确的帮助,请提供代码的更多信息和代码段。

编辑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;

答案 1 :(得分: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); }
    }
}

将数据加载到域对象可能比数据表稍微多一些,但这只是一次性成本,我认为你会很快获得好处。