Bonjour,
Je m'arrache les cheveux sur ce problème depuis plusieurs jours donc je post ici afin d'avoir un coup de main, car je ne vois vraiment pas ce qu'il se passe.
J'ai une grille qui est créée dynamiquement suite au clique sur un onglet, qui appelle la fonction createGrid(onglet).
Dans cette fonction, je relie des fonctions perso à différents évènements, après la création de la grille :
--- Fonction modifierGridCell ---
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 dojo.connect(grid, "onStartEdit", this, dojo.partial(modifierGridCell, onglet)); dojo.connect(grid, "onApplyCellEdit", this, dojo.partial(saveModifCell, onglet)); dojo.connect(grid, "onKeyPress", this, dojo.partial(touches, onglet));
--- Fonction saveModifCell ----
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 function modifierGridCell(onglet, inCell, inRowIndex) { var val = ""; var temp = dojo.byId("LibCourtStatutGenerale").innerHTML; var g = dijit.byId("grille"+onglet); if (("Annulé" == temp) || ("Terminé" == temp)) { g.edit.cancel(); } else { var champ = inCell.field; val = inCell.grid._by_idx[inRowIndex].item[champ][0]; if ((val != null) && (val != "undefined") && (val != "")) { if (inCell.declaredClass == "dojox.grid.cells.DateTextBox") inCell.grid._by_idx[inRowIndex].item[champ][0] = dojo.date.locale.format(new Date(val), inCell.constraint); else inCell.grid._by_idx[inRowIndex].item[champ][0] = unescape(val); } else { if (inCell.declaredClass == "dojox.grid.cells.DateTextBox") inCell.grid._by_idx[inRowIndex].item[champ][0] = dojo.date.locale.format(new Date(), inCell.constraint); else inCell.grid._by_idx[inRowIndex].item[champ][0] = ""; } } }
Lorsque je double clique sur une cellule pour l'éditer, la première fois ça fonctionne bien, la cellule s'édite et je peux la modifier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 function saveModifCell(onglet, valeur, ligne, champs) { var grille = null; var tabCD = null; var mode = ""; grille = dijit.byId("grille"+onglet); var nbLigne = grille.rowCount; tabCD = grille.getItem(ligne); var CodeCDM = tabCD["CodeCDM"]; var numCD = grille._by_idx[ligne].idty; if ((ligne == 0) && ((champs == "CodeMetreur") || (champs == "DatePrevi"))) { if (nbLigne > 1) { var message = "Voulez-vous appliquer à tous les CorpsDevis ?"; if (confirm(message)) { if (champs == "CodeMetreur") { numCD = ""; for (i=0;i<nbLigne;i++) { numCD += grille._by_idx[i].idty; if ((nbLigne > 1) && (i != (nbLigne-1))) numCD += ","; } } else { CodeCDM = ""; for (i=0;i<nbLigne;i++) { tabCD = grille.getItem(i); CodeCDM += tabCD["CodeCDM"]; if ((nbLigne > 1) && (i != (nbLigne-1))) CodeCDM += ","; } } mode = "CDMetreurTous"; } else mode = "CDMetreur"; } else mode = "CDMetreur"; } else { if ((champs == "CodeMetreur") || (champs == "DatePrevi")) mode = "CDMetreur"; else mode = 'update'; } if ((valeur != null) && (champs == "DatePrevi")) { var valeur2 = dojo.date.locale.format(valeur, {datePattern: "dd/MM/yyyy", selector: "date", locale: "fr"}); valeur = valeur2; } var xhrArgs = { url: "traitement_onglets_devis.php", content: {mode: mode, onglet: onglet, identifiant: numCD, champsMAJ: champs, valeurMAJ: escape(valeur), codeCDM: CodeCDM}, handleAs: "text", preventCache: true, sync: true, load: function(reponse, ioArgs) { //return reponse; }, error: function(error, ioArgs) { var message = ""; switch(ioArgs.xhr.status) { case 404: message = error.message+" - La page demandée n'a pas été trouvée !"; break; case 404: message = error.message+" - Retour d'erreur du serveur !"; break; default: message = error.message+" - Erreur inconnue !!!"; break; } console.log(message); }, handle: function(reponse, ioArgs) { grille.store.save(); grille.store.close(); // grille.store.fetch(); //grille._fetch(); grille._refresh(true); } } var deferred = dojo.xhrPost(xhrArgs); return deferred; }
La où ça se corse, c'est quand j'appuie sur TAB pour passer à la cellule suivante, ça plante et firebug me met un message d'erreur : inCell.grid._by_idx[inRowIndex] is undefined
Si je valide chaque cellule individuellement, ça fonctionne sinon ça plante.
C'est comme si je perdais mes items de la grille après la sauvegarde.
Mais dans firebug, quand j'affiche la grille via console.log(g), ils apparaissent bien.
Et à priori le save, close et refresh fonctionne.
A mon humble avis, je pense que ça doit venir de ce qui est fait dans le handle du xhrPost mais j'ai beau essayer plusieurs combinaisons, ça ne change rien.
Donc je ne comprend pas du tout ce qu'il se passe et c'est vraiment bloquant pour la suite de mon projet.
Merci d'avance pour votre aide.
Partager