2010-07-12 5 views
1

Je construis une grille complètement "côté client" mais si j'active l'édition en ligne, les modifications que je fais sont perdues si je change la page de la grille.Perte des données de cellule éditées après pagination

Espérons que quelqu'un peut signaler ce que je suis absent

La configuration de la grille est présentée ci-dessous avec la fonction que j'appelle pour le remplir avec des données de test:

var myGrid; 
var lastgridsel; 
jQuery(document).ready(function() { 
    myGrid = jQuery("#mygrid").jqGrid({ 
     datatype: 'local', 
     colModel: [ 
      { name: 'AID', label: 'AID', index: 'AID', width: 100, editable: false, 
       sorttype: "int" }, 
      { name: 'MS', label: 'MS', index: 'MS', width: 300, editable: false }, 
      { name: 'GROUP', label: 'GROUP', index: 'GROUP', width: 100, 
       editable: false }, 
      { name: 'REV', label: 'REV', index: 'REV', width: 100, 
       editable: false }, 
      { name: 'OPT', label: 'OPT', index: 'OPT', width: 100, editable: true, 
       edittype: 'text' } 
     ], 
     pager: '#mypager', 
     rowNum: 10, 
     rowList: [10, 20, 500], 
     viewrecords: true, 
     loadonce: true, 
     autowidth: true, 
     sortname: 'AID', 
     sortorder: 'desc', 
     cellsubmit: 'clientArray', 
     onSelectRow: function(id) { 
      if (id && id !== lastgridsel) { 
       jQuery('#mygrid').saveRow(lastgridsel, false, 'clientArray'); 
       jQuery('#mygrid').editRow(id, true); 
       lastgridsel = id; 
      } 
     } 
    }); 
}); 

var mydata = []; 
function InitNew() { 
    for (var i = 0; i < 100; i++) { 
     mydata.push({ AID: i, MS: "123", GROUP: "456", REV: "78", OPT: "8" }); 
    } 
    myGrid.setGridParam({ data: mydata }).trigger("reloadGrid"); 
} 

Cela montre 10 pages, 100 enregistrements. Si je clique sur la colonne "OPT", je peux changer la valeur dans la zone de texte et quand je clique sur une autre ligne, les données semblent être sauvegardées. Cependant, une fois que je vais sur une autre page et que je reviens à la première page, les données reviennent à leur valeur d'origine.

Répondre

0

Oleg - grâce un million. Votre réponse fonctionne vraiment bien. J'ai posté la question sur le forum officiel de support de jqgrid et il y a une autre solution qui pourrait aider. Le fil est au http://www.trirand.com/blog/?page_id=393/help/losing-edited-cell-data-after-paging/#p18567.

Résumé: Si la construction de la grille à l'aide pur le code clientside, vous devez remplacer

myGrid.setGridParam({ data: mydata }).trigger("reloadGrid"); 

avec

myGrid.setGridParam({ data: mydata }); 
myGrid[0].refreshIndex(); 
myGrid.trigger("reloadGrid"); 
+0

Je dois aussi mentionner qu'il faut une ligne dans les options: localReader: { id: 'AID'}, – jqwha

+0

C'est très bien que maintenant nous avons une solution de travail! J'ai écrit tout à l'heure la suggestion d'inclure la description de la méthode 'refreshIndex' dans la documentation de jqGrid (voir http://www.trirand.com/blog/?page_id=393/bugs/data-parameter-are-not-modified- pendant le montage en ligne/# p18613). – Oleg

2

Je ne suis pas sûr que ce soit un bug dans la version de 3.7.x ou non, mais actuellement si vous enregistrez des données locales en ce qui concerne l'édition en ligne (saveRow ou editRow méthodes) le paramètre de données interne de jqGrid sera non modifié.

Pour résoudre le problème, vous pouvez définir la fonction comme

var myAfterSave = function(rowid, response) { // aftersavefunc 
    var index = parseInt(rowid, 10); 
    var d = myGrid.getGridParam("data"); 
    var rowdata = myGrid.getRowData(rowid); 
    d[rowdata.AID].OPT = rowdata.OPT; 
}; 

et modifier les lignes

jQuery('#mygrid').saveRow(lastgridsel, false, 'clientArray'); 
jQuery('#mygrid').editRow(id, true); 

aux lignes

jQuery('#mygrid').saveRow(lastgridsel, false, 'clientArray', null, myAfterSave); 
jQuery('#mygrid').editRow(id, true, null, null, 'clientArray', null, myAfterSave); 
Questions connexes