Jquery 为什么';Jqgrid冻结列似乎与过滤器行和过滤器标题一起工作?
我无法使冻结列与jqgrid(4.3.0)一起工作。我能想到的唯一一件事是,我有一些特定的东西不是现成的:Jquery 为什么';Jqgrid冻结列似乎与过滤器行和过滤器标题一起工作?,jquery,jqgrid,frozen-columns,Jquery,Jqgrid,Frozen Columns,我无法使冻结列与jqgrid(4.3.0)一起工作。我能想到的唯一一件事是,我有一些特定的东西不是现成的: 我在顶部使用过滤行 我使用(cloneToTop:true)显示网格顶部的所有按钮 我使用以下代码在jqggrid顶部显示过滤器状态。(使用filtertoolbar) loadComplete:函数(){ var postData=jQuery(gridSelector).getGridParam(“postData”); var newCapture=“”; if(postData.\
loadComplete:函数(){
var postData=jQuery(gridSelector).getGridParam(“postData”);
var newCapture=“”;
if(postData.\u search==true&&typeof postData.filters!==“未定义”){
var filters=jQuery.parseJSON(postData.filters);
newCapture=“过滤器:[”;
var规则=filters.rules;
对于(var i=0;i
有人能想出什么办法阻止冻结列在这种情况下工作。我分析了您的问题,并创建了演示如何解决问题的程序。演示使用冻结的第一列生成网格: 我在jqGrid中冻结列的当前(版本4.3.1)实现中发现了一些错误,稍后将向trirand发布我的建议,如何修复这些错误。问题如下:
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);
}
第一个问题在datatype:'local'
中尤为明显,在网格初始化过程中,网格的数据将被填充。请参见我刚才调用的方法setFrozenColumns
。可以在图片上看到这个问题
On可以看到只有列标题将被冻结,但包含列和行号的网格体将被滚动。从中可以看到的内容将足以在调用setFrozenColumns
后直接调用方法\u complete
,以解决问题:
$grid.jqGrid('setFrozenColumns');
$grid[0].p._complete.call($grid[0]);
其中,$grid
定义为var$grid=$(“#list”);
下一个问题是\u complete
方法仅使用标准网格标题(网格标题)的高度计算列标题的固定部分(保存在$grid[0].grid.fhDiv
中)和网格体的固定部分(保存在$grid[0].grid.fbDiv
中)的位置。因此,如果您使用setCaption
更改标题,您可能会在错误的位置“冻结”潜水。在setCaption
之后调用\u 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);
}
结果是,我在回答的开头引用了一个过滤器。如果您想在搜索过滤器工具栏或高级搜索对话框中键入一些过滤器,网格的标题将被更改(如原始示例中所示),但所有冻结潜水都会有正确的位置。谢谢你的回答。。你知道4.3.2版本是否会发布吗?@leora:这不取决于我。:-)你应该问Tony的问题。@leora:你尝试过我的解决方案吗?你对冻结柱还有其他问题吗?或者问题已经解决了吗?我还有一个issue但我认为这与此无关。我过度编写了一些css以支持jqgrid中的word wrap,而冻结的列没有对齐。我看到其他人在这里的论坛中提出了这一点:。如果你看看Mark在12月22日发表的评论,我想这是一样的issue@leora当前位置我可以想象可能是单词或字符包装出现了一些问题一个人不仅应该确定冻结潜水的位置,还应该确定冻结潜水的高度。你应该发布演示,重现问题。至少你应该准确地描述你在哪里使用包装(在单元格中,在列标题中,…)以及如何使用包装(使用哪种CSS更改,或者使用哪种代码)
var arOps = ["eq", "ne", "lt", "le", "gt", "ge", "bw", "bn", "in", "ni", "ew", "en",
"cn", "nc"];