Как вы получаете доступ к отфильтрованным и отсортированным данным с помощью Kendo UI Grid?

У меня есть сетка Кендо, которую можно сортировать и фильтровать. Когда я экспортирую, я хочу экспортировать все данные, которые в данный момент доступны для просмотра, а не только текущую страницу.

$("#grid").data("kendoGrid").dataSource -> кажется исходным списком несортированных и нефильтрованных элементов. В инструментах разработчика Chrome _data и _pristine кажутся одинаковыми.

Также есть dataSource.view, но это только 10 элементов, видимых на текущей странице.

Есть ли способ получить доступ к отсортированному списку и/или отфильтрованному списку?

обновление: я нашел этот ответ на форумах кендо и посмотрю, поможет ли он. http://www.kendoui.com/forums/framework/data-source/get-filtered-data-from-paged-grid.aspx


person Jason Horsley    schedule 19.02.2013    source источник
comment
Я выполнил те же требования для экспорта отфильтрованных данных в формате csv, если вам удалось получить отфильтрованные и отсортированные данные из сетки, пожалуйста, поделитесь с нами, спасибо   -  person 牛さん    schedule 26.09.2013
comment
Как ни странно, в моей системе $(#grid).data(kendoGrid).dataSource содержит только записи текущей страницы. Моя конфигурация MVC, и данные извлекаются с сервера. Я подозреваю, что это источник разницы.   -  person Dror    schedule 13.02.2014


Ответы (3)


Вот как вы получаете доступ к отфильтрованным данным:

 var dataSource = $("#grid").data("kendoGrid").dataSource;
        var filteredDataSource = new kendo.data.DataSource({
            data: dataSource.data(),
            filter: dataSource.filter()
        });

        filteredDataSource.read();
        var data = filteredDataSource.view();

И затем вы можете прокручивать данные:

 for (var i = 0; i < data.length; i++) {
            result += "<tr>";

            result += "<td>";
            result += data[i].SiteId;
            result += "</td>";

            result += "<td>";
            result += data[i].SiteName;
            result += "</td>";

            result += "</tr>";
  }
person Rick S    schedule 17.01.2014
comment
Я попробовал ваше решение, и оно не работает для меня. DataSource содержит только те записи, которые отображаются на текущей странице. То есть, если у меня отображается 480 записей на 48 страницах по 10 на каждой, я получаю только те 10 записей, которые отображаются на текущей странице. - person Dror; 13.02.2014
comment
Не могли бы вы опубликовать код, чтобы показать инициализацию вашей сетки. - person Rick S; 16.02.2014
comment
Вы также можете использовать это для события filter, добавленного во время инициализации сетки (оно передает фильтры в качестве аргумента в функцию). Но вместо использования filter: dataSource.filter() вы должны использовать filter: arg.filter, чтобы установить его на выбранные в данный момент фильтры. - person Larcho; 03.12.2020

Большинство ответов применимы к сетке кендо, если просто посмотреть на локальные данные в памяти. Если вы используете удаленные данные (например, ваша сетка привязана к источнику ODATA) — вам нужно будет перебрать все страницы, чтобы получить отфильтрованные данные.

Однако сделать это оказалось не так просто, как я думал.

Я придумал следующее:

      var filteredRows = [];

      function getResults() {

        var dataSource = $("#grid").data("kendoGrid").dataSource;
        var filters = dataSource.filter();
        var allData = dataSource.data();
        var query = new kendo.data.Query(allData);
        var data = query.filter(filters).data;            

        var totalRowCount = parseInt(dataSource.total().toString());
        var totalPages = Math.ceil(totalRowCount / dataSource.pageSize());

        PageTraverser(dataSource, 1, totalPages, filters, function () {
                        $('#pResults').text('Got ' + filteredRows.length + ' rows of filtered data.');              
        });            
      }

      function PageTraverser(dataSource, targetPage, totalPages, filters, completionFunction) {

        dataSource.query({
          page: targetPage,
          pageSize: 20,
          filter: filters
        }).then(function () {
          var view = dataSource.view();
          for (var viewItemId = 0; viewItemId < view.length; viewItemId++) {
            var viewItem = view[viewItemId];
            filteredRows.push(viewItem);
          }
          targetPage++;
          if (targetPage <= totalPages) {
            PageTraverser(dataSource, targetPage, totalPages, filters, completionFunction);
          } else {
            completionFunction();
          }
        });
      }   

Рабочий пример здесь: http://dojo.telerik.com/@JBoman32768/Ucudi

person James Boman    schedule 17.03.2015

Вот как мы это делаем в настоящее время, хотя есть несколько вариантов:

var myData = new kendo.data.Query(dataSource.data()).filter(dataSource.filter()).data;

Вы просто вызываете новый запрос и применяете текущий фильтр, примененный к сетке, который возвращает те же результаты, что и сетка.

person Steffan Perry    schedule 18.11.2016
comment
Создай. Спасибо! - person Siege21x; 04.04.2019
comment
Кажется, это возвращает те же данные, что и сетка. Например, у меня 300 строк, и они показаны на 10 страницах. Когда я создаю новый myData, используя ваш пример, я могу добраться только до первых 10 строк данных. Проблема в том, что мне нужно иметь возможность добраться до всех строк с текущим фильтром. - person FoxDeploy; 09.07.2019