关于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
filterToolbar
为searchOperators: true
,如果设置了postData.filters
和search: 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