剑道网格中的日期时间过滤器

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

以上是关于剑道网格中的日期时间过滤器的主要内容,如果未能解决你的问题,请参考以下文章

剑道 - 通过页面上的代码保存网格过滤器仅存在日期过滤器网格列的问题

剑道列过滤器内的角度材料日期选择器问题

剑道网格值中的剑道日期时间选择器未进入控制器

KendoUI 网格过滤器日期格式

日期列中的剑道网格格式时间问题[重复]

剑道网格中的 JavaScript 日期