jqgrid:多选和禁用检查(有条件)

时间:2011-03-10 11:53:25

标签: jquery jqgrid


我喜欢jqGrid,但有时事情似乎比它们应该更复杂 我想要实现的是在每一行上都有一个复选框,以便用户可以选择要提交/处理的行。
但是,我需要阻止一些复选框,因为用户可能没有授权该特定行。

我尝试设置multiselect: true,然后我试图隐藏复选框:

loadComplete: function (data) {
    if (data.rows.length > 0) {
        for (var i = 0; i < data.rows.length; i++) {
            if (data.rows[i].cell[7] == 'false') {
                $("#jqg_OrdersGrid_" + data.rows[i].id).css("visibility", "hidden");
            }
        }
    }
},

并且效果很好,但仍然.jqGrid('getGridParam', 'selarrrow')给我选定的行,即使它们尚未被检查过。
是否有其他方法可以启用/禁用复选框,以及如何知道已检查哪些复选框?

感谢

5 个答案:

答案 0 :(得分:31)

我建议您根据“禁用”属性禁用可选择的复选框。要完全实现,您需要

  1. loadComplete事件句柄
  2. 中设置“已禁用”
  3. 另外阻止在beforeSelectRow事件句柄
  4. 中选择已禁用的行
  5. 支持多选列实现onSelectAll事件句柄的标题中的“全选”复选框,用于修复已禁用行的选择。
  6. 相应的演示可以看到here。代码中最重要的部分是:

    var grid = $("#list10"), i;
    grid.jqGrid({
        //...
        loadComplete: function() {
            // we make all even rows "protected", so that will be not selectable
            var cbs = $("tr.jqgrow > td > input.cbox:even", grid[0]);
            cbs.attr("disabled", "disabled");
        },
        beforeSelectRow: function(rowid, e) {
            var cbsdis = $("tr#"+rowid+".jqgrow > td > input.cbox:disabled", grid[0]);
            if (cbsdis.length === 0) {
                return true;    // allow select the row
            } else {
                return false;   // not allow select the row
            }
        },
        onSelectAll: function(aRowids,status) {
            if (status) {
                // uncheck "protected" rows
                var cbs = $("tr.jqgrow > td > input.cbox:disabled", grid[0]);
                cbs.removeAttr("checked");
    
                //modify the selarrrow parameter
                grid[0].p.selarrrow = grid.find("tr.jqgrow:has(td > input.cbox:checked)")
                    .map(function() { return this.id; }) // convert to set of ids
                    .get(); // convert to instance of Array
            }
        }
    );
    

    更新: Free jqGrid支持hasMultiselectCheckBox回调,可用于创建多选复选框,而不是jqGrid的所有行。可以使用rowattr另外禁用某些行。结果,人们将以更简单的方式获得上述功能。建议另外使用multiPageSelection: true选项将免费jqGrid与本地数据(datatype: "local"loadonce: true)一起使用。选项multiPageSelection: true将在分页上保存数组selarrrow。它允许通过填充selarrrow中的相应ID来“预选”某些行。有关其他信息,请参见the answer更新部分和the answerthe demo

答案 1 :(得分:5)

Oleg的答案很棒,我还会添加代码来取消选择已禁用的行,完成下面的onSelectAll函数。

onSelectAll: function(aRowids,status) {
    if (status) {
        // uncheck "protected" rows
        var cbs = $("tr.jqgrow > td > input.cbox:disabled", grid[0]);
        cbs.removeAttr("checked");

        //modify the selarrrow parameter
        grid[0].p.selarrrow = grid.find("tr.jqgrow:has(td > input.cbox:checked)")
            .map(function() { return this.id; }) // convert to set of ids
            .get(); // convert to instance of Array

        //deselect disabled rows
        grid.find("tr.jqgrow:has(td > input.cbox:disabled)")
            .attr('aria-selected', 'false')
            .removeClass('ui-state-highlight');
    }
}

答案 2 :(得分:3)

我找到了解决办法。 在loadComplete事件期间,我禁用了SelectAll复选框:我不需要它。 我也隐藏了复选框并禁用它。

loadComplete: function (data) {
    $("#cb_OrdersGrid").css("visibility", "hidden");
    if (data.rows.length > 0) {
        for (var i = 0; i < data.rows.length; i++) {
            if (data.rows[i].cell[7] == 'false') {
                $("#jqg_OrdersGrid_" + data.rows[i].id).css("visibility", "hidden");
                $("#jqg_OrdersGrid_" + data.rows[i].id).attr("disabled", true);
            }
        }
    }
}

现在,当我想提交我的数据时,我会遍历选定的行并检查它们是否已被禁用,并将那些已启用的数据放入新数组中。

var selectedRows = myGrid.jqGrid('getGridParam', 'selarrrow');
var checkedRows = [];
var selectionLoop = 0;
for (var x = 0; x < selectedRows.length; x++) {
    var isDisabled = $('#jqg_OrdersGrid_' + selectedRows[x]).is(':disabled');
    if (!isDisabled) {
        checkedRows[selectionLoop] = selectedRows[x];
        selectionLoop++;
    }
}

我现在所取得的成就是能够有条不紊地选择一行来检查它 我知道代码没有优化(原谅我Oleg),但我会稍后再做。

答案 3 :(得分:3)

对于那些在谷歌搜索后得到这个答案的人(比如我),自jqGrid 4.0.0以来,这个问题有一个非常简单的解决方案。

足以添加css-class ui-state-disabled&#39;到你不想被选中的那一行。见The changelog of jqGrid 4.0.0。 你仍然可以将其与隐藏或禁用复选框结合起来。

    var $jqgrid = $("#jqgridselector");         
    //loop through all rows
    $(".jqgrow", $jqgrid).each(function (index, row) {
        var $row = $(row);
        if ($row === condition) {
            //Find the checkbox of the row and set it disabled
            $row.find("input:checkbox").attr("disabled", "disabled");
            //add class ui-state-disabled, because thats how jqGrid knows not to take them into account for selection
            $row.addClass("ui-state-disabled");
            //I overwrite the opactity of the ui-state-disabled class to make the row look 'normal'
            $row.css("opacity", 1);
            }
        });

答案 4 :(得分:2)

我正在使用jqGrid 4.4.4,我不得不稍微调整一下LetfyX loadComplete。

            loadComplete: function(data) {
                for (var i = 0; i < data.rows.length; i++) {
                    var rowData = data.rows[i];
                    if (rowData.cell[6] != null) {//update this to have your own check
                        var checkbox = $("#jqg_list_" + rowData.i);//update this with your own grid name
                        checkbox.css("visibility", "hidden");
                        checkbox.attr("disabled", true);
                    }
                }
            }