对列进行排序会在jqGrid中显示隐藏的行

时间:2017-01-27 11:04:48

标签: javascript jquery jqgrid

我有一些我隐藏的行:

$("#"+rowid).hide();

我的问题是,当用户点击排序colmun时,隐藏的行重新出现。有办法避免这种情况吗?

修改

我将尝试用代码示例更多地解释一下我所做的事情。 我开始用这个参数创建我的网格(并且没有数据)。

var params = {
    datatype: "local",
    data: [],
    caption: "Grid",
    colNames:[ "Column A", "Column B" ],
    colModel:[
        { name:"colA", key: true },
        { name:"colB" } 
    ]
};

出于某些原因,我使用数据重新加载网格,如下所示:

$("#myGrid").jqGrid("clearGridData")
        .jqGrid("setGridParam", { data: myDatas })
        .trigger("reloadGrid");

我有听众的复选框,如下所示:

$("#checkbox1").on("change", onCheckbox1Changed);

function onCheckbox1Changed() {
  var rowid = ...;
  var datas = $("#myGrid").jqGrid("getRowData");

  for(var key in datas) {
    if(datas[keys].colB === "" && $("#checkbox1").val() === true) {
      $("#"+rowid).show();
    } else if(datas[keys].colB === "" && $("#checkbox1").val() === false) {
      $("#"+rowid).hide();
    }
  }
}

此代码的工作方式与我想要的一样。根据复选框隐藏/显示行。问题是,当我使用列进行排序时,隐藏的列重新出现。

编辑2

我可以强制网格在排序后隐藏行。但是我找不到像“afterSort”这样的事件。有“onSortCol”但它在排序之前被调用。

解决方案是使用“loadComplete”强制执行此操作。像这样:

var params = {
   // ...
   loadComplete: onLoadComplete
}

function onLoadComplete() {
    onCheckbox1Changed();
}

我尝试了它并且它有效。但我对这个解决方案并不是“粉丝”。

2 个答案:

答案 0 :(得分:1)

我发现在显示数据页面后隐藏了一些行并非最佳选择。主要缺点是将显示的行数。只有在需要显示一页数据时,才能在$("#"+rowid).hide();内安全使用loadComplete方法。即使在这种情况下,也可以看到一些不正确的信息例如,可以使用viewrecords: true选项,将“View 1 - 10 of 12”等文本放在寻呼机的右侧。

我个人建议您过滤数据。您需要向网格添加search: true选项并指定postData.filters,其中排除显示的某些行:

search: true,
postData: {
    filters: {
        groupOp: "AND",
        rules: [
            { field: "colA", op: "ne", data: "rowid1" },
            { field: "colA", op: "ne", data: "rowid2" }
        ]
    }
}

如果你要从旧的jqGrid 4.6升级到免费的jqGrid的当前版本(4.13.6),那么你可以使用"ni"(NOT IN)操作:

search: true,
postData: {
    filters: {
        groupOp: "AND",
        rules: [
            { op: "ni", field: "id", data: "rowid1,rowid2" }
        ]
    }
}

在这两种情况下,jqGrid将首先根据过滤规则过滤本地数据,然后它将显示当前的数据页面。结果你将获得完美的结果。

对此类网格进行排序不会改变过滤器。

答案 1 :(得分:0)

创建表后不要隐藏列,在使用选项hidden创建网格时直接隐藏它们,如下所示:

 colNames: ['Id', ...],
 colModel: [
    { key: true, hidden: true, name: 'Id', index: 'Id' },
    ....
 ]

如果您想在创建网格后隐藏特定事件的列,请查看this文章。

希望你在寻找。