2012-02-04 93 views
14

Estoy tratando de 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 hago 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 el 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?Cómo actualizar el valor de los datos en jqgrid

ACTUALIZACIÓN:

Poner en mi código que no está dando un error pero no para 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); 
} 

Este no es el ciclismo a través de todos los elementos de la matriz que son localmente cargada . Por ejemplo, si el tamaño de página está establecido en 30, el alert(j) devuelve 30, a pesar de la cantidad de elementos que 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?

Respuesta

30

Si usa loadonce: true, debe saber donde los datos locales serán retenidos por jqGrid. jqGrid tiene dos opciones: data y _index. El data es una matriz de elementos donde cada elemento tiene la propiedad de nombre name propiedad de las columnas de colModel. Si necesita encontrar el elemento por id (rowid), puede usar _index[rowid] en el elemento con rowid en la matriz data. Así que para cambiar los datos de la columna 'myColumn' usted 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 utilizar documentado getLocalRow método 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; 
+0

Lo siento, pero no entiendo completamente esto. ¿Cómo hago un 'dataArray [indexes [rowid]]. MyColumn'? sería el código exacto para una columna llamada personName ser: dataArray [indexes [rowid]]. 'personName'? Porque eso causó un error. Además, ¿por qué también tengo que llamar a setCell? Si realmente estoy modificando el conjunto de datos, ¿las representaciones futuras de los datos no mostrarán los nuevos valores? – WildBill

+0

Además, en tu código dices llamar a 'setCell' y luego modificar la matriz de datos. La matriz de datos debería ser mucho más grande que solo las celdas con las que setCell funcionará, ¿correcto? Ya no debería necesitar llamar a setCell cada vez que paso por las páginas, ordenar o filtrar, corregir? – WildBill

+2

@WildBill: 'dataArray [indexes [rowid]]. PersonName' o' dataArray [indexes [rowid]] ['personName'] 'cambiará solo los datos * internal * jqGrid, pero no el contenido del' ' elemento de la cuadrícula Puede modificar los datos internos y llamar a 'trigger (' reloadGrid ') ', pero el uso de' setCell' es mejor que la recarga completa de la grilla. – Oleg

0

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

importante es el índice, que puede obtener llamando al método getInd. Porque rowID! = Índice de localRowData. (Eq rowid:. Jqg204, Índice: 5)

EDIT: si set ": true" en colmodel puede establecer su propia rowid (diversa de mi ejemplo "JQG ###", por lo general una de PK una tabla de base de datos)

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

hope that helps!

0

Tuve un problema similar:
Necesitaba actualizar una fila después de una determinada acción del usuario (irrelevante).
Para eso, necesitaba saber la fila exacta del objeto 'datos', incluso después de algunos filtros de la tabla.
así que encontré una manera de identificar qué fila se cambió - añadí una propiedad ROWID para cada elemento del objeto los 'datos', en la 'LoadComplete' caso:

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 formateador de código , 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'

Cuestiones relacionadas