当multiselect选项设置为true时,为复选框列添加自定义格式化程序

时间:2019-04-03 11:24:44

标签: javascript jquery jqgrid

我将jqgrid用作具有multiselect:true属性的网格。我想根据某些行值(禁用/不允许检查)删除某些行的复选框。我想在复选框模型上添加格式化程序,以删除该列上的复选框

我试图在beforeProcessing内部访问colModel,但是我还没有看到jqgrid自动添加的列名'cb'。因此我无法在'cb'的colmodel中注入格式化程序。

jqGrid({
  multiselect: true,
  beforeSelectRow: function() {
     //called when tried to select one row.
     //its not called when selectAll is called.
  },
  onSelectAll: function(rowids, status) {
     //gets selected row ids when status is true
  }
})

1)我想根据行值来操纵复选框的选择。

2)如果具有列isApplicable = false的行不应该(可见/可选)复选框

jgrid版本:5.3.0

1 个答案:

答案 0 :(得分:1)

请务必始终在问题文本中包含(可以使用)jqGrid的版本。同样重要的是,还要了解jqGrid的 fork free jqGrid,商业Guriddo jqGrid或版本<= 4.7的旧jqGrid)。

我开发的免费jqGrid fork包含一些选项/回调,可用于实现您的需求。

首先,您可以使用hasMultiselectCheckBox回调通知jqGrid应在其中创建行(例如,基于isApplicable列的内容)多选复选框:

hasMultiselectCheckBox: : function (options) {
    // options is object like below
    // { rowid: rowid, iRow: irow, iCol: pos, data: item, checked: checked };
    // one can use options.data to examine the data of the current row

    return options.data != null && options.data.isApplicable;
}

即使该行中不存在该复选框,仍然可以通过单击该行来选择该行。 (顺便说一句,您可以使用multiselectPosition: "none"完全没有带有多选复选框的列。)因此,您应该另外添加beforeSelectRow回调,这样可以防止选择isApplicable等于false

beforeSelectRow: function (rowid) {
    var item = $(this).jqGrid("getLocalRow", rowid);

    if (item != null && !item.isApplicable) {
        return true;
    }
    return false;
},

或者,如果您使用免费jqGrid的最新版本之一,则可以使用rowattr"jqgskipselect"类添加到行中,这应该是不可选择的:

rowattr: function (item) {
    if (!item.isApplicable) {
        return { "class": "jqgskipselect" };
    }
},

free jqGrid防止选择具有类的行。在旧版本中,可以使用禁用的类来防止选择。如果使用jQuery UI CSS,则为"ui-state-disabled"类;如果使用Bootstrap CSS,则为"disabled"类。