【问题标题】:Sorting a column display hidden rows in jqGrid在jqGrid中对列进行排序显示隐藏的行
【发布时间】:2017-01-27 11:04:47
【问题描述】:

我有一些这样隐藏的行:

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

我的问题是,当用户单击对列进行排序时,隐藏的行重新出现。有没有办法避免这种情况?

编辑

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

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();
}

我试过了,效果很好。但我不是很“喜欢”这个解决方案。

【问题讨论】:

  • 您使用哪些标准来选择需要隐藏的行?您在哪里获得/持有相应的 rowid?您在代码的哪一部分隐藏了行?您使用(可以使用)哪个 jqGrid 版本以及来自哪个 jqGrid 分支(free jqGrid、商业Guriddo jqGrid JS 或版本
  • 我在 4.6 版中使用免费的 jqGrid。我无法改变它。
  • 你的代码和我问你的其他问题怎么样?
  • 对不起,我按“enter”返回到该行,因此发表了评论。无论如何(对不起我的英语不好)。我有允许在某些条件下显示行的复选框(例如:如果字段“名称”为空,则隐藏行)。我隐藏了侦听器复选框中的行。
  • 英文没问题。我相信我可以帮助你,但你应该发布一些代码,让你了解你在做什么。一般来说,您可以将隐藏行的 id 列表作为 jqGrid 的新自定义选项。您可以使用rowattr 隐藏行。就是这样。如果还不够清楚,那么您应该附加一些代码片段,以演示您的工作。我可以修改代码以显示我的意思。

标签: javascript jquery jqgrid


【解决方案1】:

我发现 在显示数据页面后隐藏一些行不是最佳选择。主要缺点是将显示的行数。只有当您需要显示一页数据时,您才能安全地使用loadComplete 内部的$("#"+rowid).hide(); 方法。即使在这种情况下也可以看到一些不正确的信息。例如,可以使用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 升级到当前版本 (4.13.6) 的免费 jqGrid,那么你可以使用"ni" (NOT IN) 操作:

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

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

这种网格的排序不会改变过滤器。

【讨论】:

    【解决方案2】:

    创建表格后不要隐藏列,直接在创建网格时使用选项hidden隐藏,像这样:

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

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

    希望它是您正在寻找的。​​p>

    【讨论】:

    • 感谢您的回答。但我隐藏的不是列,而是行。我会根据某些事件隐藏它。
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多