Jquery jqGrid with inlineNav:有没有办法强制Add按钮重新启用?

Jquery jqGrid with inlineNav:有没有办法强制Add按钮重新启用?,jquery,jqgrid,Jquery,Jqgrid,我正在使用jqGrid 4.3.2和inlineNav选项。网格上的所有编辑都是使用loadonce:true和clientArray在本地完成的。用户完成编辑后,单击表单上的保存按钮,整个网格将发布到服务器。这在很大程度上很有效,但我遇到了一个奇怪的问题。如果用户添加新行,然后在按enter键确认编辑或取消选择新行之前单击“保存”按钮,则即使在发布和重新加载之前调用saveRow,内联导航器上的“添加”按钮仍然处于禁用状态。在调用saveRow之后,我尝试了resetSelection和res

我正在使用jqGrid 4.3.2和
inlineNav
选项。网格上的所有编辑都是使用
loadonce:true
clientArray
在本地完成的。用户完成编辑后,单击表单上的保存按钮,整个网格将发布到服务器。这在很大程度上很有效,但我遇到了一个奇怪的问题。如果用户添加新行,然后在按enter键确认编辑或取消选择新行之前单击“保存”按钮,则即使在发布和重新加载之前调用
saveRow
,内联导航器上的“添加”按钮仍然处于禁用状态。在调用
saveRow
之后,我尝试了
resetSelection
restoreRow
,但这两种方法都不起作用。我的保存代码:

$("#submitButton").click(function () {
    $("#theGrid").jqGrid('saveRow', $("#selectedRowId").val(), false, 'clientArray');
    if (!ValidateGridData())
        return false;
    var rowData = $("#theGrid").jqGrid('getRowData');
    var dataToSend = JSON.stringify(rowData);
    $.ajax({
        url: '@Url.Action("UpdateGridData")',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: dataToSend,
        dataType: 'json',
        async: false,
        success: function (data, textStatus, jqXHR) {
            $("#theGrid").jqGrid('setGridParam', { datatype: 'json' });
            $("#theGrid").trigger('reloadGrid');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Error saving data: ' + textStatus + " " + errorThrown);
        }
    });
    return true;
});

有没有办法让内联导航器相信新行已保存,用户可以添加更多行

通过该方法添加到导航器中的按钮具有由网格id和相应后缀构成的id:

  • 添加:gridId+“\u iladd”(例如“list\u iladd”)
  • 编辑:gridId+“\u-iledit”(例如“list\u-iledit”)
  • 保存:gridId+“\u ilsave”(例如“list\u ilsave”)
  • Cancel:gridId+“\u ilcancel”(例如“list\u ilcancel”)
要启用该按钮,应删除
'ui-state-disabled'
CSS类:

var gridId = "list";
$("#" + gridId + "list_iladd").removeClass('ui-state-disabled');
要禁用按钮,可以使用
.addClass('ui-state-disabled')

此外,我不建议您直接使用任何内联编辑方法,如
saveRow
。在这种情况下,您可能不会遇到您试图解决的问题。请看下面的代码。它将
editingRowId
myEditParam
定义为

var $grid = jQuery("#list"),
    editingRowId,
    myEditParam = {
        keys: true,
        oneditfunc: function (id) { editingRowId = id; },
        afterrestorefunc: function (id) { editingRowId = undefined; }
    };
然后将
inlineAV
myEditParam
参数一起使用:

$grid.jqGrid('inlineNav', '#pager',
    { edit: true, add: true, editParams: myEditParam,
        addParams: {addRowParams: myEditParam } });
在这种情况下,您可以确保
editingRowId
获取当前编辑行的id,或者
undefined
如果没有行正在编辑。因此,您可以使用
$(gridIdSelector+“\u iledit”)。单击()而不是编辑当前选定行。同样,如果需要,您可以使用并模拟单击任何其他内联编辑导航器按钮

已更新:如果需要,您仍然可以在
onsetrow
内部组合调用
saveRow
,但您可以首先使用变量
editingRowId
,然后使用
myEditParam
,这对于您使用的所有编辑方式都是通用的:

onSelectRow: function (id) {
    var $this = $(this);
    if (editingRowId !== id) {
        if (editingRowId) {
            // save or restore currently editing row
            $this.jqGrid("saveRow", editingRowId, myEditParam);
            // or $this.jqGrid("restoreRow", editingRowId, myEditParam);
        }
        $this.jqGrid("editRow", editingRowId, myEditParam);
    }
}

如果您需要一些其他的内联编辑方法选项,您可以将其包含在
myEditParam
中。您将看到,
editingRowId
作为
lastSel
变量使用要好得多,您可以在大多数内联编辑示例中找到它。

我正沿着这条路径前进,只是在
attr('class')
上使用了一个草率的
replace
,而不是
.removeClass
。工作完美。谢谢Oleg,我已经看过你关于不直接使用saveRow的附加评论了。我正在使用
onsetrow
对先前选择的行调用
saveRow
,类似于中的代码“。你不建议使用这种方法吗?@AJ:我明白你的意思。我认为在这种情况下,您仍然可以很好地将内联编辑与其他内联编辑方法结合起来,如果您遵循一些附加规则,您将不会有任何问题:请参阅我答案中的“更新”部分。