IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Echange données datagrid et XML [Flex4]


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Tan
    Tan est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Par défaut 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 : 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="&gt;" click="addSelection()"/>				
    			<s:Button id="btnSuppr" label="&lt;" 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 fxeclarations), cela ne fonctionne plus:
    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}"/>
    Voici les fichiers xml correspond:
    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>
    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>
    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.

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Salut,

    Qu'est-ce que ça te donne si tu fais un invalidateList() juste après les changements dans tes lists ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Supprime les éléments sélectionnés de la liste de droite
    			private function deleteSelection():void
    			{
    				changeElement(datagridGauche, datagridDroite);
                                    datagridDroite.invalidateList();
    			}
    			// Ajoute les éléments sélectionnés à la liste de droite
    			private function addSelection():void
    			{
    				changeElement(datagridDroite, datagridGauche);
                                    datagridDroite.invalidateList();
    			}

  3. #3
    Tan
    Tan est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Par défaut
    Bonjour,

    Le DataGrid que j'utilise est le suivant spark.components.DataGrid (celui de Spark), la méthode que tu m'indiques, ne semble exister que pour les composants mx.

    Je ne peux donc pas tester ce que tu m'as demandé. Peut-être y a-t-il un équivalent (il faudrait que je regarde).

    Mais, ce que je ne comprends pas c'est pourquoi cela marche dans le premier cas.

    Merci, pour cette première piste.

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    il faut que tu appliques un refresh() sur ton dataprovider

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Après m'être penché un peu plus sur ton problème, tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private function changeElement(datagrid1:DataGrid, datagrid2:DataGrid):void {
     
    	var v:Vector.<Object> = datagrid2.selectedItems;
    	var dp1:XMLListCollection = XMLListCollection(datagrid1.dataProvider);
    	var dp2:XMLListCollection = XMLListCollection(datagrid2.dataProvider);
     
    	for each(var o:Object in v)
    	{
    		dp2.removeItemAt(dp2.getItemIndex(o));
    		dp1.addItem(new XMLList(o));
    	}  
     
    }
    Par contre, si tu inverses les instructions removeItemAt et addItem cela ne marche pas et je ne m'explique pas pourquoi...

  6. #6
    Tan
    Tan est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Par défaut
    Merci, le code que tu m'as fourni fonctionne avec les XMLCollectionList, mais plus avec les ArrayList.

    Je l'ai modifié pour qu'il soit plus général en utilisant les IList:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private function changeElement(datagrid1:DataGrid, datagrid2:DataGrid):void {
    	var v:Vector.<Object> = datagrid2.selectedItems;
    	var dp1:IList = IList(datagrid1.dataProvider);
    	var dp2:IList = IList(datagrid2.dataProvider);
     
    	for each(var o:Object in v)
    	{
    		dp2.removeItemAt(dp2.getItemIndex(o));
    		dp1.addItem(o);
    	}  
    }
    Et la, ça semble fonctionner avec des XMLCollectionList, ArrayCollection, ArrayList, ce qui me va.

    Par contre, j'ai essayé de comprendre pourquoi ton code fonctionnait, et pas le mien. Car mon code initial me paraissait pas trop mal.

    Et en fait, j'ai le même problème que toi à la base, l'ordre entre le addItem et le removeItemAt change le fonctionnement.

    Les deux méthodes sont bonnes, j'ai juste choisi le mauvais ordre.

    Par contre, comme toi, je ne m'explique pas ce fonctionnement.

    Je metterai ce signalement à résolu, plus tard dans la journée, des fois que quelqu'un aurait une explication (j'aime comprendre, et c'est vrai qu'avec flex, c'est le deuxième problème que je ne m'explique pas), avec celui d'hier).

    En tant cas, merci pour ton aide, sur mes deux problèmes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Echanges données XML
    Par jaussiba dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/05/2008, 16h48
  2. Récuperer les données au format XML
    Par sigap dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/06/2006, 09h26
  3. [DOM XML] Insertion données dans fichier XML avec PHP pour Flash ?
    Par ExSter dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 10/05/2006, 11h16
  4. [Debutant] Echange données entre pc distants
    Par orelero dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 14/08/2005, 00h40
  5. Supprimer des données dans un xml
    Par pingoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 49
    Dernier message: 12/08/2004, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo