剑道网格中的日期时间过滤器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑道网格中的日期时间过滤器相关的知识,希望对你有一定的参考价值。
我的代码在C#.NET中我正在使用Kendo Grid版本2013.2.716.340和服务器绑定来显示网格中的数据。
在Kendo UI Grid中,我有一个dateTime
列,但列过滤器输入只有一个日期选择器但没有时间选择器。因此,如果我选择IsEqualTo
选项并给出日期,那么我得到零结果,因为时间在过滤器中设置为00:00:00
但列有一些时间值。我想添加时间选择器和日期选择器。
我尝试在我的专栏上执行此操作,但它不起作用:
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>
当我从datetime
中选择精确的datetimepicker
时上面的代码有效,但是当我选择isequalto
时它不起作用。例如:如果我在我的剑道网格列中显示此datetime
“12/21/2013 07:15:45”,并且当我将此datetime
复制到过滤器下的isequalto
选项时,它不会提供任何数据。
此外,我尝试了这个link提供的示例它也没有在我的情况下工作。此链接上的示例使用Ajax绑定。我需要在服务器绑定的情况下应用它。
这是附加图像,显示我想要应用的内容。 Here是图像的链接。如果我将网格中显示的datetime
复制到过滤器它应该正确过滤并给出结果。
如果有人能帮助我解决我的问题,我将非常感激。提前致谢。
根据我的经验,kendoDateTimePicker非常挑剔;如果过滤器的格式无法指定列数据的日期时间精度,则无法找到它。
在您的情况下,您的列格式是"MM/dd/yyyy HH:mm:ss"
(秒)。 kendoDateTimePicker的默认格式是"MM/dd/yyyy h:mm tt"
(没有秒和小时规格不匹配)。由于您初始化了一个默认的kendoDateTimePicker,无论您在拾取器中放置什么,您都无法过滤到IS EQUAL TO
列值的日期,因为您无法输入它的秒数。
确保其有效的最简单方法是对列和kendoDateTimePicker使用相同的格式。用这个替换你的DateTimeFilter
功能:
function DateTimeFilter(control)
{
$(control).kendoDateTimePicker({
format: "MM/dd/yyyy HH:mm:ss",
timeFormat: "HH:mm:ss"
});
}
关于kendoDateTimePicker:
format
定义控件的输入值格式timeFormat
定义了时间选择器的时间格式interval
(上面没有使用它),但它指定了时间选择器的每个选项之间的时间间隔(以分钟为单位)。
我没有使用asp.net mvc,所以我不能100%确定这是否能解决你的问题。但是我确信它至少会清除你的一些过滤问题。如果你愿意的话,我可以为纯粹的html / javascript示例提供一个jsfiddle。
我知道我迟到了这个答案,但它可能仍然有助于某人。
当我从datetimepicker中选择确切的日期时间时,上面的代码有效,但是当我选择isequalto时它不起作用。例如:如果我在我的kendo网格列中显示此日期时间“12/21/2013 07:15:45”,并且当我将此日期时间复制到过滤器下的isequalto选项时,它不会提供任何数据。
我猜你正在经历这个,因为你的服务器端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
,此方法将只执行任何操作,因为如果您选择Is晚于或等,则默认行为也将起作用。 - 这种方法并不关心任何现有的qazxsw pois因为表达式qazxsw poi无论如何都没有意义。
- 类似的事情可以为
CompositeFilterDescriptor
价值观做。
对dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00
的增强,这假设您使用的是DateTimeOffset
的简单日期部分,并且根本不关心时间部分。处理使用其他不相关的过滤器进行过滤也是递归的。
Balázs' answer
以上是关于剑道网格中的日期时间过滤器的主要内容,如果未能解决你的问题,请参考以下文章