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

时间:2011-08-30 18:03:27

标签: 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,"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(),并将id更改包含在setTimeout中,而Oleg建议在其他很好的答案中使用:

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更改有关:

  1. 仅在最后一行(保存后更改id)中出现。对于保存的行,它不会发生,其中responseText返回相同的id,而行ID实际上没有更改。
  2. 如果按下取消操作按钮,则不会发生。
  3. 也许row id需要为resetSelection添加额外的重置ID,或者需要在其他地方更新。

    UPDATE2

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

    extraparam不再传递。如果rowactions()调用被注释掉,则传递extraparam with rowactions调用extraparam 未传递

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

    alert( cm.formatoptions);
    if (!$.fmatter.isUndefined(cm.formatoptions)) {
      op = $.extend(op, cm.formatoptions);
      }
    

    首先点击警报输出'对象'。在单击“保存”按钮后,它会输出undefined。因此,由于未知原因,格式选项被清除。

    评论评论:

    1. 不使用测试用例中的绝对网址。数据源设置为localarray。 我验证了测试用例在IE和FF中工作,没有外部URL访问。 对于extraparam问题,我可以创建新的测试用例。

    2. 没有图像目录按钮显示在光标上移动它们。 缺少图像目录仍然可以重现该问题。

    3. FormData函数在js文件中定义。

    4. 由于在添加rowactions()调用后发生新问题,并且如果删除了这些调用,则不会发生这种情况,这似乎与答案中提出的代码有关。

1 个答案:

答案 0 :(得分:1)

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

更新:我再次检查了您的问题,希望我能为您推荐一个解决方案。

你的问题可以分为两个子问题。主要问题是更改行的ID 。所以这并不是每个人都有的常见问题。

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

ocl = "onclick=$.fn.fmatter.rowactions('"+rowid+"','"+opts.gid+"','edit',"+opts.pos+");..."

因此函数将包含原始 rowid。要解决此问题,您可以从

修改aftersavefuncsetTimeout的代码片段
$("#" + 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中使用特殊字符。我在$.fn.fmatter.rowactions中发现了一个需要修复的错误,以支持ID中的特殊字符。问题是在jquery.fmatter.js的{​​{3}}行中,原始rowid参数rid将会更改:

rid = $.jgrid.jqID( rid )

以后到处都会使用修改后的id。例如,在id为my.id时,编码版本将为my\\.id。它适用于407代码的大部分位置(请参阅$.fn.fmatter.rowactions),但它不正确editRowsaveRow,{{1}的rowid参数},restoreRowdelGridRowsetSelection(参见here行 - 433)。因此,必须修复代码,以使用调用了453原始未转义(未编码) editGridRow值。

我想我会在明天发布相应的错误报告以及$.fn.fmatter.rowactions中的建议。

更新2 :我上面写的代码rid 只是一个例子。我从您发送给我的测试演示中获取了它。您当然应该修改代码以达到您的目的。例如,您可以从the trirand forum查看您使用的网格ID中$.fn.fmatter.rowactions(newId,'grid','edit',0);的第二个参数:'grid','list',如$.fn.fmatter.rowactions。最后一个参数应该是myGrid[0].idformatter:'actions'列的索引。您可以在旧问题上使用colModel中的getColumnIndexByName函数来按列名称获取索引。