Echange données datagrid et XML
Bonjour,
Voici un deuxième problème (et dernier j'espère) que je traine depuis quelques jours.
Objectif:
Deux listes alimentés par deux dataprovider différents (mais de même structure).
Deux boutons pour permettre d'échanger les données entre ces listes.
Voici un code qui fonctionne:
Code:
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
| <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
contentCreationComplete="init()">
<fx:Declarations>
<mx:ArrayCollection id="dataGauche">
<fx:Object nom="Gauche1"/>
<fx:Object nom="Gauche2"/>
<fx:Object nom="Gauche3"/>
<fx:Object nom="Gauche4"/>
</mx:ArrayCollection>
<mx:ArrayCollection id="dataDroite">
<fx:Object nom="Droite1"/>
<fx:Object nom="Droite2"/>
<fx:Object nom="Droite3"/>
<fx:Object nom="Droite4"/>
</mx:ArrayCollection>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
import spark.components.DataGrid;
private function changeElement(datagrid1:DataGrid, datagrid2:DataGrid):void {
var toRemove:Array=[];
for (var i:int=0; i < datagrid2.selectedItems.length; i++)
{
toRemove.push(datagrid2.selectedItems[i]);
}
for (i=0; i < toRemove.length; i++)
{
datagrid1.dataProvider.addItem(toRemove[i]);
datagrid2.dataProvider.removeItemAt(datagrid2.dataProvider.getItemIndex(toRemove[i]));
}
}
// Supprime les éléments sélectionnés de la liste de droite
private function deleteSelection():void
{
changeElement(datagridGauche, datagridDroite);
}
// Ajoute les éléments sélectionnés à la liste de droite
private function addSelection():void
{
changeElement(datagridDroite, datagridGauche);
}
]]>
</fx:Script>
<s:HGroup>
<!-- liste de gauche -->
<s:DataGrid id="datagridGauche" dataProvider="{dataGauche}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="nom"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
<!-- bouton d'échange -->
<s:VGroup verticalAlign="middle" height="100%">
<s:Button id="btnAjout" label=">" click="addSelection()"/>
<s:Button id="btnSuppr" label="<" click="deleteSelection()"/>
</s:VGroup>
<!-- liste de droite -->
<s:DataGrid id="datagridDroite" dataProvider="{dataDroite}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="nom"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
</s:HGroup>
</s:Application> |
Ce code fonctionne, par contre, si je change le dataprovider pour le mettre en XML (dans la partie fx:Declarations), cela ne fonctionne plus:
Code:
1 2 3 4
| <fx:XML id="xmlDataGauche" source="xml/xmlDataGauche.xml"/>
<fx:XML id="xmlDataDroite" source="xml/xmlDataDroite.xml"/>
<s:XMLListCollection id="dataGauche" source="{xmlDataGauche..element}"/>
<s:XMLListCollection id="dataDroite" source="{xmlDataDroite..element}"/> |
Voici les fichiers xml correspond:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <provider>
<element>
<nom>Gauche1</nom>
</element>
<element>
<nom>Gauche2</nom>
</element>
<element>
<nom>Gauche3</nom>
</element>
<element>
<nom>Gauche4</nom>
</element>
</provider> |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <provider>
<element>
<nom>Droite1</nom>
</element>
<element>
<nom>Droite2</nom>
</element>
<element>
<nom>Droite3</nom>
</element>
<element>
<nom>Droite4</nom>
</element>
</provider> |
Ici, l'élément disparaitre de la première liste, mais n'apparait dans la seconde, et lorsque, je fais l'échange inverse, les éléments supprimés précédemment réapparaissent.
Pourquoi ai-je ce comportement. Dans le principe, dans les deux cas on est sur des classes héritant de ListCollectionView, je fais des addItem sur des objects de même type.