当前位置: 首页 > 知识库问答 >
问题:

Kendo DateTime过滤器在网格中不工作

海灵均
2023-03-14

我使用剑道网格,其中我添加了一个列来显示日期和时间,我使用剑道网格日期过滤器来过滤日期时间。但是我面临的问题是,我不能通过从筛选器中选择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选择exact datetime时,上面的代码起作用,但当我选择isequalto时,它不起作用。

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

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

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

您可以在这里找到示例项目

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

共有1个答案

慕容恩
2023-03-14

我知道我回答得晚了,但这仍然可能对某人有所帮助。

我猜您会遇到这种情况,因为您的服务器端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;
    }
}

备注:

  • DateTimetruncater扩展基于此答案。
  • 只有当运算符为等于时,此方法才会执行任何操作,因为如果您选择比或类似的时间晚,默认行为也会正常工作。
  • 此方法不关心任何当前的CompositeFilterdescription ptor,因为表达式dateToSearch=2016-11-21 11:22:00AND dateToSearch=2016-11-21 11:59:00没有任何意义。
  • 类似的事情可以做DateTimeOffset值。
 类似资料:
  • 当我尝试使用时,我得到一个异常。下面是堆栈跟踪: 编辑二:

  • 在过去的三天里,我一直在与错误“跨源请求被阻止:相同的源策略不允许读取http://localhost:8080/demomongo/templateapp/login上的远程资源。”(原因:缺少CORS头'Access-Control-Allow-Origin')。

  • Vaadin 8刚出来。在Grid中添加过滤器从来没有出现在他们的文档中,我只在stackoverflow中找到了一个可行的解决方案。 但是现在自从更新之后,这个解决方案就不再工作了,因为SimpleStringFilter在新的网格中不再可用,并且BeanItemContainer不再被识别,只允许setItems()填充网格数据。 谁能帮我更新瓦丁8的代码?

  • 我试图调试我的应用程序,但调试器没有击中此代码块。这是我的自定义网关过滤器。 下面是这个过滤器的配置 当尝试发送请求时,此endpoint不会启动调试器或将日志打印到控制台。我在这里错过了什么。谢谢你。 如果我在主应用程序中创建AuthorizationHeaderFilter的bean,如下所示 应用程序在启动时引发此错误 我还为云api网关设置了日志级别来调试,下面是日志

  • 我使用此解决方案来过滤我的。使用该解决方案,我能够在键入时获得结果。但是当我清除搜索小部件时,我没有得到完整的列表,而是得到了空的。 这就是我的结果。https://imgur.com/nwyetEd 这是我的 这是我的 这是我使用过滤器的< code >活动 有人能帮助我吗?