为什么Jqgrid冻结列似乎不适用于过滤行和filter标题?

我无法使用冻结列来使用jqgrid(4.3.0)。 我唯一能想到的是,我有一些不开箱即用的特定事物:

  1. 我在顶部使用过滤行。
  2. 我正在使用(cloneToTop:true)显示网格顶部的所有按钮
  3. 我有以下代码用于显示jqggrid顶部的filter状态。 (使用filtertoolbar)

    loadComplete: function () { var postData = jQuery(gridSelector).getGridParam("postData"); var newCapture = ""; if (postData._search === true && typeof postData.filters !== "undefined") { var filters = jQuery.parseJSON(postData.filters); newCapture = "Filter: ["; var rules = filters.rules; for (var i = 0; i < rules.length; i++) { var rule = rules[i]; var op = rule.op; // the code name of the operation if (jQuery.fn.searchFilter && jQuery.fn.searchFilter.defaults && jQuery.fn.searchFilter.defaults.operators) { // find op description var operators = jQuery.fn.searchFilter.defaults.operators; for (var j = 0; j < operators.length; j++) { if (operators[j].op === rule.op) { op = operators[j].text; //op = $.jgrid.search.odata[j]; break; } } } newCapture += rule.field + " " + op + " '" + rule.data + "'"; if (i + 1 !== rules.length) newCapture += ", "; } newCapture += "]"; } jQuery(gridSelector).setCaption(newCapture); 

任何人都可以想到任何可以阻止冻结柱在这些情况下工作的东西。

我分析了你的问题并创建了演示如何解决问题的演示 。 该演示使用冻结的第一列生成网格:

在此处输入图像描述

我在jqGrid中的当前(版本4.3.1)冻结列的实现中发现了一些错误,并将在稍后发布我的建议如何在那里修复trirand。 问题如下:

datatype: 'local'情况下,人们可以看到第一个问题特别明显datatype: 'local' ,其中网格数据将在网格初始化期间填充。 请参阅我刚刚调用方法setFrozenColumns 的相应演示 。 人们可以看到图片上的问题

在此处输入图像描述

在可以看到只有列标题将被冻结,但包含行号的列的网格主体将被滚动。 从下一个演示中可以看出,在调用setFrozenColumns来解决问题后,直接调用方法_complete就足够了:

 $grid.jqGrid('setFrozenColumns'); $grid[0].p._complete.call($grid[0]); 

其中$grid定义为var $grid = $('#list');

接下来的问题是_complete方法计算列标题的固定部分的位置(保存在$grid[0].grid.fhDiv )和网格体的固定部分(保存在$grid[0].grid.fbDiv )仅使用标准网格标题的高度(网格标题)。 因此,如果您使用setCaption更改标题,则可以将“冻结”潜水放在错误的位置。 在_complete之后调用_complete方法将无法解决问题,并且仍然有类似于演示的结果:

在此处输入图像描述

为了解决这个问题,我编写了非常简单的函数fixPositionsOfFrozenDivs

 var fixPositionsOfFrozenDivs = function () { if (typeof this.grid.fbDiv !== "undefined") { $(this.grid.fbDiv).css($(this.grid.bDiv).position()); } if (typeof this.grid.fhDiv !== "undefined") { $(this.grid.fhDiv).css($(this.grid.hDiv).position()); } }; 

它确定了冷冻潜水的位置。

最后我将loadComplete的实现改为以下内容:

 loadComplete: function () { var $this = $(this), newCapture = "", filters, rules, rule, op, i, iOp, postData = $this.jqGrid("getGridParam", "postData"), isFiltering = $this.jqGrid("getGridParam", "search"); if (isFiltering === true && typeof postData.filters !== "undefined") { filters = $.parseJSON(postData.filters); newCapture = "Filter: ["; rules = filters.rules; for (i = 0; i < rules.length; i++) { rule = rules[i]; op = rule.op; // the code name of the operation iOp = $.inArray(op, arOps); if (iOp >= 0 && typeof $.jgrid.search.odata[iOp] !== "undefined") { op = $.jgrid.search.odata[iOp]; } newCapture += rule.field + " " + op + " '" + rule.data + "'"; if (i + 1 !== rules.length) { newCapture += ", "; } } newCapture += "]"; } $this.jqGrid("setCaption", newCapture); fixPositionsOfFrozenDivs.call(this); } 

数组arOps定义为

 var arOps = ["eq", "ne", "lt", "le", "gt", "ge", "bw", "bn", "in", "ni", "ew", "en", "cn", "nc"]; 

结果我将得到我在答案开头引用的演示 。 如果要在搜索filter工具栏或高级搜索对话框中键入一些filter,则网格的标题将会更改(如原始示例中所示),但所有冻结的潜水位置都将正确。