Focus on DataGrid
Je suis actuellement en train d'utiliser le composant datagrid V2, dont j'essaie d'exploiter un maximum de possibilités.
Je me suis retrouvé confronté à un problème bizarre...
Tout d'abord, le cadre :
Je récupère des données via remoting php (amfphp). le retour, sous forme de tableau de type dataProvider, est affecté à la propriété "dataProvider" (ou "items") d'un dataSet, lui même lié à une grille de données...
L'utilisation :
Une fois ma grille remplie, j'ai la possibilité de sélectionner un item pour le passer dans une autre grille, par exemple.
Le problème est que la propriété "selectedIndex" des composants V2 n'est pas pris en charge dans la liaison de composant via l'inspecteur d'objet.
Je dois donc par code, lors d'un click sur la grille, mettre à jour la propriété "selectedIndex" de mon dataSet pour que le process soit correct... (information tiré d'un blog, je ne sais plus lequel...)
Le problème :
Le problème survient, mais pas à chaque fois. Lorsque je met à jour la propriété "selectedIndex" de mon dataSet, la ligne sélectionnée dans la grille perd la surbrillance... il est donc difficile de savoir quel ligne a été sélectionnée pour la dernière fois, puisqu'aucune n'est mise en valeur...
J'ai fait bcp de tests au niveau de la liaison de composant via l'inspecteur d'objet, mais la propriété selectedIndex ne veut pas fonctionner sans liaison par actionScript...
la solution :
Un peu bricolage, mais voilà la solution que j'ai trouvée, et qui me satisfait :
la grille et le dataSet ont un nom sensiblement identique :
dataSet : dsCourses
datagrid : cdgCourses
var dgHandler:Object = new Object (); dgHandler.cellPress = function (evt:Object) { var owner:MovieClip = evt.target._parent; var myDg:mx.controls.DataGrid = evt.target; var name:String = substring (myDg._name, 4, myDg._name.length); owner ['ds' + name].selectedIndex = myDg.selectedIndex; myDg.selectedIndex = owner ['ds' + name].selectedIndex; } dg.addEventListener ('cellPress', dgHandler);
ce que je fais :
- je récupère d'abord le clip parent de la grille, dans la variable "owner".
- je récupère ensuite la grille, ciblée dans l'élément "evt.target".
- je coupe ensuite son nom pour obtenir la chaine de caractère ne contenant que le mot "Courses"
- je valorise la propriété "selectedIndex" du dataSet avec la propriété du même nom de la grille.
- enfin, j'effectue l'inverse, c'est à dire valoriser la propriété "selectedIndex" de la grille avec la valeur correspondante dans le dataSet.
Conclusion :
L'astuce n'est pas compliquée, mais il faut y penser... le plus bizarre (à part l'homme honnête, dixit Benabar) c'est que certaines grilles réagissent bien, et d'autres pas. Peut-être est-ce l'implémentation de mon code qui est mal rédigée, mais pourtant, sur 2 formulaires dont les méthodes sont quasi-identiques, contenant 2 grilles chacun, 1 seule grille fonctionne sans cette astuce, les autres devant l'implémenter pour avoir la dernière ligne en surbrillance...
Je trouve fort que non seulement on doive faire la liaison du selectedIndex à la main, mais en plus, on doit resélectionner le bon index dans la grille... m'enfin, on en verra d'autres