关于jqGrid列标题filter和高级过滤对话框的两个相关问题

在开发我的第一个使用jqGrid显示一些数据的ASP.NET MVC 3应用程序时,我使用了列标题filter,同时也允许进行高级filter工具栏过滤。 独立这些事情工作得很好。

第一个问题 –有没有人将当前列标题filter设置传送给高级filter?

例如,用户可以在“冰淇淋名称”栏上过滤掉部分名称,例如“巧克力”,然后过滤为“巧克力爆炸”,“黑巧克力”等。 最好打开高级filter,并在高级filter中自动填充“包含”巧克力“”列filter。 我认识到,另一个方向(有人可能为同一列,例如“巧克力”或“焦糖”)的两个值可能会成为问题,但在另一个方向,似乎是可能的。 也许这只是我错过的网格设置。 任何人解决这个?

第二个问题 –我目前可以使用列标题filter进行一些过滤,在网格中显示一些结果集,然后进入高级filter对话框并设置不同的filter。 这将显示正确的结果,但列标题filter不清除,给人的印象是过滤不起作用。 如何在使用单击对话框上的“查找”button后重置这些列标题filter?

我发现你的问题非常有趣,所以我准备了演示 ,演示如何在一个网格中结合“ 高级search”对话框和“ 工具栏search” 。

一个重要但简单的技巧是使用recreateFilter: true 。 默认情况下,search对话框将被创build一次,然后将只隐藏或显示。 结果postData.filters参数将不刷新。 在设置recreateFilter: true将解决使用search工具栏中的值填充高级search对话框的问题。 我个人设置默认search选项如下

 $.extend( $.jgrid.search, { multipleSearch: true, multipleGroup: true, recreateFilter: true, overlay: 0 } ); 

现在解决scheme的更复杂的部分是我写的函数refreshSerchingToolbar 。 该function不是那么简单,但它只是在使用中:

 loadComplete: function () { refreshSerchingToolbar($(this), 'cn'); } 

最后一个参数是您用作search工具栏方法filterToolbar (默认值是'bw',但我个人更喜欢使用'cn'并设置jqGrid参数ignoreCase: true )的defaultSearch属性的相同参数。

如果您将演示的高级search对话框填入以下字段

在这里输入图像描述

并单击“查找”button,您将有以下网格:

在这里输入图像描述

(我将“总计”列标记为search不可search: false仅显示案例中的所有工作都正常)

可以看到search工具栏中除“金额”之外的所有字段都填充了search对话框中的值。 这个字段没有被填充,因为我们使用“grater或equal”操作而不是“equal”。 函数refreshSerchingToolbar只填充search工具栏中可以生成的元素

提醒一下,我应该提到,在使用filter工具栏的情况下,定义colModel searchoptions.sopt选项是非常重要的。 对于所有包含(date,数字,select,int,货币)的非string列,将“eq”作为sopt数组的第一个元素非常重要的 。 详情请看这里和这里 。

如果将高级对话框的filter更改为以下内容

在这里输入图像描述

你会有预期的

在这里输入图像描述

最后我包含了refreshSerchingToolbar函数的代码:

 var getColumnIndex = function (grid, columnIndex) { var cm = grid.jqGrid('getGridParam', 'colModel'), i = 0, l = cm.length; for (; i < l; i += 1) { if ((cm[i].index || cm[i].name) === columnIndex) { return i; // return the colModel index } } return -1; }, refreshSerchingToolbar = function ($grid, myDefaultSearch) { var postData = $grid.jqGrid('getGridParam', 'postData'), filters, i, l, rules, rule, iCol, cm = $grid.jqGrid('getGridParam', 'colModel'), cmi, control, tagName; for (i = 0, l = cm.length; i < l; i += 1) { control = $("#gs_" + $.jgrid.jqID(cm[i].name)); if (control.length > 0) { tagName = control[0].tagName.toUpperCase(); if (tagName === "SELECT") { // && cmi.stype === "select" control.find("option[value='']") .attr('selected', 'selected'); } else if (tagName === "INPUT") { control.val(''); } } } if (typeof (postData.filters) === "string" && typeof ($grid[0].ftoolbar) === "boolean" && $grid[0].ftoolbar) { filters = $.parseJSON(postData.filters); if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") { // only in case of advance searching without grouping we import filters in the // searching toolbar rules = filters.rules; for (i = 0, l = rules.length; i < l; i += 1) { rule = rules[i]; iCol = getColumnIndex($grid, rule.field); cmi = cm[iCol]; control = $("#gs_" + $.jgrid.jqID(cmi.name)); if (iCol >= 0 && control.length > 0) { tagName = control[0].tagName.toUpperCase(); if (((typeof (cmi.searchoptions) === "undefined" || typeof (cmi.searchoptions.sopt) === "undefined") && rule.op === myDefaultSearch) || (typeof (cmi.searchoptions) === "object" && $.isArray(cmi.searchoptions.sopt) && cmi.searchoptions.sopt[0] === rule.op)) { if (tagName === "SELECT") { // && cmi.stype === "select" control.find("option[value='" + $.jgrid.jqID(rule.data) + "']") .attr('selected', 'selected'); } else if (tagName === "INPUT") { control.val(rule.data); } } } } } } }; 

更新 :上面的代码是免费的情况下使用jqGrid 4.13.1或更高的情况下不再需要。 它包含新的默认选项loadFilterDefaults: true filterToolbarsearchOperators: true ,如果设置了postData.filterssearch: true ,则刷新filter工具栏和filter操作的值 (如果searchOperators: true选项被设置)施加)。 免费jqGrid刷新jqGridAfterLoadComplete (如果设置了loadFilterDefaults: true )上的filter工具栏,或者显式触发了事件jqGridRefreshFilterValues

我知道这是一个旧的post – 但如果你在同一页面上有多个网格,上面的代码可以将filter文本添加到错误的网格。

在refreshSearchingToolbar的第一个循环中,从

 control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 

 control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cm[i].name)); 

这在第二个循环中

 control = $("#gs_" + $.jgrid.jqID(cmi.name)); 

 control = $("#gview_"+$grid.attr('id')+" #gs_" + $.jgrid.jqID(cmi.name)); 

应该做的伎俩。

荣誉Oleg