使用Kendo UI Grid,您如何访问过滤和排序的数据?

时间:2013-02-19 20:17:47

标签: kendo-ui kendo-grid

我有一个可排序和可过滤的Kendo网格。当我导出时,我想导出当前可查看但不仅仅是当前页面的所有数据。

$("#grid").data("kendoGrid").dataSource - >似乎是未分类和未过滤的原始项目列表。在Chrome开发者工具中,_data_pristine似乎是相同的。

还有dataSource.view,但它只是当前页面上可见的10个项目。

有没有办法访问已排序的列表和/或已过滤的列表?

更新: 我在Kendo论坛上找到了这个答案,看看它是否有帮助。 http://www.kendoui.com/forums/framework/data-source/get-filtered-data-from-paged-grid.aspx

3 个答案:

答案 0 :(得分:4)

以下是访问过滤数据的方法:

 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>";
  }

答案 1 :(得分:2)

当只看内存中的本地数据时,大多数答案都适用于Kendo Grid。如果您正在使用远程数据(例如,您的网格绑定到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

答案 2 :(得分:1)

以下是我们目前的做法,尽管有多种选择:

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

您只需调用一个新查询并应用网格已应用的当前过滤器,这将返回与网格完全相同的结果。