gpt4 book ai didi

kendo-grid - Kendo 日期时间过滤器在网格中不起作用

转载 作者:行者123 更新时间:2023-12-02 14:50:22 34 4
gpt4 key购买 nike

我正在使用 Kendo Grid,其中添加了一列用于显示日期和时间,并且我使用 Kendo 网格日期过滤器来过滤日期时间。但我面临的问题是我无法通过从 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 选项时,它不会提供任何数据。

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

<小时/>

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

您可以找到示例项目Here

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

最佳答案

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

我猜您遇到这种情况是因为您的服务器端 DateTime值也包含小数秒数据,并且等于运算符在比较时不会忽略它们。我发现更容易提出服务器端解决方案,而不是编写各种肮脏的 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 时,此方法才会执行任何操作。 ,因为如果您选择“晚于”或类似选项,则默认行为同样有效。
  • 此方法不关心任何当前的 CompositeFilterDescriptor s 因为表达式 dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00无论如何都没有意义。
  • 可以对 DateTimeOffset 执行类似的操作值(value)观。

关于kendo-grid - Kendo 日期时间过滤器在网格中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20762486/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com