【问题标题】:jqGrid Filtering RecordsjqGrid 过滤记录
【发布时间】:2011-08-10 14:53:15
【问题描述】:

这里似乎有一些关于这个主题的问题,他们有一些很好的答案,但我的情况似乎有点不同。我需要过滤 jqGrid 中显示的记录,但完全是客户端。

出于多种原因,对我来说填充网格的最佳方式是使用直接发送到页面上的 JavaScript 中的数组。网格本身根本不与服务器交互。我在各种网格事件中发生了一些自定义 AJAX,但仅此而已。 (基本上,我将其与一组现有的可用服务集成,这些服务不会发生重大变化。)

我要做的是根据简单的文本输入和按钮过滤网格。我的页面有文本输入、按钮和一个表格(它成为文档准备好的网格)。我想绑定到按钮的单击事件(普通的 jQuery 事件绑定,没什么特别的),并将文本输入中的值用作 jqGrid 上的显示过滤器。

“过滤器”是指仅显示与输入中的文本匹配(在任何字段中)的记录。然后,要显示所有记录,只需清空输入并再次单击按钮。此外,网格是多选的,选择需要通过过滤保持。我只需要能够隐藏与输入内容不匹配的行。

这可能吗?

【问题讨论】:

    标签: search jqgrid filter


    【解决方案1】:

    要过滤本地网格,您应该只填写 jqGrid 的postData 参数的filters 属性并另外设置search:true

    要保存对网格的选择,您可以使用reloadGrid 和附加参数[{page:1,current:true}](请参阅here)。

    对应的代码可以如下

    $("#search").click(function() {
        var searchFiler = $("#filter").val(), grid = $("#list"), f;
    
        if (searchFiler.length === 0) {
            grid[0].p.search = false;
            $.extend(grid[0].p.postData,{filters:""});
        }
        f = {groupOp:"OR",rules:[]};
        f.rules.push({field:"name",op:"cn",data:searchFiler});
        f.rules.push({field:"note",op:"cn",data:searchFiler});
        grid[0].p.search = true;
        $.extend(grid[0].p.postData,{filters:JSON.stringify(f)});
        grid.trigger("reloadGrid",[{page:1,current:true}]);
    });
    

    我为您创建了the demo,它过滤了“客户”(“名称”)和“注释”(“注释”)两列,您可以扩展代码以在您需要的所有列中进行搜索。

    取决于您对保存行选择的确切含义,您可能需要将来自selarrrow 的当前选择保存在一个变量中,并根据setSelection 方法恢复选定的行。

    【讨论】:

    • 这看起来很棒,谢谢!一些奇怪的事情发生在我身上。 1:在我的客户端提供的环境中的 IE 8(我项目的唯一目标浏览器,客户端的订单)中,它说 JSON 未定义。但它没有在您的演示中在同一个浏览器中这样说。 2:在您设置的演示中,它不保存过滤之间的行选择。被选中、隐藏然后取消隐藏的行不再被选中。然而,在实现这一点时,我有一个想法,可以更简单、更原生地使用 jqGrid...
    • 如果过滤器功能不是过滤主网格,而是弹出一个 jQuery UI 模式对话框(简单),它有自己的显示过滤记录的网格(我可以轻松填充 grid2使用来自grid1的过滤数据集?我想最坏的情况是我复制数组并使用普通JS循环过滤,然后将其设置为grid2的数据)。然后用户选择他们想要的并关闭模式对话框。最后,我从grid2(简单)中获取选定的ID,并将它们设置为在grid1(简单,演示在jqGrid 站点上)中选择。当然,清除grid2。想法?
    • @David:您有“JSON 未定义”错误,因为您没有包含json2.js。如果安装了更新 976662,IE8 还原生支持 JSON 类。我建议您始终包含 json2.js 以确保 JSON.stringify 工作。
    • @David:关于选择。 jqGrid 在selarrrow 中保存当前可见页面 上选定行的数组。这通常不是一种需要。因此,您必须在用户按下“搜索”按钮($("#list")[0].p.selarrrow$("#list").jqGrid('getGridParam','selarrrow'))之前保存所有选定的行。稍后您将不得不更新onSelectRowbeforeSelectRow 事件句柄中的外部数组。要从网格上的外部数组中设置选择,您应该在loadComplete 事件句柄内的循环中调用setSelection 方法。
    • @David:如果您想创建具有相同包含的新网格,我建议您使用 jqGrid 的data 参数。您可以通过$("#list").jqGrid('getGridParam','data') 获得它。您将获得 full 网格包含(来自所有页面并且独立于当前过滤器)。在新网格中,您可以使用data 作为参数。不要忘记使用gridview:true。使用data 参数和gridview:true 可以归档最佳性能。
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2017-08-18
    相关资源
    最近更新 更多