Как выбрать строку в kendoGrid, значение столбца time которой ближе всего к текущему времени (не дате)?

#javascript #jquery #kendo-ui #kendo-grid #kendo-asp.net-mvc

#javascript #jquery #kendo-ui #kendo-grid #kendo-asp.net-mvc

Вопрос:

У меня есть сетка Kendo, в которой в одном столбце указано время встречи. При загрузке сетки я хочу выбрать строку, время которой наиболее близко к текущему времени.

Например, сетка Kendo состоит из четырех строк, и каждая строка имеет следующее значение в столбце Время встречи: 09:30, 10:30, 11:30, 12:30

и текущее время — 11:00 утра. Теперь при загрузке страницы должна быть выбрана строка, время которой равно 11:30 утра.

Если мы загрузим сетку в 12:00, то должна быть выбрана строка с 12:30.

И если мы загрузим сетку после 12:30, то должна быть выбрана последняя строка сетки, поскольку она будет ближе всего к текущему времени:

Мой текущий код для выбора строки выглядит следующим образом:

Идентификатор сетки Kendo: dgListView

Столбец Kendo

 {
        field: "ApptTime",
        hidden: true,
        template: function (dataItem) {
            return kendo.toString(dataItem.ApptTime, "hh:mm tt")
        },
        attributes: {
            ApptTime: "ApptTime"
        }
    }
  

Функция в привязке к данным

 function SetGridRowSelected(e) {
var objGrid = jQuery_1_9_1('#dgListView');
var row;
var currentDate = new Date();

var time = currentDate.toLocaleTimeString();

var data = objGrid.data("kendoGrid");

row = data.tbody.find(">tr:not(.k-grouping-row)").filter(function (i) {
    return (this.cells[18].innerHTML >= time); //18th column in Grid has appointment time
});

if (objGrid amp;amp; row.length) {
    data.select(row);
    row.click();
    row.addClass('k-state-selected');
}

var scrollContentOffset = grid.find("tbody").offset().top;
var selectContentOffset = data.select().offset().top;
var distance = selectContentOffset - scrollContentOffset;
grid.find(".k-grid-content").animate({
    scrollTop: distance
}, 500);
}
  

Я сравниваю 18-й столбец (в нем указано время встречи) с текущим временем и пытаюсь выбрать строку, которая ближе всего к нему, но сравнение не происходит, и оно не выдает никаких ошибок.

Комментарии:

1. Можете ли вы добавить некоторые подробности о том, что работает или не работает в опубликованном вами коде, что вы пробовали и т. Д.?

2. Я сравниваю 18-й столбец (в нем указано время встречи) с текущим временем и пытаюсь выбрать строку, которая ближе всего к нему, но сравнение не происходит, и оно выдает ошибку.

3. Какая строка выдает ошибку и в чем ошибка?

4. извините, он не выдает никаких ошибок, но и не выбирает никаких строк.

5. Я предлагаю ввести строку отладчика и использовать инструменты разработчика вашего браузера, чтобы пройти и посмотреть, что происходит. работает ли ваш селектор фильтра и возвращается ли строка или нет? Если выполняется строка сравнения innerHTML и time, каковы значения каждого из них?

Ответ №1:

Смотрите весь пример в этом Dojo

Время в течение дня может быть вычислено с использованием модуля времени эпохи миллисекунд в дневной математике

 date.getTime() % 86400000
  

При просмотре страницы текущее время постоянно меняется, поэтому вам нужно будет, возможно, изменить, какая строка должна быть выбрана

         setInterval(function() {
          // note: nowModel is an observable bound to a displayed element
          nowModel.set('now', new Date());
          select_row_next_closest_by_time();
        }, 1000);  
  

Для выбора следующего (прямого времени), ближайшего к текущему времени, требуется поиск по данным представления сетки.

         var seluid;
        function select_row_next_closest_by_time() {
          var grid = $("#grid").data("kendoGrid");
          var v = grid.dataSource.view();
          var msn = nowModel.get('now').getTime() % 86400000;
          
          var minuid="", mindiff = Number.MAX_SAFE_INTEGER;
          // scan the view data to find next nearest time point
          for (var index=0; index < v.length; index  ) {
             var ms = v[index].get('Date').getTime() % 86400000;
             var diff = ms - msn;
             if (diff < 0) diff  = 86400000;  // for wrap around
             if (diff < mindiff) {
               mindiff = diff;                // first next closest in time
               minuid = v[index].uid;
             }
          }

          if (seluid != minuid) {
            // change selection
            if (seluid) { 
              grid.tbody.find('tr[data-uid="' seluid '"]').removeClass('k-state-selected');
            }
            grid.select(grid.tbody.find('tr[data-uid="' minuid '"]'));
            seluid = minuid;
          }
        }
      });
  

Альтернативный способ

Перейдите сюда, например, Dojo

Предполагая, что данные таблицы предварительно отсортированы по дате, и все строки в сетке относятся к одному и тому же дню, используйте .find() .indexOf() методы и, чтобы определить, какая строка должна быть выбрана. Конечно, методы используют цикл за сценой.

         var view = $("#grid").data("kendoGrid").dataSource.view();

        nowt = (new Date()).getTime() % 86400000; 
        
        var
          pick = view.find(row => (row.Date.getTime() % 86400000) >= nowt),
          pickIndex = (pick === undefined) ? view.length-1 : view.indexOf(pick)
        ;
        
        $("#grid").data("kendoGrid").select("tr:eq(" pickIndex ")");
  

Комментарии:

1. Привет, Ричард! Ваш ответ подходит и идеально подходит для времени обновления. В моем случае мне нужно учитывать только время при загрузке страницы, после этого мне не нужно обновлять сетку, если пользователь остается на странице достаточно долго, чтобы пересечь время в следующей строке. Следующая строка будет выбрана только при следующей загрузке страницы. Возможно ли достичь этого без цикла for, где мне не нужно перебирать все строки сетки. Без логики цикла for будет похоже на игнорирование строк, имеющих меньше времени, чем сейчас, и выбор следующей первой строки, поскольку сетка сортируется по возрастанию времени.

2. Спасибо за ваш ответ. У меня это работает. Я все еще ищу, смогу ли я заставить его работать без цикла for .

3. Как доставляется страница (что такое хост-сервер)? Как данные загружаются на страницу? Не уверен, зачем вам тратить энергию на поиск «не для цикла».

4. Это ASP. Чистая веб-страница, и данные загружаются при загрузке веб-страницы из базы данных. Я ищу решение, не связанное с циклом, потому что сетка Kendo, которую я загружаю на страницу, является прокручиваемой сеткой, не отображаемой на странице, что означает, что все строки из базы данных будут загружены в сетку одновременно. Если есть тысячи строк, ему придется перебирать все строки. Ваш ответ в значительной степени решил мою проблему, так что спасибо за это. Не могли бы вы обновить ответ, если текущее время больше времени во всех строках сетки, тогда должна быть выбрана последняя строка сетки.

5. .Net может доставить страницу с предварительно выбранной строкой, если вы добавите k-state-selected в строку, которая должна быть выбрана. Несмотря на это, в ответе теперь также отображается упрощенный выбор строки