【问题标题】:jqGrid with inlineNav: is there a way to force the Add button to re-enable?带有 inlineNav 的 jqGrid:有没有办法强制重新启用“添加”按钮?
【发布时间】:2012-06-04 18:58:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

    通过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这样的内联编辑方法。在这种情况下,您可能不会遇到您尝试解决的问题。查看来自the answer 的代码。它将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 并模拟单击任何其他内联编辑导航器按钮。

    更新:如果您需要,您仍然可以在onSelectRow 内组合saveRow 的调用,但您可以先使用变量editingRowId,然后再使用myEditParam,这将是common 用于您使用的所有编辑方式:

    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 的其他 cmets。我使用onSelectRow 在之前选择的行上调用saveRow,类似于来自stackoverflow.com/q/2359011/27457"的代码。您不建议使用这种方法吗?
    • @AJ.:我明白你的意思。我认为在这种情况下,您仍然可以很好地将内联编辑与其他内联编辑方法组合,如果您遵循一些额外的规则,您将没有问题:请参阅“UPDATED”部分我的回答。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2014-05-28
    • 2019-12-13
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多