Jquery 单击时停止“选中”jqGrid行,同时仍保留编辑

Jquery 单击时停止“选中”jqGrid行,同时仍保留编辑,jquery,jqgrid,Jquery,Jqgrid,我有一个三列的jqGrid。其中一列设置为单元格编辑,如下所示: $('#myGrid').jqGrid({ ... editUrl: 'clientArray', cellEdit: true, cellsubmit: 'clientArray', colModel: [ {name: 'Col1'}, {name: 'Col2'}, { name: 'Col3',

我有一个三列的jqGrid。其中一列设置为单元格编辑,如下所示:

$('#myGrid').jqGrid({
    ...
    editUrl: 'clientArray',
    cellEdit: true,
    cellsubmit: 'clientArray',
    colModel: [
        {name: 'Col1'},
        {name: 'Col2'},
        {
             name: 'Col3',
             editable: true,
             editrules: {required: true, number: true}
         }
    ]
});
当用户单击第三列中的单元格时,编辑器将自动显示。但是,当用户单击某一行时,该行也会高亮显示为“选中”。如果用户单击“可编辑”列中的单元格,是否可以在允许显示单元格编辑器的同时禁用此突出显示

我试过了

$('#myGrid').jqGrid({
    ...
    beforeSelectRow: function() { return false; }
})

…但这会禁用编辑以及行的选择。

您没有发布任何代码来显示如何实现内联编辑。有许多不同的实现使用内联编辑。最典型的是

在行选择时开始编辑,按Enter键保存,在放弃上一个未保存行中的更改后选择另一行 在行选择时开始编辑,按Enter键保存,选择另一行后,将无声地保存上一个未保存行中的更改 双击该行开始编辑,按Enter键保存,在放弃上一个未保存行中的更改后选择另一行 双击该行开始编辑,按Enter键保存,在无声保存前一个未保存行中的更改后选择另一行 使用具有格式化程序的附加列:操作 方法的使用 ... 例如,如果您使用上述列表的第一个版本,并且不希望进行任何行选择,则可以将代码从移至beforeSelectRow

演示一个可能的实现:

beforeSelectRow: function (rowid) {
    var $this = $(this),
        editingRowId = $this.jqGrid("getGridParam", "editingRowId"),
        setEditingRowId = function (newId) {
            $this.jqGrid("setGridParam", {editingRowId: newId});
        };

    if (rowid !== editingRowId) {
        if (editingRowId !== undefined) {
            $this.jqGrid("restoreRow", editingRowId);
        }
        $this.jqGrid("editRow", rowid, {
            keys: true,
            oneditfunc: function (id) {
                setEditingRowId(id);
            },
            aftersavefunc: function () {
                setEditingRowId();
            },
            afterrestorefunc: function () {
                setEditingRowId();
            }
        });
    }

    return false;
}
更新:如果要使用单元格编辑模式,则相应的实现更加困难。尽管如此,你还是有可能主要遵循你的想法。演示您需要的代码部分。它不使用任何键盘绑定

beforeSelectRow: function (rowid, e) {
    var $this = $(this),
        $td = $(e.target).closest("td"),
        $tr = $td.closest("tr.jqgrow"),
        iRow, iCol;

    if ($tr.length > 0) {
        iRow = $tr[0].rowIndex;
        iCol = $.jgrid.getCellIndex($td[0]);
        $this.jqGrid('setGridParam', {cellEdit: true});
        $this.jqGrid('editCell', iRow, iCol, true);
        $this.jqGrid('setGridParam', {cellEdit: false});
    }

    return false;
}

如果我不够清楚,我会道歉。我有大约三列,但其中只有一列是可编辑的。我将更新问题以反映这一点。@Lorax:您编写了内联编辑,但您的代码显示您使用了cellEdit:true。这是单元格编辑。jqGrid支持三个。一切都是以另一种方式运作的。如果你使用单元格编辑,那么你现在会问一个全新的问题。您可以实现所需的行为,但必须删除cellEdit:true并在beforeSelectRow回调中手动调用editCell。我希望来自的代码将帮助您实现这一点。感谢您澄清我对术语的误解。我才刚刚开始使用jqGrid,有时发现文档很难浏览。我将删除对内联编辑的引用。有没有办法,只有当用户单击行中的单元格时,我才能手动调用editCell?Oleg,您的解决方案很好,但是我看到了一个问题,因为enter或escape不允许我们退出输出。你有什么解决办法吗?@user2360915:对不起,答案真的很老了。我从2014年底开始开发fork。我对代码做了很多小改动,修复了很多bug,并实现了许多新特性。自由jqGrid中单元格编辑的默认行为:不选择单元格编辑中的行。如果它是必需的,那么可以通过调用beforeEditCell回调中的setSelection来实现。换句话说,如果您使用上面描述的URL,您不需要做任何事情。