jqGrid内联编辑:防止用户在编辑行外单击(防止取消编辑/添加行)

时间:2014-08-30 01:45:33

标签: javascript jquery jqgrid

下午好,

今天下半年我一直坚持这个问题:

我有一个启用了内联添加/编辑的jqGrid。一切都很好,但是,我试图阻止正在编辑/添加的行在用户单击另一行时自动取消。我已经尝试在'beforeSelectRow'中的'resetSelection','beforeSelectRow'中正在编辑的行的.setSelection中返回false,将所有非“可编辑”行设置为禁用;一切都无济于事。此外,似乎一旦用户(我此刻)点击另一行,就不会触发'gridID_licancel'按钮;编辑/添加“会话”通过其他方法直接取消。

我希望能够在其源代码中隐藏此行为,因为在“beforeSelectRow”事件触发之前取消添加/编辑会话并且未通过'gridID_licancel'点击的触发器发生事件。

当然,在编辑或添加行时,用户不应该像所有其他行上的疯子一样点击,或者不是,但是,我预见到对此功能的反馈。这些行中没有很多空间,用户可能会错过“保存”按钮,这是行可编辑时内联生成的按钮,然后单击另一行并且必须重新开始。仅仅使行更高不是一个合法的解决方案。

另一点需要注意,只有在点击网格上的另一行时才会发生此行为。我正在使用模式对话框,其中包含一个带标签的div,每个选项卡都有自己的表单。此特定网格中的一行可以坐在那里等待编辑,用户可以转到另一个选项卡,提交数据,返回,并且该行仍在等待编辑;它不是自动取消自己。此外,在此网格上我已经设置了网格的高度,因此如果用户单击没有行的网格的空白区域,则不会取消编辑/添加会话。因此,只有在点击另一行时才会发生这种情况。

因此,当用户正在编辑一行时,如何在取消添加/编辑会话之前捕获另一行的选择?谢谢你的帮助。

1 个答案:

答案 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');