【问题标题】:Get all rows not filtered from jqGrid获取所有未从 jqGrid 过滤的行
【发布时间】:2012-04-04 05:31:34
【问题描述】:

我在网格中有本地数据。如何获取用户使用过滤器工具栏后未删除的所有行或 ID?无论分页如何,我都需要获取所有过滤的行。

例如,假设我从网格中的 50 行开始。用户使用过滤器工具栏,行集减少到 10 行。我怎样才能得到那十行?

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    你可以使用搜索工具栏的 afterSearch 选项:

    var filteredIDs = new Array(); //Global variable
    
    $("#"+gridId).jqGrid("filterToolbar", { stringResult:true,  searchOnEnter:false,
                                            afterSearch:function(){
                                                filteredIDs = $("#"+gridId).getDataIDs();
                                            }
                                          }); 
    

    如果您想获取过滤后的行而不是过滤后的 ID,请使用 getRowData() 而不是 getDataIDs()。

    【讨论】:

    • 问题是getDataIDsgetRowData 仅从当前 页面获取过滤数据的ID,但无论分页如何,都想获取所有过滤行。
    • 是的,很抱歉我没有阅读“不管分页”部分。谢谢奥列格。
    • 我明白了。无论如何,您选择正确的方式,并且您的答案作为开始使用 stackoverflow 的人的典型答案更好。我建议您在代码前包含<!-- language: lang-js --> 和一个空行(有关更多详细信息,请参阅here 及其链接)
    • 完成。是的,我是新来的,我想帮助尽可能多的人,就像我是匿名用户时许多其他人间接帮助我一样,包括你,再次感谢。
    【解决方案2】:

    没有直接的方法可以获取您需要的信息。 jqGrid 内部使用$.jgrid.from 过滤本地数据。在addLocalData 内部使用$.jgrid.from 的主要代码。为了在不研究所有代码的情况下获得所需的结果,我建议使用所有过滤数据将由$.jgrid.fromselect 方法返回的事实(参见代码的the line)。我的建议是在将数据剪切到页面大小之前捕获数据。

    为此,我建议使用子类化:覆盖select 方法$.jgrid.from。我在为the answerthis one 创建的示例中演示了该技术。

    在您的情况下,代码将是

    var oldFrom = $.jgrid.from,
        lastSelected;
    
    $.jgrid.from = function (source, initalQuery) {
        var result = oldFrom.call(this, source, initalQuery),
            old_select = result.select;
        result.select = function (f) {
            lastSelected = old_select.call(this, f);
            return lastSelected;
        };
        return result;
    };
    

    现在变量lastSelected 将保存元素数组,这些元素是最后一次排序或过滤操作的结果。因为$.jgrid.from 是全局的,所以数据没有连接到网格。如果页面上有多个网格,那会很不舒服。可以通过在每个网格的loadComplate 代码中的以下行来解决这个小缺点:

    loadComplete: function () {
        this.p.lastSelected = lastSelected; // set this.p.lastSelected
    }
    

    我们引入新的 jqGrid 参数lastSelected 的方式将与data 参数具有紧密的结构,但只会保存最后过滤的数据。

    以下代码将在alert消息中显示过滤数据的id

    $("#getIds").click(function () {
        var filteredData = $grid.jqGrid('getGridParam', 'lastSelected'), i, n, ids = [],
            idName = $grid.jqGrid('getGridParam', 'localReader').id;
        if (filteredData) {
            for (i = 0, n = filteredData.length; i < n; i++) {
                ids.push(filteredData[i][idName]);
            }
            alert("tolal number of filtered data: " + n + "\n" +
                "ids of filtered data:\n" + ids.join(', '));
        }
    });
    

    我使用了localReader.id 参数,因为用于本地数据的属性名称通常为id_id_。如果使用loadonce: true 选项,则在从服务器加载数据的情况下将使用_id_

    The demo 演示该方法。例如,如果一个过滤器仅来自 FedEx 的数据,然后单击“显示 ID”按钮,则会看到所有过滤的信息,而不仅仅是当前页面上显示的数据:

    更新free jqGrid 提供了新的lastSelectedData 选项。请参阅the list of demos 中的the demo

    【讨论】:

    • 感谢您一如既往的详尽回答。我现在正在尝试您的解决方案。
    • @JackB.:我不确定你是否知道这一点。如果您打算奖励赏金,您应该通过单击“+XX”明确执行此操作(有关详细信息,请参阅here
    • 你是我的英雄!在我有机会问你之前,你已经回答了我的每一个 jqGrid 问题:)
    • @monitorjbl:很高兴能帮到你。不客气!
    • 没有你奥列格我会迷路的!非常感谢您对社区的所有贡献。
    【解决方案3】:

    所有,我找到了另一个更容易包含的答案

    loadComplete: function (gridData) {
                        var isSearchPerformed = $grid.getGridParam("postData")._search;
                        if (isSearchPerformed) {
                            $("#spanFilterTotal").text(gridData.records);                        
                    }
    

    【讨论】:

      【解决方案4】:

      你想要的都在下面:

      $.each($grid.getRowData(), function( index, value ) {
        a.push(value["COLUMN_NAME"]); //Get the selected data you want
      });
      

      【讨论】:

      • 请在代码中添加解释。这有助于其他人更好地理解您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      相关资源
      最近更新 更多