Cómo actualizar el valor de los datos en jqgrid

Intento actualizar una celda en jqgrid de forma permanente al momento de la carga. Sé que puedo usar setCell pero eso solo actualiza el valor de esa página. Si vuelvo a la página si no realizo explícitamente otro setCell para la celda, se muestra el valor anterior. También probé setRowData, pero parece que está haciendo lo mismo. Estoy usando loadonce ya que mi enfoque es 1) cargar los datos 2) modificar algunos valores de los datos en función de algunos criterios 3) mostrar los valores modificados. Como estoy usando loadonce ¿no debería haber una forma de modificar una celda permanentemente en esta sesión?

ACTUALIZAR:

Poniendo en mi código que no está dando un error pero no puede iterar a través de todos los datos:

 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); } 

Esto no está recorriendo todos los elementos del conjunto que están cargados localmente. Por ejemplo, si el tamaño de página se establece en 30, la alert(j) devuelve 30, a pesar de cuántos elementos he cargado localmente. Sin embargo, si actualizo el gráfico, j es el número correcto. ¿Por qué el comportamiento de getGridParam es diferente en cada caso?

Si usa loadonce: true , debe saber dónde se almacenarán los datos locales mediante jqGrid. jqGrid tiene dos opciones: data y _index . Los data son una matriz de elementos donde cada elemento tiene la propiedad de nombre como propiedad del name de las columnas de colModel . Si necesita encontrar el ítem por id (rowid), puede usar _index[rowid] para el ítem con rowid en la matriz de data . Entonces, para cambiar los datos en la columna 'myColumn' , debe hacer lo siguiente:

 // 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; 

ACTUALIZADO : Puede usar el método getLocalRow documentado para cambiar los datos locales:

 // 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; 

Para todos los que vinieron aquí desde google, ¡aquí hay una respuesta actualizada!

importante es el índice, que puede obtener llamando a getInd-Method. Porque rowID! = Índice de localRowData. (eq. rowId: jqg204, índice: 5)

EDITAR: si establece “key: true” en colmodel, puede establecer su propio rowId (diferente de mi ejemplo “jqg ###”, normalmente un PK de una tabla de base de datos)

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

¡Espero que ayude!

Tuve un problema similar:
Necesitaba actualizar una fila después de cierta acción del usuario (irrelevante).
Para eso, necesitaba saber la fila exacta del objeto ‘datos’, incluso después de algún filtro de la tabla.
Así que encontré una manera de identificar qué fila se modificó: agregué una propiedad RowID para cada elemento del objeto ‘data’, en el evento ‘loadComplete’:

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

Y ahora, en el código del formateador, pude acceder a rData.RowID para identificar la fila exacta en la que se tomó la acción, y para obtener / establecer su representación de ‘datos’