下午好,
今天下半年我一直坚持这个问题:
我有一个启用了内联添加/编辑的jqGrid。一切都很好,但是,我试图阻止正在编辑/添加的行在用户单击另一行时自动取消。我已经尝试在'beforeSelectRow'中的'resetSelection','beforeSelectRow'中正在编辑的行的.setSelection中返回false,将所有非“可编辑”行设置为禁用;一切都无济于事。此外,似乎一旦用户(我此刻)点击另一行,就不会触发'gridID_licancel'按钮;编辑/添加“会话”通过其他方法直接取消。
我希望能够在其源代码中隐藏此行为,因为在“beforeSelectRow”事件触发之前取消添加/编辑会话并且未通过'gridID_licancel'点击的触发器发生事件。
当然,在编辑或添加行时,用户不应该像所有其他行上的疯子一样点击,或者不是,但是,我预见到对此功能的反馈。这些行中没有很多空间,用户可能会错过“保存”按钮,这是行可编辑时内联生成的按钮,然后单击另一行并且必须重新开始。仅仅使行更高不是一个合法的解决方案。
另一点需要注意,只有在点击网格上的另一行时才会发生此行为。我正在使用模式对话框,其中包含一个带标签的div,每个选项卡都有自己的表单。此特定网格中的一行可以坐在那里等待编辑,用户可以转到另一个选项卡,提交数据,返回,并且该行仍在等待编辑;它不是自动取消自己。此外,在此网格上我已经设置了网格的高度,因此如果用户单击没有行的网格的空白区域,则不会取消编辑/添加会话。因此,只有在点击另一行时才会发生这种情况。
因此,当用户正在编辑一行时,如何在取消添加/编辑会话之前捕获另一行的选择?谢谢你的帮助。
答案 0 :(得分:0)
我实际上能够找到必要的(但在文档中缺失)代码甚至允许这种行为:
jqGrid not saving inline row edits
需要将'restoreAfterSelect' inlineNav属性设置为false,以允许在'onSelectRow','beforeSelectRow','ondblClickRow'或'onRightClickRow'中进行任何类型的操作。
虽然当用户在编辑另一行时双击另一行(例如你确定要结束当前会话等等)时,我能够召唤一个功能完备的确认对话框,但我无法实现处理上下文菜单时也一样成功。我尝试只在右键单击上绑定上下文菜单,而不是在加载完成时,但是菜单只会出现在每三分之一左右,单击。尝试了其他更失败的尝试,但我忘记了他们的原因是因为他们的徒劳无功。
我能够做的只是在用户编辑时完全取消绑定上下文菜单事件/功能。如果用户尝试双击另一行,或调出上下文菜单,则会显示一条消息,告诉他们要么完成编辑,要么取消他们是否要编辑/添加/删除其他行。我还设置了取消按钮,以便在单击时刷新网格,以便将上下文菜单重新绑定到每一行。
代码段,如果有人发现它的使用(主要问题是不知道,绊倒'restoreAfterSelect'):
ondblClickRow: function (rowid, iRow, iCol, e) {
var row = $('#tableTask').jqGrid('getGridParam', 'selrow');
var isEditing = $("#" + row).attr("editable") === '1';
if (isEditing) {
showModal('Error', 'You are currently editing a record, please click the cancel button or complete your edits before continuing.', 'frmInsertTask');
$('#tableTask').jqGrid('setGridParam', 'savedRow', [{ 'id': row }]);
$('#tableTask').setSelection(row);
return false;
} else {
$('#tableTask_iledit').trigger('click');
return true;
}
},
beforeSelectRow: function (key, event) {
var lastSel = $(this).jqGrid('getGridParam', 'selrow');
var isEditing = $("#" + lastSel).attr("editable") === '1';
if (isEditing) {
$('#tableTask').jqGrid('setGridParam', 'savedRow', [{ 'id': lastSel }]);
$('#tableTask').setSelection(lastSel);
return false;
} else {
if (lastSel == null) { } else {
$('#tableTask').restoreRow(lastSel);
}
$('#tableTask').setSelection(key);
return true;
}
},
onRightClickRow: function (rowid, iRow, iCol, e) {
var editingRow = null;
var isEditing = false;
var ids = $('#tableTask').getDataIDs();
var row = $('#tableTask').jqGrid('getGridParam', 'selrow');
$(ids).each(function (index, element) {
isEditing = $("#" + element).attr("editable") === '1'
if (isEditing) {
editingRow = element;
return false;
}
});
if (isEditing) {
showModal('Error', 'You are currently editing a record, please click the cancel button or complete your edits before continuing.', 'frmInsertTask');
$('#tableTask').jqGrid('setGridParam', 'savedRow', [{ 'id': editingRow }]);
$('#tableTask').setSelection(editingRow);
return false;
} else {
if (editingRow == null) { } else {
$('#tableTask').restoreRow(editingRow);
}
$('#tableTask').setSelection(rowid);
return true;
}
并且,在#tablename_liadd AND #tablename_liedit按钮的click事件中:
$('#tableTask_iladd, #tableTask_iledit').bind('click', function () {
//if the context menu is visible then hide it. (for sitch where user brings up context menu, but then goes and clicks on the add/edit button.
$('#jqContextMenu').hide();
//while in edit/add mode, user should not be able to bring up the context menu until they end their current session. this context menu is re-bound once the user clicks the cancel button(refreshes the grid) or they save the data they are inputting (will result in a refresh once the transaction is completed).
$("#tableTask tr.jqgrow").unbind('contextmenu');