2011-08-02 167 views
0

在我們的應用程序中,用戶可以同時編輯多行。當他點擊保存按鈕時,所有的行都會逐一保存到數據庫中。jqGrid,禁用編輯行

我遇到的問題是,當用戶填寫一些錯誤的例如跳過一個必填字段我想取消保存從那裏和用戶應該能夠糾正錯誤。

我在我的解決方案中缺少的是,我不知道如何在編輯模式中將行保存成功後禁用原始狀態。如果我執行restoreRow,則會顯示編輯前的舊值。

我的代碼(我把我的jqGrid在一個變量叫做網格):

function saveGrid() { 
     var saveCollection = []; 
     //Collect all rows in editmode, the rows to be saved. 
     $.each(grid.getDataIDs(), function (index, id) { 
      var row = grid.getInd(id, true); 
      if (row !== false) { 
       if ($(row).attr('editable') === '1') { 
        saveCollection.push(id); 
       } 
      } 
     }); 

     //Function to save single row. 
     function saveSingleRow(rowId) { 
      var success = false; 
      grid.saveRow(rowId, function() { 
       //Row successfully saved. 
       success = true; 

       //Here I want to restore the row somehow but not with the old values. 
      }); 

      //If everything worked out, save next row if there are any left. 
      if (success) { 
       saveCollection = $.grep(saveCollection, function (obj) { 
        return obj !== rowId; 
       }); 

       if (saveCollection.length > 0) { 
        return saveSingleRow(saveCollection[0]); 
       } 
      } 

      //If error or the last row, return success status. 
      return success; 
     } 

     //Check if there are any rows in editmode, then begin to save each row. 
     if (saveCollection.length > 0) { 
      if (!saveSingleRow(saveCollection[0])) { 
       //If something went wrong during saving cancel and return from this function. 
       return; 
      } 
     } 
     //Every row was successfully saved. Reload grid. 
     grid.trigger('reloadGrid'); 
    } 

正如你所看到的,發生一次錯誤,將它從服務器或存儲過程停止驗證錯誤和返回false。但如果發生這種情況讓我們說第四行,那麼第一行到第三行已經成功保存,但仍處於編輯模式。然後用戶會覺得這些行沒有保存。

這是我如何打開我的行進行編輯(內聯編輯)。它發生在用戶點擊工具欄上的編輯按鈕時:

var rows = $.grep(grid.getGridParam('selarrrow'), function() { return true; }); 
if (rows !== null && rows.length > 0) { 
    $.each(rows, function (i1, gr) { 
     if (gr !== null) { 
      grid.editRow(gr, false); 
     } 
    }); 
} 

那麼有沒有一種「反編輯」功能?我現在無法提出更好的主要解決方案。有沒有辦法在開始保存過程之前檢查是否有任何驗證錯誤?然後我可以檢查,然後將所有行發送到服務器並將它們保存在一個事務中。

感謝任何幫助!謝謝。

已更新 解決方案是沒有函數可以在保存後再次鎖定行。這應該在保存成功時自動完成。在這種情況下,問題在於,添加在保存成功返回客戶端後運行的回調函數時,必須返回true才能發生此情況。 所以這是少了什麼(在底部的語句:返回true):

grid.saveRow(rowId, function() { 
       //Row successfully saved. 
       success = true; 

       //Here I want to restore the row somehow but not with the old values. 
       return true; 
      }); 

回答

1

在我看來,你應該加上「未編輯的行」類後的行(<tr>元)成功保存更改。有關詳細信息和演示,請參閱the answer

更新根據評論的討論:您描述的內容向我展示了保存行在您的演示中不正確。成功保存後saveRow關閉保存行的編輯模式。我創建了the demo,它執行您所描述的操作,但僅使用本地編輯。在將數據保存在服務器上的情況下,所有應該以同樣的方式工作。

在您寫下的評論中,「如果另一個用戶當前處於另一臺計算機上的編輯模式下,網格被鎖定以進行編輯」。在Web應用程序中,數據庫中的數據鎖定在我看來是不好的做法。在斷開與客戶端的連接或發生其他錯誤時,您可以輕鬆鎖定數據庫中的數據,並且不會連接任何客戶端。一般使用optimistic concurrency control代替。有關詳細信息,請參閱herehere

+0

不幸的是,它沒有工作。我不確定我是否清楚我的問題。我編輯了這篇文章,並添加了如何打開我的行進行編輯的代碼。在用戶編輯數據時,行始終以編輯模式打開。如果保存成功,那麼我會重新加載網格,並且這些行會回到它們原始的只讀狀態。但是,如果在保存過程中出現錯誤,我需要將這些行成功保存以恢復到原始狀態。應用課程並沒有解決問題,我沒有想到它會。 – John

+0

對於它的工作,然後元素必須偵聽添加css類時觸發的事件。檢查該類是否爲「不可編輯 - 行」,如果是,則操縱網格。我相信我正在尋找一種方法,或者我可能會迭代單元格,刪除輸入元素並添加一個跨度而不是相同的值。但在我開始破解之前,我正在尋找內置的功能,如果它存在。 – John

+0

@John:對不起,但我不確定我是否理解你的正確。要中止行的內聯編輯,可以使用[restoreRow](http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#restorerow)。爲了防止行被編輯(直到重新加載網格),可以使用「不可編輯行」類。您問到「在成功保存行後如何禁用編輯模式下的行到原始狀態」。然後你寫道:「我需要將行成功保存回原始狀態」,這是我無法理解的。你如何保存行? – Oleg