如果保存了新行,如何启用“在编辑操作中单击”按钮jqgrid

如果保存了新行,如何启用“在编辑操作中单击”按钮jqgrid,jqgrid,Jqgrid,编辑格式化程序操作按钮放置在jqgrid列: colModel: [{"fixed":true,"label":" change ","name":"_actions","width":($.browser.webkit == true? 37+15: 32+15) ,"align":"center","sortable":false,"formatter":"actions", "formatoptions":{"keys":true,"delbutton":false,"onSucc

编辑格式化程序操作按钮放置在jqgrid列:

colModel: [{"fixed":true,"label":" change ","name":"_actions","width":($.browser.webkit == true? 37+15: 32+15)
    ,"align":"center","sortable":false,"formatter":"actions",
"formatoptions":{"keys":true,"delbutton":false,"onSuccess":function (jqXHR) {actionresponse = jqXHR;return true;}
    ,"afterSave":function (rowID) {
    cancelEditing($('#grid'));afterRowSave(rowID,actionresponse);actionresponse=null; }
    ,"onEdit":function (rowID) {
      if (typeof (lastSelectedRow) !== 'undefined' && rowID !== lastSelectedRow)
        cancelEditing($('#grid'));
        lastSelectedRow = rowID;
        }
    }}
在loadcomplete事件中将新行添加到jqgrid

var newRowData = {};
var newRowId = '_empty' + $.jgrid.randId();
$('#grid').jqGrid('addRowData', newRowId, newRowData);
如果单击“保存操作”按钮,其id将更新:

function aftersavefunc(rowID, response) {
    restoreActionsIcons();
    $('#grid').jqGrid('resetSelection');
    var json = $.parseJSON(response.responseText);
    $("#" + rowID).attr("id", json.Id);
    lastSelectedRow = json.Id; 
    $("#grid").jqGrid('setSelection', lastSelectedRow);
}
单击“保存操作”按钮后,“编辑操作”按钮单击将被忽略。首次编辑后,无法重新进入编辑模式

如何解决此问题,以便保存后再次单击“编辑”按钮可以编辑行

更新

我按照Oleg答案中的建议添加了$(this).focus(),并按照Oleg在其他优秀答案中的建议将id更改包装到setTimeout中:

function aftersavefunc(rowID, response) {
    restoreActionsIcons();
    $(this).focus();
    $('#grid').jqGrid('resetSelection'); 
    var json = $.parseJSON(response.responseText);
    setTimeout(function () {
        $("#" + rowID).attr("id", json.Id);
        lastSelectedRow = json.Id;
        $("#grid").jqGrid('setSelection', lastSelectedRow);
    }, 50);
}
问题依然存在。该问题可能与行id更改有关,因为:

  • 它只出现在最后一行(保存后id会更改)。如果responseText返回相同的id,并且实际上没有更改行id,则保存的行不会出现这种情况
  • 如果按下“取消操作”按钮,则不会发生此情况
  • 可能行id需要在resetSelection之外添加额外的ResetID,或者也需要在其他地方更新

    更新2

    我在errorfunc中添加了代码表单更新的答案,并且只使用了英文字符和数字id。这允许多次单击,但会带来其他问题:

    extraparam不再通过。如果rowactions()调用被注释掉,extraparam将随rowactions调用一起传递extraparam未传递

    我更改了jqGrid源代码,并向rowactions方法添加了警报:

    alert( cm.formatoptions);
    if (!$.fmatter.isUndefined(cm.formatoptions)) {
      op = $.extend(op, cm.formatoptions);
      }
    
    首先单击警报输出“对象”。在随后单击保存按钮时,它输出未定义的内容。因此,由于未知原因,formatoptions被清除

    评论意见:

  • testcase中未使用绝对url。Datasource设置为localarray。 我验证了testcase在IE和FF中工作,无需外部url访问。 对于extraparam问题,我可以创建新的测试用例

  • 如果没有图像,则在光标移动到它们上方时,会显示目录按钮。 缺少图像目录仍允许再现问题

  • FormData函数在js文件中定义


  • 由于新问题发生在添加rowactions()调用之后,并且如果删除这些调用则不会发生,因此这似乎与回答中建议的代码有关。

    我认为问题的存在是因为隐藏了当前焦点所在的按钮。请看下面的代码。如果删除行
    $(this).focus();/将焦点设置在某个地方
    其中一个问题与您描述的问题相同。因此,我建议您在隐藏当前具有焦点的按钮后,尝试将焦点设置在某个位置,例如在
    restoreActionsIcons
    中,将焦点设置到网格的
    元素的任何位置。我不能测试这个,但我希望它会有帮助

    更新:我再次检查了您的问题,希望能为您提供解决方案

    你的问题可以分为两个子问题。您的主要问题是更改行的id。所以这不是每个人都有的共同问题

    问题是“操作”格式化程序直接在HTML代码中创建
    onclick
    函数(参见示例):

    因此,函数将包含原始的rowid。要解决此问题,您可以在中的
    setTimeout
    内修改
    aftersavefunc
    的代码片段

    $("#" + rowID).attr("id", json.Id);
    lastSelectedRow = json.Id;
    $("#grid").jqGrid('setSelection', lastSelectedRow);
    
    类似于以下内容:

    var $tr = $("#" + rowID),
        $divEdit = $tr.find("div.ui-inline-edit"),
        $divDel = $tr.find("div.ui-inline-del"),
        $divSave = $tr.find("div.ui-inline-save"),
        $divCancel = $tr.find("div.ui-inline-cancel");
    
    $tr.attr("id", json.Id);
    if ($divEdit.length > 0) {
        $divEdit[0].onclick = function () {
            $.fn.fmatter.rowactions(newId,'grid','edit',0);
        };
    }
    if ($divDel.length > 0) {
        $divDel[0].onclick = function () {
            $.fn.fmatter.rowactions(newId,'grid','del',0);
        };
    }
    if ($divSave.length > 0) {
        $divSave[0].onclick = function () {
            $.fn.fmatter.rowactions(newId,'grid','save',0);
        };
    }
    if ($divCancel.length > 0) {
        $divCancel[0].onclick = function () {
            $.fn.fmatter.rowactions(newId,'grid','cancel',0);
        };
    }
    lastSelectedRow = json.Id;
    $("#grid").jqGrid('setSelection', lastSelectedRow);
    
    第二个问题是在ID中使用特殊字符。我在中发现了一个bug,需要修复该bug以支持ID中的特殊字符。问题是在
    jquery.fmatter.js
    行中,原始rowid参数
    rid
    将被更改:

    rid = $.jgrid.jqID( rid )
    
    稍后,到处都将使用修改过的id。例如,在id中是
    my.id
    ,编码版本将是
    my\\.id
    。对于代码的大多数位置,它都是正确的(请参阅),但作为
    editRow
    saveRow
    restoreRow
    delGridRow
    setSelection
    editGridRow
    (请参阅行-)的rowid参数,它是不正确的。因此,必须修复代码,以使用调用的原始未转义(未编码)
    rid

    我想我明天会发布相应的bug报告,并在中提供建议


    更新2:代码
    $.fn.fmatter.rowactions(newId,'grid','edit',0)只是一个例子。我从你发给我的测试演示中得到的。当然,您应该根据自己的需要修改代码。例如,您可以从您使用的网格id中的
    $.fn.fmatter.rowactions
    的第二个参数中看到的方式:'grid','list'类似于
    myGrid[0]。id
    。最后一个参数应该是
    colModel
    中具有
    formatter:'actions'
    的列的索引。您可以在旧问题上使用
    getColumnIndexByName
    函数来按列名获取索引。

    我认为问题的存在是因为隐藏了当前焦点所在的按钮。请看下面的代码。如果删除行
    $(this).focus();/将焦点设置在某个地方
    其中一个问题与您描述的问题相同。因此,我建议您在隐藏当前具有焦点的按钮后,尝试将焦点设置在某个位置,例如在
    restoreActionsIcons
    中,将焦点设置到网格的
    元素的任何位置。我不能测试这个,但我希望它会有帮助

    更新:我再次检查了您的问题,希望能为您提供解决方案

    你的问题可以分为两个子问题。您的主要问题是更改行的id。所以这不是每个人都有的共同问题

    问题是“操作”格式化程序直接在HTML代码中创建
    onclick
    函数(参见示例):

    所以
    rid = $.jgrid.jqID( rid )