web-dev-qa-db-fra.com

Comment mettre à jour la valeur des données dans jqgrid

J'essaie de mettre à jour une cellule dans jqgrid de manière permanente lors du chargement. Je sais que je peux utiliser setCell mais cela ne fait que mettre à jour la valeur de cette page. Si je reviens à la page si je n'explicite pas explicitement, une autre setCell pour la cellule, l'ancienne valeur est affichée. J'ai également essayé setRowData, mais il semble que ce soit la même chose. J'utilise la variable loadonce car mon approche consiste à 1) charger les données 2) modifier quelques valeurs des données en fonction de certains critères 3) afficher les valeurs modifiées. Comme j'utilise loadonce, ne devrait-il pas y avoir un moyen de modifier une cellule de façon permanente dans cette session?

METTRE À JOUR:

Mettre dans mon code qui ne donne pas d'erreur mais ne pas parcourir toutes les données:

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

Cela ne permet pas de parcourir tous les éléments du tableau chargés localement. Par exemple, si la taille de la page est définie sur 30, la alert(j) renvoie 30, malgré le nombre d'éléments que j'ai chargés localement. Toutefois, si j’actualise le graphique, j est le nombre correct. Pourquoi le comportement de getGridParam est-il différent dans chaque cas?

14
WildBill

Si vous utilisez loadonce: true, vous devriez savoir les données locales seront conservées par jqGrid. jqGrid a deux options: data et _index. data est un tableau d'éléments dans lequel chaque élément a la propriété name comme propriété name des colonnes de colModel. Si vous avez besoin de trouver l'élément par id (rowid), vous pouvez utiliser _index[rowid] pour l'élément avec l'identifiant de ligne dans le tableau data. Donc, pour changer les données dans la colonne 'myColumn', procédez comme suit:

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

UPDATED: vous pouvez utiliser la méthode documentée getLocalRow pour modifier les données 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;
31
Oleg

Pour tous ceux qui sont venus ici de google, voici une réponse mise à jour!

l’important est l’index que vous pouvez obtenir en appelant getInd-Method. Parce que rowID! = Index de localRowData. (éq. rowId: jqg204, index: 5)

EDIT: si défini "key: true" dans colmodel, vous pouvez définir votre propre rowId (différent de mon exemple "jqg ###", généralement une PK d'une table de base de données) 

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

j'espère que cela pourra aider!

0
fr4nk

J'ai eu un problème similaire:
Je devais mettre à jour une ligne sur une certaine action de l'utilisateur (non pertinent).
.__ Pour cela, je devais connaître la rangée exacte de l'objet 'data', même après un filtrage de la table.
J'ai donc trouvé un moyen d'identifier la ligne modifiée - j'ai ajouté une propriété RowID pour chaque élément de l'objet 'data', lors de l'événement 'loadComplete':

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

Et maintenant, au niveau du code du formateur, j'ai pu accéder à rData.RowID pour identifier la ligne exacte sur laquelle l'action a été effectuée et obtenir/définir sa représentation 'data'

0
Alonzzo2