Фильтрация Telerik MVC Grid только по дате (игнорирование значений времени) - PullRequest
1 голос
/ 02 сентября 2011

У меня есть столбец в Telerik MVC Grid, который имеет тип DateTime. Я хочу использовать только часть даты для отображения и фильтрации. В результате я использовал следующий код

@(Html.Telerik().Grid<State>()
      .Name("tlkStateGrid")
      .Columns(col => {
          col.Bound(m => m.CreatedOn).Title("Created On").Format("{0:dd/MM/yyyy}");

Сетка отображает дату (CreatedOn) в указанном формате. Однако фильтрация не работает должным образом. Я думаю, что при фильтрации значения времени тоже учитываются сеткой. Поэтому, если две даты одинаковы, но имеют разные значения времени, они не считаются «равными». Как настроить сетку таким образом, чтобы при фильтрации игнорировались значения времени и сравнивались только даты.

Примечание. Я опубликовал аналогичный вопрос на форумах Telerik MVC, но пока не получил ответа.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Вы можете изменить лямбда-выражение, чтобы явно изменить свойство CreatedOn, чтобы оно было просто датой.Вы получите только компонент date объекта datetime.

col.Bound(m => m.CreatedOn.Date)

Теперь ваш новый код будет выглядеть так.получить доступ к свойству Value до получения компонента Date.Смотри ниже.

col.Bound(m => m.CreatedOn.HasValue? m.CreatedOn.Value.Date : m.CreatedOn)
1 голос
/ 27 ноября 2012

Я создал следующий код, который меняет способ определения фильтра даты:

/// <summary>
/// Maps DateTime related filters.
/// * IsEqualTo filter is converted to ('x-date' is GreaterThanOrEqualTo 'SearchDate') AND ('x-date' is LessThan 'SearchDate' + 1 Day)
/// * IsNotEqualTo filter is converted to ('x-date' LessThan 'SearchDate') OR ('x-date' is GreaterThan 'SearchDate' + 1 Day) OR ('x-date' is NULL)
/// * IsLessThanOrEqualTo filter is converted to ('x-date' is LessThan 'SearchDate' + 1 Day)
/// </summary>
/// <param name="copyOfOriginalFilters">A copy from the filters.</param>
/// <param name="newFilters">The new filters</param>
protected void MapDateFilter(ReadOnlyCollection<IFilterDescriptor> copyOfOriginalFilters, IList<IFilterDescriptor> newFilters)
{
    newFilters.Clear();

    foreach (var currentFilter in copyOfOriginalFilters)
    {
        Type t = currentFilter.GetType();

        if (t == typeof(FilterDescriptor))
        {
            var filter = currentFilter as FilterDescriptor;

            if (filter.ConvertedValue.GetType() == typeof(DateTime))
            {
                DateTime datePart = ((DateTime)filter.ConvertedValue).Date;

                if (filter.Operator == FilterOperator.IsEqualTo)
                {
                    var compositeFilter = new CompositeFilterDescriptor();
                    compositeFilter.FilterDescriptors.Add(new FilterDescriptor(filter.Member, FilterOperator.IsGreaterThanOrEqualTo, datePart));
                    compositeFilter.FilterDescriptors.Add(new FilterDescriptor(filter.Member, FilterOperator.IsLessThan, datePart.AddDays(1)));
                    compositeFilter.LogicalOperator = FilterCompositionLogicalOperator.And;

                    newFilters.Add(compositeFilter);
                }
                else if (filter.Operator == FilterOperator.IsNotEqualTo)
                {
                    var compositeFilter = new CompositeFilterDescriptor();
                    compositeFilter.FilterDescriptors.Add(new FilterDescriptor(filter.Member, FilterOperator.IsLessThan, datePart));
                    compositeFilter.FilterDescriptors.Add(new FilterDescriptor(filter.Member, FilterOperator.IsGreaterThan, datePart.AddDays(1)));
                    compositeFilter.FilterDescriptors.Add(new FilterDescriptor(filter.Member, FilterOperator.IsEqualTo, null));
                    compositeFilter.LogicalOperator = FilterCompositionLogicalOperator.Or;

                    newFilters.Add(compositeFilter);
                }
                else if (filter.Operator == FilterOperator.IsLessThanOrEqualTo)
                {
                    newFilters.Add(new FilterDescriptor(filter.Member, FilterOperator.IsLessThan, datePart.AddDays(1)));
                }
                else
                {
                    newFilters.Add(filter);
                }
            }
            else
            {
                newFilters.Add(filter);
            }
        }
        else if (t == typeof(CompositeFilterDescriptor))
        {
            var filter = currentFilter as CompositeFilterDescriptor;

            int numberOfDateFilters = filter.FilterDescriptors.Where(fd =>
                fd is FilterDescriptor &&
                (fd as FilterDescriptor).ConvertedValue != null &&
                (fd as FilterDescriptor).ConvertedValue.GetType() == typeof(DateTime))
                .Count();

            if (numberOfDateFilters == 2)
            {
                var firstFilter = filter.FilterDescriptors[0] as FilterDescriptor;
                firstFilter.Value = ((DateTime)firstFilter.ConvertedValue).Date;

                var secondFilter = filter.FilterDescriptors[1] as FilterDescriptor;
                secondFilter.Value = ((DateTime)secondFilter.ConvertedValue).Date;
            }
            else
            {
                MapDateFilter(new List<IFilterDescriptor>(filter.FilterDescriptors).AsReadOnly(), filter.FilterDescriptors);
            }

            newFilters.Add(filter);
        }
    }
}

Это можно использовать как:

protected void MapGridCommand(GridCommand command)
{
    this.MapDateFilter(new List<IFilterDescriptor>(command.FilterDescriptors).AsReadOnly(), command.FilterDescriptors);
}
...