2011-04-21 95 views
6

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

由于多种原因,我填充网格的最佳方式是直接将数组发送到页面上的JavaScript中。网格本身根本不与服务器交互。我有一些自定义的AJAX发生在各种网格事件中,但就是这样。 (基本上,我正在将这与现有的一组可用服务集成在一起,这些服务不会发生显着变化。)

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

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

这可能吗?

回答

20

要过滤本地网格,您应该只填写filters属性jgGrid的postData参数,并另外设置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

这看起来不错,谢谢!有几件奇怪的事情正在发生。 1:在我的客户端提供的环境中,IE 8(我的项目的唯一目标浏览器,客户端订单)中表示“JSON”未定义。但它不会在你的演示中在同一个浏览器上说这个。 2:在你设置的演示中,它不保存在过滤之间的行选择。选择,隐藏,然后取消隐藏的行不再被选中。然而,在实现这一点的同时,我有一个想法,可以更简单,更本地与jqGrid ... – David 2011-04-21 22:30:58

+0

如果,而不是过滤主网格,过滤功能弹出一个jQuery UI模式对话框(简单)自己的网格,它显示过滤的记录(我可以很容易地使用'grid1'中过滤的数据集填充'grid2'?我想最糟糕的情况是我复制数组和过滤器在一个循环与普通JS之前设置为数据' grid2')。然后用户选择他们想要的并关闭模态对话框。关闭时,我从'grid2'(简单)中获取选定的ID,并将它们设置为在'grid1'中选择(方便,演示在jqGrid站点上)。当然,清除'grid2'。思考? – David 2011-04-21 22:34:22

+1

@David:你有''JSON'未定义'错误,因为你没有包含[json2.js](https://github.com/douglascrockford/JSON-js)。如果安装了更新[976662](http://support.microsoft.com/kb/976662),则IE8也支持“JSON”类。我建议你总是包含json2.js以确保'JSON.stringify'工作。 – Oleg 2011-04-22 05:20:29