2014-01-02 3 views
6

Мой код находится на C# .NET Я использую Kendo Grid версии 2013.2.716.340 и привязку сервера для отображения данных в сетке.Фильтр Datetime в сетке кендо

В сетке пользовательских интерфейсов Kendo у меня есть столбец 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, показанный в сетке на фильтр, он должен правильно фильтровать и давать результат.

Буду очень благодарен, если кто-нибудь может помочь мне решить мою проблему. Заранее спасибо.

ответ

6

Из моего опыта, kendoDateTimePicker действительно придирчив; если в формате фильтра не может быть указана точность данных в столбце datetime, он не найдет его.

В вашем случае формат вашей колонки "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%, если это решает вашу проблему. Однако я уверен, что он устранит хотя бы некоторые проблемы фильтрации, которые у вас есть. Я могу предоставить jsfiddle для чисто html/javascript образца, если вы хотите.

+0

Большое спасибо. Он решил мою проблему в случае столбца даты и даты, но у меня все еще есть проблема, если у меня есть столбец времени в сетке кендо. – kumawatp

1

Я знаю, что опоздал с этим ответом, но он все равно может помочь кому-то.

Приведенный выше код работает, когда я выбираю точное время datetime из datetimepicker, но он не работает, когда я выбираю isequalto. Например: если у меня есть это datetime «12/21/2013 07:15:45», отображаемое в моем столбце сетки kendo, и когда я копирую это время datetime в isequalto в параметре под фильтром, он не дает никаких данных.

Я предполагаю, что вы испытываете это, потому что ваш серверный 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 truncater основано на this answer.
  • Этот метод будет делать только что-либо, если оператор equals, потому что, если вы выберете «Далее» позже или тому подобное, поведение по умолчанию будет работать так же хорошо.
  • Этот метод не имеет никакого отношения к какому-либо подарку CompositeFilterDescriptor s becasue выражение dateToSearch = 2016-11-21 11:22:00 AND dateToSearch = 2016-11-21 11:59:00 не имеет никакого смысла в любом случае.
  • Аналогичные вещи можно сделать для значений DateTimeOffset.
Смежные вопросы