jqGrid自定义onCellSelect不会在beforeSaveCell之前触发

时间:2014-12-16 06:46:08

标签: jquery jqgrid

我正在 onCellSelect 中编写一些代码,执行得很好

onCellSelect: function (rowid, iCol, cellcontent) {
        if (iCol > 0) {
            $("#gridMain_d").jqGrid("resetSelection");
            $("#gridMain_d").setSelection(rowid, true);
        }
    }

但问题是因为此代码 beforeSaveCell 事件未触发。我知道这一点,因为我在之前删除此代码然后开始工作。我尝试过使用return语句,但没有任何作用。

更新
我评论了上面写的代码并添加了这段代码

beforeSelectRow: function (rowid, e) {
        var $self = $(this), iCol, cm,
            $td = $(e.target).closest("tr.jqgrow>td"),
            $tr = $td.closest("tr.jqgrow"),
            p = $self.jqGrid("getGridParam");

        if ($(e.target).is("input[type=checkbox]") && $td.length > 0) {
            $self.jqGrid("setSelection", $tr.attr("id"), true, e);
        }
        else {
            $self.jqGrid('resetSelection');
            $self.jqGrid("setSelection", $tr.attr("id"), true, e);
        }
        return true;
    },

但仍然 beforeSaveCell 事件未触发。

更新2
这个jsFiddle复制了这个问题。 http://jsfiddle.net/eranjali08/CzVVK/1175/

1 个答案:

答案 0 :(得分:1)

有许多回调相互依赖。此外,它可能是jqGrid的不同版本中的这种依赖性的差异。我建议您使用beforeSelectRow而不是onCellSelect,因为它将是第一个在点击jqGrid单元格时调用的回调。您可能需要的所有信息都可以从e的第二个参数(下面代码中为beforeSelectRow)获取:

beforeSelectRow: function (rowid, e) {
    var $self = $(this),
        $td = $(e.target).closest("tr.jqgrow>td");
        iCol = $.jgrid.getCellIndex($(e.target).closest($td[0]),
        colModel = $self.jqGrid("getGridParam", "colModel"),
        columnName = colModel[i].name;
    //...
    // one can use here $td.html(), $td.text() to access the content of the cell
    // columnName is the name of the column which cell was clicked
    // iCol - the index of the column which cell was clicked
    return true; // or false to suppress the selection
}

您只需要忘记beforeSelectRow应该返回告知jqGrid是否选择单击行的值。从false返回的值"stop"beforeSelectRow会禁止选择所点击的行。所有其他值都允许选择。

更新:我再次分析了您的代码,希望我找到了问题的原因。您使用resetSelection,这在使用单元格编辑时是邪恶的。查看resetSelection的{​​{3}}。

t.p.savedRow = [];

销毁包含当前编辑单元格信息的数组。因此无法保存或恢复单元格。

要解决此问题,您必须从代码中删除resetSelection。如果您确实需要使用resetSelection,则应将其替换为例如调用setSelection的循环。相应的代码可能看起来接近下面的代码:

beforeSelectRow: function (rowid, e) {
    var $self = $(this), iCol, cm, i, idsOfSelectedRows,
        $td = $(e.target).closest("tr.jqgrow>td"),
        $tr = $td.closest("tr.jqgrow"),
        p = $self.jqGrid("getGridParam");

    if ($(e.target).is("input[type=checkbox]") && $td.length > 0) {
        $self.jqGrid("setSelection", $tr.attr("id"), true, e);
    }
    else {
        //$self.jqGrid('resetSelection');
        idsOfSelectedRows = p.selarrrow.slice(0); // make copy of the array
        for (i = 0; i < idsOfSelectedRows.length; i++) {
            $self.jqGrid("setSelection", idsOfSelectedRows[i], false, e);
        }
        $self.jqGrid("setSelection", rowid, false, e);
    }
    return false;
},