Aide - Recherche - Membres - Calendrier
Version complète : Evenement sur une dataGrid
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
kiki650
Bonjour,

N'ayant plus Flex Builder (fin de la période d'évaluation, je n'arrive pas à trouver l'évènement qui attend la fin du chargement d'une dataGrid.

Pouvez vous me donner la syntaxe pour mettre un Listener sur ma dataGrid, et à la fin du chargement des données dans le provider appeler une autre fonction.

Merci!

bibile
c'est pas creationComplete ?

sinon, t'as la doc complete ici:
http://livedocs.adobe.com/flex/201/langref/index.html
kiki650
Ce code-ci ne marche pas chez moi:

private function init():void
{ dg.addEventListener("creationComplete",setCurseur);
}

private function setCurseur():void
{ trace("toto"):
}
Tonic
et ceci :

CODE
private function init():void
{ dg.addEventListener(FlexEvent.CREATION_COMPLETE,setCurseur);
}

private function setCurseur():void
{ trace("toto"):
}
kiki650
CITATION(Tonic @ Jul 2 2007, 01:54 PM) *
et ceci :

CODE
private function init():void
{ dg.addEventListener(FlexEvent.CREATION_COMPLETE,setCurseur);
}

private function setCurseur():void
{ trace("toto"):
}



Tonic, ca marche chez toi ça?
Parce que moi non ! icon_cry.gif
Tonic
Tout dépend quand tu invoques ta fonction init.

Si c'est après l'évènement CREATION_COMPLETE de l'application, ca ne marchera pas.

Si c'est sur l'évènement FlexEvent.INITIALIZE de l'application, là il ne devrait pas y avoir de problème.

kiki650
CITATION(Tonic @ Jul 2 2007, 02:02 PM) *
Tout dépend quand tu invoques ta fonction init.

Si c'est après l'évènement CREATION_COMPLETE de l'application, ca ne marchera pas.

Si c'est sur l'évènement FlexEvent.INITIALIZE de l'application, là il ne devrait pas y avoir de problème.


Ok Tonic, j'étais bien dans le cas de figure 1.

Sans vouloir abuser, peux tu me donner la syntaxe pour la 2ème solution?

De plus, pourrais tu me donner l'évènement lorsque le dataprovider change de données?

Merci Tonic!
Fusion
Pour le dataProvider, essaie ça : http://livedocs.adobe.com/flex/201/langref...ml#eventSummary

Pour l'application :

CODE
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="start()">

<mx:Script>
<![CDATA[
import mx.events.FlexEvent;

public function start(e:FlexEvent):void
{

}

]]>

</mx:Script>
</mx:Application>
kiki650
Salut Fusion,

Pour attendre le chargement du dataprovider de la dataGrid, je fais ca:
CODE
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
initialize="start()">

private function start():void
{ dg.addEventListener(FlexEvent.CREATION_COMPLETE,setCurseur);  
}
private function setCurseur(e:Event):void
{ Alert.show("toto");
}


Sauf que j'ai mon Alert avant que ma dataGrid ne soit remplie. Alors j'ai du zapper une de vos consignes.

Pour l'évènement CHANGE du dataProvider, j'ai rien comprit à la doc...

Merci pour ton aide.
Fusion
CITATION(kiki650 @ Jul 2 2007, 02:31 PM) *
Pour l'évènement CHANGE du dataProvider, j'ai rien comprit à la doc...


En fait le dataProvider est un objet du DataGrid. Les événements du DataGrid ne se déclenchent que lorsque tu sélectionnes un élément par exemple.
Tout ce qui concerne ajout de données passe plutôt par le dataProvider, qui peut être typé en ArrayCollection. Voilà pourquoi l'événement est dans la classe ArrayCollection.

Un exemple :

CODE
<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  creationComplete="start()">



    <mx:Script>
    <![CDATA[
          import mx.controls.*;
          import mx.events.*;
          import mx.collections.ArrayCollection;
          

          
          public function start():void
          {
          d.dataProvider = new ArrayCollection();
            d.dataProvider.addEventListener("collectionChange",alert);
          }
          
          public function fill(e:MouseEvent):void
          {
            var oTemp:Object = new Object();
            oTemp.Genre = 'truc';
            d.dataProvider.addItem(oTemp);
          }
          
          public function alert(e:CollectionEvent):void
          {
            Alert.show("ça vient de changer");
          }
          
          
          
          

        ]]>
    </mx:Script>
    
        <mx:DataGrid id="d"  rowCount="5">
            <mx:columns>
                <mx:DataGridColumn dataField="Genre" headerText="Genre"/>
            </mx:columns>
        </mx:DataGrid>
    
    <mx:Button id="b" click="fill(event)"/>
</mx:Application>
kiki650
Ton exemple marche vraiment très bien.

Par contre j'arrive pas à l'intégrer dans mon projet, je sais pas pourquoi. On dirait que je ne rentre pas dans la fonction alert().

Ca ne viendrai pas du fait que je travaille avec des données Json, que j'ai transformées en objet avec la fonction decode() de la librairie as3corelib?


Fusion
Je ne sais pas ce que c'est que le Json, mais effectivement, si le format des objets est spécial, Flex doit considérer qu'il n'y a pas insertion, et comme l'insertion provoque l'événement; il n'y a pas d'événement et pas d'alert...

Essaie avec l'effacement d'entrées dans la DataGrid, essaie avec des objets classiques et des objets JSon et vois les différences. Type les données en Object aussi. Vérifie que les propriétés de tes données correspondent aux dataField de ta DataGrid.

Si tu es toujours planté, donne un morceau de code et on verra icon_razz.gif
kiki650
CITATION(Fusion @ Jul 2 2007, 03:16 PM) *
Je ne sais pas ce que c'est que le Json, mais effectivement, si le format des objets est spécial, Flex doit considérer qu'il n'y a pas insertion, et comme l'insertion provoque l'événement; il n'y a pas d'événement et pas d'alert...

Essaie avec l'effacement d'entrées dans la DataGrid, essaie avec des objets classiques et des objets JSon et vois les différences. Type les données en Object aussi. Vérifie que les propriétés de tes données correspondent aux dataField de ta DataGrid.

Si tu es toujours planté, donne un morceau de code et on verra icon_razz.gif


Bon, je suis bloqué...

Je vais poser le problème différemment:
Comment positionner le scrollBar vertical d'une datagrid tout en bas de la listeune fois qu'elle est chargée.

Moi je voulais mettre un listenber sur le dataProvider, est lorsqu'il aurait été entièrement rempli, j'aurai placé la scrollBar tout en bas.

Peut etre que vous avez une meilleur idée?
Fusion
Pour ton problème je n'ai pas mieux.

La propriété qui va bien dans ce cas-là est verticalScrollPosition. Lorsque le chargement est complet récupère le nombre d'entrées avec dg.dataProvider.length et sers-t-en pour faire baisser la scrollbar. Il faudra peut-être retirer 1 à verticalScrollPosition, teste pour voir.
kiki650
CITATION(Fusion @ Jul 2 2007, 03:48 PM) *
Pour ton problème je n'ai pas mieux.

La propriété qui va bien dans ce cas-là est verticalScrollPosition. Lorsque le chargement est complet récupère le nombre d'entrées avec dg.dataProvider.length et sers-t-en pour faire baisser la scrollbar. Il faudra peut-être retirer 1 à verticalScrollPosition, teste pour voir.


C'est exactement ca! Il faut juste que j'arrive à attendre le chargement complet de mon dataProvider.
Merci pour ton aide en tout cas.
Tonic
Ca devrait répondre à ton problème :

CODE
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import flash.utils.setTimeout;
        
        private var ar : Array = new Array("test 1",
                                            "test 2",
                                            "test 3",
                                            "test 4",
                                            "test 5",
                                            "test 6",
                                            "test 7",
                                            "test 8",
                                            "test 9",
                                            "test 10",
                                            "test 11",
                                            "test 12",
                                            "test 13"
                                        );
        private function init():void
        {
            dg.addEventListener(FlexEvent.UPDATE_COMPLETE,test);
        }          
        
        private function test(e:FlexEvent):void
        {
            dg.verticalScrollPosition=dg.dataProvider.length-1;
        }
        private function affect():void
        {
            dg.dataProvider=ar;                        
        }    

        ]]>
    </mx:Script>
  
    <mx:DataGrid id="dg">
        <mx:columns>
            <mx:DataGridColumn headerText="Column 1" dataField="col1"/>
            <mx:DataGridColumn headerText="Column 2" dataField="col2"/>
            <mx:DataGridColumn headerText="Column 3" dataField="col3"/>
        </mx:columns>
    </mx:DataGrid>
    <mx:Button label="Button" click="affect()"/>
</mx:Application>


L'évènement FlexEvent.UPDATE_COMPLETE est appelé une fois le dataprovider mis à jour. Il suffit alors de place la scroll bar par rapport à la longueur du dataprovider.
kiki650
Tonic, je reviens ce matin et je trouve ton post.
Ca marche impécable, je dois dire que tu m'enlève une grosse aiguille du pied.

gourou.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.