2012-02-04 115 views
14

我試圖在加載時永久更新jqgrid中的單元格。我知道我可以使用setCell,但只更新該頁面的值。如果我沒有明確地爲單元格執行另一個setCell,則返回頁面,顯示舊值。我也嘗試過setRowData,但它似乎在做同樣的事情。我正在使用loadonce,因爲我的方法是1)加載數據2)根據某些標準修改數據的某些值3)顯示修改的值。由於我使用loadonce不應該有一種方法來在此會話中永久修改單元格嗎?如何更新jqgrid中的數據值

UPDATE:

把我的代碼是不是給了一個錯誤,但未能通過所有的數據迭代:

var set = 0; 

.... 

gridComplete: function(data){ 
    setData(); 
}, 

.... 

beforeRefresh: function(data){ 
    set = 0; 
}, 

.... 

function setData(){ 

if(set == 1) return; 
... //create hash up here 
    var dataArray = jQuery("#grid").jqGrid('getGridParam', 'data'); 
    var j = 1; 
    for (var rows in dataArray) { 
    var key = dataArray[rows].name; 
    dataArray[rows].level = hashTable[key]; 
    j++; 
    } 
    alert(j); 
} 

這不是遍歷數組中的是本地加載的所有物品循環。例如,如果頁面大小設置爲30,則儘管有多少項目已在本地加載,但alert(j)將返回30。但是,如果我刷新圖表,j是正確的數字。爲什麼getGridParam的行爲在每種情況下都有所不同?

回答

30

如果您使用loadonce: true,您應該知道,其中本地數據將由jqGrid保存。 jqGrid有兩個選項:data_indexdata是一組項目,其中每個項目的名稱屬性均爲colModel列中的name屬性。如果您需要通過id(rowid)查找項目,則可以使用_index[rowid]指定data陣列中rowid的項目。因此,要改變列的數據'myColumn'你應該做到以下幾點:

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
var dataArray = myGrid.jqGrid('getGridParam', 'data'), 
    indexes = myGrid.jqGrid('getGridParam', '_index'); 
dataArray[indexes[rowid]].myColumn = newValue; 

修訂:您可以使用記錄getLocalRow方法來改變本地數據:

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
myGrid.jqGrid('getLocalRow', rowid).myColumn = newValue; 
+0

對不起,但我不完全理解這一點。我如何做'dataArray [索引[rowid]]。myColumn'?一個名爲personName的列的確切代碼是:dataArray [indexes [rowid]]。'personName'?因爲這導致了一個錯誤。另外,爲什麼我還必須調用setCell?如果我真的在修改數據數組,數據的未來渲染不會顯示新值嗎? – WildBill 2012-02-04 23:00:15

+0

另外,在你的代碼中你說要調用'setCell',然後修改數據數組。數據數組應該比只有setCell可以使用的單元大得多,對嗎?每當我循環頁面,排序或過濾時,我不再需要調用setCell? – WildBill 2012-02-04 23:01:33

+2

@WildBill:dataArray [indexes [rowid]]。personName'或'dataArray [indexes [rowid]] ['personName']'將只改變* internal * jqGrid數據,但不會改變'​​'網格的元素。你可以修改內部數據並調用'trigger('reloadGrid')',但是'setCell'的使用更適合完全重新加載網格。 – Oleg 2012-02-04 23:06:55

0

對於所有誰來到這裏從谷歌,這裏是一個更新的答案!

重要的是索引,你可以通過調用getInd-Method來獲得索引。因爲rowID!= localRowData的索引。 (EQ ROWID:jqg204,指數:5)

編輯:如果設置 「鍵:真正的」 在colmodel你可以從我的例子 「jqg ###」,通常是從PK設置自己的ROWID(不同勢數據庫表)

var ind = myGrid.getInd(rowId); 
var localRowData = myGrid.jqGrid('getLocalRow', ind); 
localRowData.myColumn = newValue; 

希望有幫助!

0

我有類似的問題:
我需要更新一個特定的用戶行動(無關)行。
爲此,我需要知道'data'對象中的確切行,即使在對錶進行一些過濾之後。
於是我找到了一種方法來確定哪些行已被改變 - 我加了一個rowid屬性爲「數據」對象的每一個項目,在「loadComplete」事件:

loadComplete: function() { 
      if (firstRun) { 
       firstRun = false; 
       var dataArray = $('#jqGrid').jqGrid('getGridParam', 'data'); 
       $(dataArray).each(function (index) { 
        dataArray[index].RowID = index + 1; 
       }); 
      } 
     } 

而現在,在格式化代碼,我能夠訪問rData。RowID來標識採取操作的確切行,並獲取/設置其'數據'表示