我正在使用Kendo Grid,其中我添加了一个用于显示日期和时间的列,我使用了kendo网格日期过滤器来过滤日期时间。但我面临的问题是我无法通过从过滤器中选择isequalto选项来过滤日期时间。
我尝试在我的专栏上执行此操作,但它不起作用:
columns.Bound(o => o.Time).Title("Time").Format("{0:MM/dd/yyyy HH:mm:ss}").Filterable(f => f.UI("DateTimeFilter")).Width("5%");
已应用以下脚本:
<script type="text/javascript">
function DateTimeFilter(control)
{
$(control).kendoDateTimePicker();
}
</script>
当我从datetimepicker中选择确切的日期时间时,上面的代码有效,但是当我选择isequalto时它不起作用。
例如:如果我的kendo网格列中显示此日期时间“12/21/2013 07:15:45”,并且当我将此日期时间复制到过滤器下的isequalto选项时,它不会提供任何数据。
如果有人能帮助我解决我的问题,我将感激不尽。提前谢谢。
我附上了示例项目的链接,以清楚地澄清我的上述问题。因为我在网格中添加了一个datetime列,但是当我尝试过滤网格中显示的日期时间(即通过将其复制到过滤器)时,它会在重新加载后显示空网格。
您可以找到示例项目Here
我还在下面添加了一张图片,其中添加了我的问题说明。 你可以找到图片here的链接 请帮我解决我的问题。
答案 0 :(得分:0)
我知道我对这个答案迟到了,但它可能仍然对某人有帮助。
我猜您遇到了这种情况,因为您的服务器端DateTime
值也包含小数秒数据,并且equals运算符在比较时不会忽略它们。我发现更容易想出一个服务器端解决方案而不是编写各种脏的JS解决方法。
我们的想法是,只要您在DataSourceRequest
对象中找到可以过滤DateTime
属性的过滤器,就可以手动将其替换为CompositeFilterDescriptor
,将值截断为所需的精度,将其设置为下限,然后添加一个所需精度的单位(秒,分钟,小时等)并将其设置为上限。
代码如下:
public static class KendoHelpers
{
public enum DateTimePrecision
{
Seconds = 1,
Minutes = 2,
Hours = 4
}
public static DataSourceRequest NormalizeDateFilters(this DataSourceRequest request, DateTimePrecision precision)
{
// TODO: Add parameter validation.
for (int i = 0; i < request.Filters.Count; ++i)
{
FilterDescriptor filter = request.Filters[i] as FilterDescriptor;
if (filter != null && filter.ConvertedValue is DateTime && filter.Operator == FilterOperator.IsEqualTo)
{
DateTime val = (DateTime)filter.ConvertedValue;
CompositeFilterDescriptor newFilter = new CompositeFilterDescriptor
{
LogicalOperator = FilterCompositionLogicalOperator.And
};
DateTime lowerBound;
DateTime upperBound;
if (precision == DateTimePrecision.Seconds)
{
lowerBound = val.TruncateToWholeSeconds();
upperBound = lowerBound.AddSeconds(1);
}
else if (precision == DateTimePrecision.Minutes)
{
lowerBound = val.TruncateToWholeMinutes();
upperBound = lowerBound.AddMinutes(1);
}
else if (precision == DateTimePrecision.Hours)
{
lowerBound = val.TruncateToWholeHours();
upperBound = lowerBound.AddHours(1);
}
else
{
// If someone would be stupid enough to supply Hours | Minutes
throw new ArgumentException("Not supported precision. Only Second, Minute, Hour values are supported.", "precision");
}
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filter.Member,
MemberType = filter.MemberType,
Operator = FilterOperator.IsGreaterThanOrEqualTo,
Value = lowerBound
});
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filter.Member,
MemberType = filter.MemberType,
Operator = FilterOperator.IsLessThan,
Value = upperBound
});
request.Filters[i] = newFilter;
}
}
return request;
}
}
说明:
DateTime
截断扩展程序基于this answer。equals
,此方法将只执行任何操作,因为如果您选择“晚于”或类似,则默认行为也将起作用。CompositeFilterDescriptor
,因为表达式dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00
无论如何都没有意义。DateTimeOffset
值进行类似的操作。