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 :

Perte de l'item sélectionné dans une DropDownList [Flex4]


Sujet :

Flex

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Perte de l'item sélectionné dans une DropDownList
    Bonjour,

    Je viens de constater que si, pour un DropDownList, on change le dataprovider, et qu'on affecte en sélection la même valeur, celle ci ne se sélectionne pas. La DropDownList reste vide.

    Voici le code d'un test:
    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
    <?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"
    			   minWidth="955" minHeight="600">
    	<fx:Script>
    		<![CDATA[
    			import mx.binding.utils.BindingUtils;
    			import mx.collections.ArrayCollection;
     
    			private var bool:Boolean = true;
     
    			private var arrProvider2:ArrayCollection = new ArrayCollection(["Bernard", "Peter", "Quentin", "Marie"]);
    			private var arrProvider1:ArrayCollection = new ArrayCollection(["Quentin", "Peter", "Sébastien", "Florine"]);
     
    			[Bindable]
    			private var item:String;
    			[Bindable]
    			private var arrProvider:ArrayCollection;
     
    			protected function button1_clickHandler(event:MouseEvent):void
    			{
    				if (bool) {
    					arrProvider = arrProvider2;
    					item = "Peter";
    				}
    				else {
    					arrProvider = arrProvider1;
    					item = "Peter";
    				}
    				bool = !bool;
    				btn.label = "switch dataprovider to " + (bool? "arr2": "arr1");
    			}
    		]]>
    	</fx:Script>
     
    	<s:VGroup paddingLeft="20" paddingTop="20">
    		<s:DropDownList id="dd" dataProvider="{arrProvider}" selectedItem="{item}" />
    		<s:Button id="btn" click="button1_clickHandler(event)" label="switch dataprovider to arr2"/>
    	</s:VGroup>
    </s:Application>
    Dans le cas présent, on passe par une variable intermédiaire bindable.
    Si, on affecte directement la valeur au DropDownList, ça fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dd.selectedItem = "Peter";
    De même, si on repasse la variable "item" à vide avant de lui remettre "Peter" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    item = "";
    item = "Peter";
    Ou encore que un coup, c'est "Peter", un autre "Quentin" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (bool) {
    	arrProvider = arrProvider2;
    	item = "Peter";
    }
    else {
    	arrProvider = arrProvider1;
    	item = "Quentin";
    }
    On dirait, que la variable "item" blindable ne voit pas de changement de valeur, donc ne transmet pas l'affectation de la sélection.

    Pouvez vous me donner votre avis sur ce phénomène?
    Pourquoi dans le cas de mon test, la valeur "Peter" ne reste pas sélectionée?

    Merci beaucoup!
    Bonne soirée

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2005
    Messages : 64
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Je me demande si le problème ne vient pas de là. De souvenir, ce test en ActionScript te ramènera toujours vrai car la variable existe.

    Essaie plutôt :

    Arfany

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Salut,
    Juste après l'affectation de ton nouvel arrayCollection, tente un refresh sur arrProvider. Je pense que c'est clairement un problème de refresh et de référencement.
    Si cela ne fonctionne pas, avant de changer la valeur de arrProvider, tu peux le remettre à null.
    N'hésite pas à bien regarder en debug ce qui se passe
    N'oubliez pas avant de poster :

  4. #4
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour!

    Le programme test que je vous ai posté, est une extraction du problème qui se produit sur une application plus importante.

    La cinématique est qu'on a une DropDownList dont le dataProvider est mis à jour régulièrement.
    Ce DropDowList est dans un formulaire dont les champs se font mettre à jour via des variables bindables.
    Si les valeurs de ces variables ne sont pas les mêmes, le formulaire s'affiche correctement. Par contre, si pour ce DropDownList la valeur est la même que juste avant, on dirait que ça part du principe que ça n'a pas changé donc on ne réaffecte pas l'item sélectionné.

    Le programme de test ici, permet par un bouton de changer, à chaque click, le dataProvider, et de réaffecter la même valeur. Ainsi, on constate bien le phénomène.

    J'ai déjà fait du pas à pas en debug.
    On voit bien que suite au changement du dataProvider, la sélection de l'item saute.

    Extrait du code de ListeBase.as (dont hérite le DropDownList) (sdk 4.6):
    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
        override protected function commitProperties():void
        {
            var e:IndexChangeEvent; 
            var changedSelection:Boolean = false;
     
            super.commitProperties();
     
            if (dataProviderChanged)
            {
                dataProviderChanged = false;
                doingWholesaleChanges = false;
     
                if (selectedIndex >= 0 && dataProvider && selectedIndex < dataProvider.length)
                   itemSelected(selectedIndex, true);
                else if (requireSelection)
                   _proposedSelectedIndex = 0;
                else
                   setSelectedIndex(-1, false);
            }
            ...
        }
    On passe par le if (dataProviderChanged) puis setSelectedIndex(-1, false);...

    Sauf que après, la variable bindable "item" ne met pas à jour l'item sélectionné. Comme si le fait que se soit la même valeur ("Peter"), il n'y a rien à faire.
    Car, si on affecte une autre valeur ("Quentin"), ou qu'on affecte directement la valeur en mettant à jour l'attribut "selectedItem" du DropDownList, ce dernier a bien une valeur d'affectée.


    PS : @Arfany :
    Merci pour ton aide, mais le test sur le booléen "bool" fonctionne très bien...

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Salut,
    as-tu essayé ce que j'ai indiqué plus haut ? (problème de refresh..)
    N'oubliez pas avant de poster :

  6. #6
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut Krazymins,

    Oui, j'ai essayé un arrProvider = null avant ou un arrProvider.refresh() après ça ne change rien..
    Le dataProvider se met bien à jour tout le temps!

    Je pense que c'est plus la variable item qui pose problème.

    Cette variable est sensée garder l'item sélectionné à "Peter", or elle ne le fait pas à partir de la 2ème affectation de la valeur.

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Peux-tu essayer de travailler avec des objets plutôt que des strings ?
    Faire quelquechose dans le style :
    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
     
    var obj1: Object = new Object();
    var obj2: Object = new Object();
    var obj3: Object = new Object();
    var obj4: Object = new Object();
     
    obj1.name = "Bernard";
    obj2.name = "Peter";
    obj3.name = "Quentin";
    obj4.name = "Marie";
     
    arrProvider2.add(obj1);
    arrProvider2.add(obj2);
    arrProvider2.add(obj3);
    arrProvider2.add(obj4);
    Et ensuite placer un labelField="name" sur ta dropDownList ?
    N'oubliez pas avant de poster :

  8. #8
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    La DDL est bien mise à jour (comme avant aussi).
    Rien n'a changé, à part que même la première fois l'item sélectionné ne l'est plus.

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Tu as gardé item = "Peter" ?
    N'oubliez pas avant de poster :

  10. #10
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    J'ai mis item = obj2

    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
    				if (bool) {
    					arrProvider2 = new ArrayCollection();
    					var obj1: Object = new Object();
    					var obj2: Object = new Object();
    					var obj3: Object = new Object();
    					var obj4: Object = new Object();
    					obj1.name = "Bernard";
    					obj2.name = "Peter";
    					obj3.name = "Quentin";
    					obj4.name = "Marie";
    					arrProvider2.addItem(obj1);
    					arrProvider2.addItem(obj2);
    					arrProvider2.addItem(obj3);
    					arrProvider2.addItem(obj4);
    					arrProvider = arrProvider2;
    					item = obj2;
    				}
    				else {
    					arrProvider1 = new ArrayCollection();
    					var obj5: Object = new Object();
    					var obj6: Object = new Object();
    					var obj7: Object = new Object();
    					var obj8: Object = new Object();
    					obj5.name = "Bernard";
    					obj6.name = "Peter";
    					obj7.name = "Quentin";
    					obj8.name = "Jean";
    					arrProvider1.addItem(obj5);
    					arrProvider1.addItem(obj6);
    					arrProvider1.addItem(obj7);
    					arrProvider1.addItem(obj8);
    					arrProvider = arrProvider1;
    					item = obj6;
    				}
    Dans ce cas présent, comme l'objet change, on a "Peter" toujours sélectionné.
    Ce qui est le but recherché.
    Ce qui veut dire que le Bindable sur une chaîne identique, ne déclenche rien.
    C'est pourtant ce cas là que je voudrais faire fonctionner.. :/

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    J'ai du mal comprendre mais ce n'est pas ce que tu voulais le fait que "Peter" soit sélectionné?
    A ce que j'avais compris ton dataprovider était bien mis à jour mais il n'y avait plus d'item sélectionné lorsque item = "Peter".

    Par contre dans ton code si je peux me permettre, initialise tes ArrayCollection en amont car à chaque fois que tu passes dans ton clickHandler tu vas en recrée un de nouveau.

    [EDIT] : Par contre attention le bindable n'est pas sur la String, mais bien sur l'objet d'où l'intérêt de passer par un arrayCollection construit de cette manière.
    N'oubliez pas avant de poster :

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Finalement, après relecture, cela fonctionne avec un arrayCollection rempli avec des obj mais pas avec de simples String c'est bien ça ? Et toi tu veux absolument avec des String si j'ai bien compris. Honnêtement je ne fonctionne jamais de cette manière car c'est beaucoup plus propre et safe de travailler avec des objets que tu peux manipuler, comparer etc ... (la preuve).

    A mon avis (c'est de la supposition), étant donné que tu travailles sur une String et que tu affectes la même valeur à cette String, la valeur n'est pas mise à jour (optimisation au niveau du compilateur). En travaillant avec un objet il s'agit de 2 instances différentes donc là il y a une mise à jour forcée. Dans le cas des Strings non. Du coup un change event n'est pas envoyé à ta DropDownList et l'item sélectionné ne se met pas à jour via le binding. Donc un nouveau dataProvider est affecté mais rien qui ne force la mise à jour de l'item sélectionné. Tu es obligée de passer par selectedItem je pense pour justement forcer cette mise à jour et forcer l'event à être re-dispatché.
    N'oubliez pas avant de poster :

  13. #13
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Krazymins, ton dernier post résume bien la problématique!
    Et c'est aussi à la conclusion à laquelle je suis finalement arrivée...

    Dans tous les cas, vaut mieux ne plus passer par un string bindable.

    Merci beaucoup pour ton aide!!
    Bonne journée


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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Points : 875
    Points
    875
    Par défaut
    Oui tout à fait. Quoi qu'il arrive c'est toujours délicat de baser ses traitements sur des String.
    Bonne journée
    N'oubliez pas avant de poster :

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

Discussions similaires

  1. [AC-2010] N'avoir aucun item sélectionné dans une listbox
    Par neb2k7 dans le forum IHM
    Réponses: 2
    Dernier message: 18/07/2014, 21h37
  2. [Débutant] Retrouver les items sélectionnés dans une listbox
    Par Shennong dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/05/2014, 16h02
  3. Réponses: 5
    Dernier message: 08/04/2011, 14h06
  4. Réponses: 4
    Dernier message: 04/04/2011, 11h46
  5. [XL-2007] Item sélectionné dans une listbox
    Par gds35 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/03/2010, 17h45

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