2011-08-05 43 views
0

我是jqGrid的新手,所以希望有人能指出我正確的方向。如何在使用jqGrid'editGridRow'創建新行而不是自動生成的行ID時提供行ID jqg1

基本上,我使用jgGrid來顯示一個日期和費用的列表,我已經從一個文件中讀取,我希望用戶能夠修改或添加新條目或刪除現有條目。當用戶點擊屏幕上的按鈕「應用」來回發表單時,我讀出了jqGrid並以JSON字符串的形式返回給服務器。

我的問題是,當我添加新行(通過'editGridRow')時,jqGrid使用它的自動生成jqg1,jg2,jg3等,並且新行被填充在網格的頂部而不是在他們的行ID位置,即在網格的底部。

我能夠根據需要生成RowID,但是我似乎無法在創建新條目時將它們提供給'editGridRow',相反它似乎不得不使用關鍵字「new」。

您知道我使用editGridRow而不是addRowData的原因是editGridRow爲用戶輸入數據創建了一個模式對話框。

任何幫助,將不勝感激。

This is what I would like to use to supply a row ID: $("#tableGrid").jqGrid('editGridRow', gridRowID, {reloadAfterSubmit:false});

This is what I have to use to get the code to work: $("#tableGrid").jqGrid('editGridRow', "new", {reloadAfterSubmit:false});

這裏是代碼片段我用我的JSP創建gqGrid:

var gridRowID = ${costHistoryEntries}.length

$("document").ready(function() { 

      $("#tableGrid").jqGrid({ 
       data: ${costHistoryEntries}, 
       datatype: "local", 
       height: 200, 
       colNames:['Date', 'Cost'], 
       colModel:[ 
         {name:'chdate', index:'chdate', width:110, sorttype:"date", editable:true, editrules:{date:true, required:true, custom:true, custom_func:checkDate}, datefmt:'d/m/Y'}, 
         {name:'cost', index:'cost', width:160, align:"right", sorttype:"float", editable:true, editrules:{number:true, required:true}, formatter:'float'}, 
       ], 
       autowidth: true, 
       loadonce: true, 
       sortname: 'chdate', 
       sortorder: "desc", 
       rowList:[10, 20, 30], 
       pager: jQuery('#tablePager'), 
       viewrecords: true, 
       editurl: '/myurl', 
       caption: "Cost History Entries" } 

      ); 

      $("#tableGrid").jqGrid('navGrid', "#tablePager", {edit:true, add:true, del:true, search:true, refresh:true}); 

      $("#addEntry").click(function() { 
       gridRowID++; 
       $("#tableGrid").jqGrid('editGridRow', "new", {reloadAfterSubmit:false}); 
      }); 
    }); 

我還創建了一個按鈕,並將其鏈接到「的addEntry」作爲一種替代方式使用jqGrid Navigator「添加/編輯/刪除/查找/重新加載」欄添加一個新行。正如您在加載網格之前所看到的那樣,我在gridRowID中存儲了條目的數量。我希望能夠在「#addEntry」單擊函數中執行的操作是使用更新後的gridRowID作爲RowID參數。

作爲FYI: 在先前版本的代碼我用下面的數據加載到網格:

  var griddata = ${costHistoryEntries}; 
      for (var i=0; i <= griddata.length; i++) { 
       $("#tableGrid").jqGrid('addRowData', i+1, griddata[i], "last"); 
      } 

卻發現我能做到這同樣與

data: ${costHistoryEntries}, 

兩個版本都正確地爲服務器提供的示例數據創建行ID: [{「chdate」:「20/05/2011」,「cost」:「0.111」},{「chdate」:「01/06 /2011","cost":"0.222"},{"chdate":"07/07/2011","cost":"0.333「}]

我的問題是添加新的數據行。

進一步更新在服務器端,作爲一個測試,我截獲了帖子到/ myurl並將id從「_empty」更新爲「7」,但jqGrid中的新條目仍然有一個自動生成的jqGrid行ID「jqg1」 :

Key = chdate, Value = 26/09/2011 
Key = oper, Value = add 
Key = cost, Value = 14 
Key = id, Value = _empty 

Updated Key = chdate, Value = 26/09/2011 
Updated Key = oper, Value = add 
Updated Key = cost, Value = 14 
Updated Key = id, Value = 7 
+0

確認數據是否來自'/ myurl'的服務器對'oper =「add」'和'id =「_ empty」作爲參數的響應?服務器響應應該只是「7」。 「Content-Type」具有服務器響應可能更爲重要。 – Oleg

回答

1

我不太瞭解你的要求。你從服務器獲取jqGrid的輸入,但是使用datatype: "local"而不是datatype: "json",例如,它指示jqGrid根據需要隨時獲取服務器的Ajax請求以獲取數據。此外,你想保存在服務器上的日期,但使用editurl: '/dummyurl'而不是真實服務器的網址。editurl將從$("#tableGrid").jqGrid('editGridRow', "new", {reloadAfterSubmit:false});獲得輸入數據,並應回發新生成的行的標識。這不是你想要的嗎?

所以我的建議是使用基於datatype一些服務器(韌皮是datatype: "json"),並以同樣的方式使用真實editurl其保存在服務器上(大多在數據庫)中的數據並將其放置在服務器響應的ID在新生成的數據項上。

修訂:如果您使用editGridRow的reloadAfterSubmit: false選項,你必須使用afterSubmit事件處理程序reloadAfterSubmit該解碼服務器響應一起格式[true,'',new_id]返回結果。例如,如果你的服務器只返回新的rowid作爲您可以使用的數據

$("#tableGrid").jqGrid('editGridRow', "new", 
    { 
     reloadAfterSubmit: false, 
     afterSubmit: function (response) { 
      return [true, '', response.responseText]; 
     } 
    } 
); 
+0

嗨@Oleg謝謝你的回覆。是的,我從服務器獲取數據。我使用數據類型:「本地」而不是數據類型:「json」,因爲我只想從服務器獲取數據,一次允許用戶根據需要更新數據,然後然後將數據更新回更新的數據到服務器。所有數據檢查都是通過Java腳本函數checkDate()在JSP頁面本地處理的,該函數檢查日期是否在作爲請求中參數傳遞的有效範圍內。我的editurl是一個真正的URL(抱歉混淆)。 – adrnola

+0

@adrnola:最好使用'datatype:「json」'而不是分別加載數據並使用'datatype:「local」'和'data:$ {costHistoryEntries}'。關於'ajaxGridOptions',您可以根據需要自定義jqGrid使用的'ajax'請求。如果需要,您可以另外使用'loadonce:true'。但'datatype'不是你的主要問題。 – Oleg

+0

@adrnola:你會在我的答案的UPDATED部分找到你的主要問題的答案。 – Oleg