2014-08-30 80 views
0

下午好防止用户,jqGrid的内置编辑:从点击外面排了正在编辑的(防止取消编辑/添加行)

我一直停留在这个问题上的今天后半段:

我有一个内联添加/编辑启用jqGrid。一切都很好,但是,我试图阻止一旦用户单击另一行时被编辑/添加的行被自动取消。 'beforeSelectRow','resetSelection','beforeSelectRow',.setSelect在'beforeSelectRow'内编辑的行,将所有非“可编辑”行设置为禁用;一切都无济于事。此外,看起来好像'gridID_licancel'按钮没有被触发,一旦用户(我在此刻)点击另一行;编辑/添加“会话”直接通过其他方法取消。

我希望能够在源代码中挂钩此行为,因为添加/编辑会话的取消发生在'beforeSelectRow'事件触发之前且未通过'gridID_licancel'触发器发生,点击事件。当然,在编辑或添加行时,用户不应该像在所有其他行上的疯子一样出局点击,但是,我预见到对此功能的反馈。在这些行中没有很多空间,对于用户来说只是错过了“保存”按钮(在行变为可编辑时内联生成),并且点击另一行并且必须重新开始。仅仅增加行高并不是一个合理的解决方案。

还有一点需要注意,这种行为只发生在点击网格上的另一行时。我正在使用模态对话框,里面有一个选项卡,每个选项卡都有自己的形式。此特定网格中的一行可以坐在那里等待编辑,用户可以转到另一个选项卡,提交数据,返回,并且该行仍在等待编辑;它不会自动取消。另外,在这个网格上我很难设置网格的高度,所以如果用户点击没有行的网格的空白区域,编辑/添加会话不会被取消。所以,这只发生在另一行被点击。

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

回答

0

实际上,我是能够找到必要的(但文档中缺少的)代码,甚至允许这种行为:

jqGrid not saving inline row edits

“restoreAfterSelect” inlineNav属性需要被设置为假允许在'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按钮:

$('#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');