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:
Ce code fonctionne, par contre, si je change le dataprovider pour le mettre en XML (dans la partie fx
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 <?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>eclarations), cela ne fonctionne plus:
Voici les fichiers xml correspond:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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}"/>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
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.
Partager