2

我正在使用带有inlineNav选项的 jqGrid 4.3.2。网格上的所有编辑都是在本地使用loadonce: true和完成的clientArray。当用户完成编辑时,他们单击表单上的保存按钮,整个网格被发布到服务器。在大多数情况下,这很好用,但我遇到了一个奇怪的问题。如果用户添加一个新行,然后在按 Enter 确认编辑或取消选择新添加的行之前单击保存按钮,则即使saveRow在发布和重新加载之前调用之后,内联导航器上的添加按钮仍保持禁用状态。我在通话后尝试过resetSelection,但这些都不起作用。我的保存代码:restoreRowsaveRow

$("#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;
});

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

4

1 回答 1

5

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

  • 添加:gridId +“_iladd”(例如“list_iladd”)
  • 编辑:gridId +“_iledit”(例如“list_iledit”)
  • 保存:gridId +“_ilsave”(例如“list_ilsave”)
  • 取消:gridId +“_ilcancel”(例如“list_ilcancel”)

要启用该按钮,您应该删除'ui-state-disabled'CSS 类:

var gridId = "list";
$("#" + gridId + "list_iladd").removeClass('ui-state-disabled');

要禁用按钮,可以.addClass('ui-state-disabled')改为使用。

此外,我不建议您直接使用任何内联编辑方法saveRow。在这种情况下,您可能不会遇到您尝试解决的问题。查看答案中的代码。它定义editingRowIdmyEditParam

var $grid = jQuery("#list"),
    editingRowId,
    myEditParam = {
        keys: true,
        oneditfunc: function (id) { editingRowId = id; },
        afterrestorefunc: function (id) { editingRowId = undefined; }
    };

然后inlineNavmyEditParam参数一起使用:

$grid.jqGrid('inlineNav', '#pager',
    { edit: true, add: true, editParams: myEditParam,
        addParams: {addRowParams: myEditParam } });

在这种情况下,您可以确保editingRowId获取当前编辑行的 ID,或者undefined如果没有行正在编辑。因此,您可以使用$(gridIdSelector + "_iledit").click();而不是editRow来编辑当前选定的行。同样,如果需要,您可以使用setSelection并模拟单击任何其他内联编辑导航器按钮。

更新:如果您需要,您仍然可以组合saveRowinside of 的调用onSelectRow,但您可以首先使用变量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

于 2012-06-04T20:09:34.437 回答