2014-08-30 33 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');