5

我正在使用剑道网格,其中我添加了一个用于显示日期和时间的列,并且我使用剑道网格日期过滤器来过滤日期时间。但我面临的问题是我无法通过从 filter 中选择 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 时它不起作用。

例如:如果我的剑道网格列中显示了这个日期时间“12/21/2013 07:15:45”,并且当我将此日期时间复制到过滤器下的 isequalto 选项时,它不会提供任何数据。

如果有人可以帮助我解决我的问题,我将不胜感激。提前致谢。


我附上了示例项目的链接,以清楚地阐明我的上述问题。我在网格中添加了一个日期时间列,但是当我尝试过滤网格中显示的日期时间(即通过将其复制到过滤器)时,它在重新加载后显示空网格。

您可以在此处找到示例项目

我还在下面附上了一张图片,我在其中添加了对我的问题的描述。你可以在这里找到图片链接 请帮助我解决我的问题。

4

1 回答 1

0

我知道我迟到了这个答案,但它仍然可能对某人有所帮助。

我猜您正在经历这种情况,因为您的服务器端DateTime值也包含小数秒数据,并且等号运算符在比较时不会忽略它们。我发现提出服务器端解决方案比编写各种肮脏的 JS 变通办法更容易。

这个想法是,每当您在DataSourceRequest对象中找到将过滤DateTime属性的过滤器时,您手动将其替换为 a 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,因为如果您选择 Is later than 等,默认行为也将正常工作。
  • 此方法不关心任何 present CompositeFilterDescriptor,因为表达式dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00无论如何都没有意义。
  • 可以为DateTimeOffset价值观做类似的事情。
于 2016-11-21T10:28:15.337 回答