编辑格式化程序操作按钮放在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事件
中将新行添加到jqgridvar 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更改有关:
也许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。因此,由于未知原因,格式选项被清除。
评论评论:
不使用测试用例中的绝对网址。数据源设置为localarray。 我验证了测试用例在IE和FF中工作,没有外部URL访问。 对于extraparam问题,我可以创建新的测试用例。
没有图像目录按钮显示在光标上移动它们。 缺少图像目录仍然可以重现该问题。
FormData函数在js文件中定义。
由于在添加rowactions()调用后发生新问题,并且如果删除了这些调用,则不会发生这种情况,这似乎与答案中提出的代码有关。
答案 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。要解决此问题,您可以从
修改aftersavefunc
内setTimeout
的代码片段
$("#" + 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),但它不正确editRow
,saveRow
,{{1}的rowid参数},restoreRow
,delGridRow
和setSelection
(参见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].id
中formatter:'actions'
列的索引。您可以在旧问题上使用colModel
中的getColumnIndexByName
函数来按列名称获取索引。