剑道网格中的日期时间filter

我的代码在C#.NET中我使用Kendo Grid版本2013.2.716.340和服务器绑定来显示网格中的数据。

在Kendo UI Grid中,我有一个dateTime列,但列filter输入只有一个日期选择器但没有时间选择器。 因此,如果我选择IsEqualTo选项并给出日期,那么我得到零结果,因为filter中的时间设置为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%"); 

并在下面的脚本中应用:

  function DateTimeFilter(control) { $(control).kendoDateTimePicker(); }  

当我从datetimepicker选择确切的datetime时间时,上面的代码有效,但是当我选择isequalto时它不起作用。 例如:如果我在我的kendo网格列中显示此datetime “12/21/2013 07:15:45”,并且当我将此datetime时间复制到filter下的isequalto选项时,它不会提供任何数据。

此外,我尝试了此链接提供的示例它也没有在我的情况下工作。 此链接上的示例使用Ajax绑定。 我需要在服务器绑定的情况下应用它。

这是附加图像,显示我想要应用的内容。 这是图像的链接。 如果我将网格中显示的datetime复制到filter它应该正确过滤并给出结果。

如果有人能帮助我解决我的问题,我将非常感激。 提前致谢。

根据我的经验,kendoDateTimePicker非常挑剔; 如果filter的格式无法指定列数据的日期时间精度,则无法找到它。

在您的情况下,您的列格式为"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”,并且当我将此日期时间复制到filter下的isequalto选项时,它不会提供任何数据。

我猜您遇到了这种情况,因为您的服务器端DateTime值也包含小数秒数据,并且equals运算符在比较时不会忽略它们。 我发现更容易想出一个服务器端解决方案,而不是编写所有类型的脏JS工作区。

我们的想法是,每当您在DataSourceRequest对象中找到一个过滤DateTime属性的filter时,您手动将其替换为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截断器扩展基于此答案 。
  • 如果运算符是equals ,则此方法将只执行任何操作,因为如果选择“晚于”或类似,则默认行为也将起作用。
  • 这个方法并不关心任何现有的CompositeFilterDescriptor因为表达式dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00无论如何都没有意义。
  • 可以对DateTimeOffset值执行类似的操作。