Cette astuce n’est pas récente, mais j’en ai eu besoin très récemment lors d’un projet, donc je la publie chez nous aussi.
Lorsque vous avez un DataGrid éditable, et que vous souhaitez réaliser une action dès lors que vous avez fini l’édition (soit en ayant appuyé sur la touche entrée, soit avec la tabulation, ou bien encore après avoir cliqué en dehors du DataGrid), il faut utiliser l’évènement DataGridEvent.ITEM_EDIT_END. Mais si vous souhaitez faire des actions sur le DataProvider de ce DataGrid (sauvegarde des éléments, mise à jour d’autres champs, …), et bien vous allez vous rendre compte qu’il n’a pas encore été mis à jour.
En fait, tout ceci est dû au fait que la mise à jour du DataProvider utilise ce fameux évènement, donc logiquement en même temps que votre fonction d’écoute de l’évènement. C’est pas tout a fait vrai, car quand on regarde le constructeur de la classe mx.controls.DataGrid, on voit l’élément suivant :
addEventListener(DataGridEvent.ITEM_EDIT_END, itemEditorItemEditEndHandler, false, EventPriority.DEFAULT_HANDLER);
Et c’est tout particulièrement le dernier paramètre qui nous intéresse ici. Il permet de définir la priorité de l’évènement, c’est à dire dans quel ordre sont appelées les fonctions définies pour cet évènement. Dans le cas de la déclaration du DataGrid, l’évènement est écouté avec la priorité EventPriority.DEFAULT_HANDLER (correspond à -50), alors que si l’on ne met rien pour ce paramètre, la valeur 0 est appliquée. Ceci explique pourquoi notre fonction est appelée avant la mise à jour du DataProvider.
La solution au problème ? Tout simplement, mettre une valeur plus petite que -50. Cela oblige par contre à définir le listener dans le creationComplete du DataGrid, et non dans son attribut mxml.
Articles sur le même sujet :

Commentaires