jqGrid复选框改变事件

7

我在数据库中有真/假值。我希望用jqgrid中的复选框更新它们。一旦将值设置为true,它将保持不变,不应更改。请查看我的列模型:

{
    name : 'available',
    width : 12,
    resizable: true,
    editable: true,
    align: 'center',
    edittype:'checkbox',
    formatter: "checkbox", formatoptions: {disabled : false},
    classes:'check',
    editrules:{required:false}, editoptions:{size:39,value:"True:False"}
}

我正在尝试捕获复选框被选中时的事件,当前它们都未被选中,到目前为止我已经尝试过:

jq(".check input").each(function(){
    jq(this).click(function(){
        aler("works");
    });
});

jq("input[type='checkbox']").change(function(){
    alert("works");
}); 

jq(":checkbox").parent().click(function(evt) {
    if (evt.target.type !== 'checkbox') {
        var $checkbox = jq(":checkbox", this);
        $checkbox.attr('checked', !$checkbox.attr('checked'));
        $checkbox.change();
        alert("");
    }
});

这些都不起作用,我卡住了,不知道还能尝试什么。

使用 Firebug 检查 checkbox 代码如下:

<input type="checkbox" offval="no" value="false">
3个回答

7
您可以创建自定义格式化程序。在您的网格中,
formatter: cboxFormatter,

然后定义函数:
function cboxFormatter(cellvalue, options, rowObject)
{
  return '<input type="checkbox"' + (cellvalue ? ' checked="checked"' : '') + 
      'onclick="alert(' + options.rowId + ')"/>';
}

您可以使用onclick来执行您的任务或调用一个函数。

5
使用自定义格式化程序是其中一种可能性。也可以使用不显眼的onclick绑定方式。
首先,定义一个...
var grid = $("#list"),
    getColumnIndexByName = function(columnName) {
        var cm = grid.jqGrid('getGridParam','colModel'),i=0,l=cm.length;
        for (; i<l; i++) {
            if (cm[i].name===columnName) {
                return i; // return the index
            }
        }
        return -1;
    },
    disableIfChecked = function(elem){
        if ($(elem).is(':checked')) {
            $(elem).attr('disabled',true);
        }
    };

然后可以在loadComplete代码中使用如下代码:

loadComplete: function() {
    var i=getColumnIndexByName('closed');
    // nth-child need 1-based index so we use (i+1) below
    $("tbody > tr.jqgrow > td:nth-child("+(i+1)+") > input",
      this).click(function(e) {
        disableIfChecked(this);
    }).each(function(e) {
        disableIfChecked(this);
    });
}

点击此处查看对应的演示。


为什么需要“each”?它是用来在加载时基于值禁用,但在任何用户交互之前吗? - dtroy
1
@dtroy:each循环需要在加载内容后直接对指定列中的每个单元格调用disableIfCheckedclick中的调用在复选框被点击后再次调用disableIfChecked。这是一个旧答案。现在我更喜欢不对列中的每个单元格进行单独绑定。参见答案答案 - Oleg
Oleg,你是JQGrid的救星! :) - will824
@will824:谢谢!如果我的回答能帮到你,我很高兴。 - Oleg
@Oleg,你不仅帮助了我,还帮助了我们整个团队。我们甚至开玩笑说你是JQGrid开发者的第二只手,如果你消失了,我们会陷入深深的麻烦中:D - will824

2
这对我有用:

这对我有用:

    // Listen for Click Events on the 'Process' check box column
    $(document).on("click", "td[aria-describedby='grdOrders_Process']", function (e) {
        var checked = $(e.target).is(":checked")

        var rowId = $(e.target).closest("tr").attr("id")
        rowData = jQuery("#grdOrders").getRowData(rowId);

        alert("Checked: " + checked)
        alert("OrderNo: " + rowData.OrderNo);
        alert("Name: " + rowData.Name);
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接