Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

20août/098

Flex AdvancedDataGrid – Utiliser childrenField dans un ArrayCollection pour définir la hiérarchie

Une donnée dite "hierarchical" (hiérarchique) est une donnée déjà structurée, arrangée en hiérarchie. Pour afficher cette donnée hiérarchique dans un composant AdvancedDataGrid, vous devez fixer le dataProvider du composant à une instance de la classe HierarchicalData. La structure de cette donnée dans le dataProvider définit l'affichage de la donnée dans l'ADG.

Un ArrayCollection est un moyen pratique de créer une donnée hiérarchique. Voici un exemple avec trois niveaux (un niveau root et 2 niveaux enfant):

[Bindable]
private var dpHierarchy:ArrayCollection = new ArrayCollection([
	{Region:"Southwest", children: [
		{Region:"Arizona", children: [
			{Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
			{Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},
		{Region:"Central California", children: [
			{Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},
		{Region:"Nevada", children: [
			{Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},
		{Region:"Northern California", children: [
			{Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
			{Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},
		{Region:"Southern California", children: [
			{Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
			{Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}
]);

Cet exemple utilise le mot-clé "children" pour définir la hiérarchie.

Le mot-clé "children" est le mot-clé par défaut utilisé par la classe HierarchicalData pour définit la hiérarchie.

Vous pouvez utiliser un mot-clé différent pour définir la hiérarchie. Dans ce  cas, vous devez préciser ce mot-clé (nom de field) grâce à la propriété "childrenField" (HierarchicalData.childrenField) de l'objet HierarchicalData. L'exemple suivant utilise le champ "categories" pour définir sa hiérarchie:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
	<![CDATA[
		import mx.collections.ArrayCollection;
		[Bindable]
		private var dpHierarchy:ArrayCollection = new ArrayCollection([
			{Region:"Southwest", categories: [
			{Region:"Arizona", categories: [
			{Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
			{Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},
			{Region:"Central California", categories: [
			{Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},
			{Region:"Nevada", categories: [
			{Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},
			{Region:"Northern California", categories: [
			{Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
			{Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},
			{Region:"Southern California", categories: [
			{Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
			{Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
			]}
		]);
	]]>
	</mx:Script>

	<mx:AdvancedDataGrid width="100%" height="100%">
		<mx:dataProvider>
			<mx:HierarchicalData source="{dpHierarchy}"
			childrenField="categories"/>
		</mx:dataProvider>
		<mx:columns>
			<mx:AdvancedDataGridColumn dataField="Region"/>
			<mx:AdvancedDataGridColumn dataField="Territory_Rep"
			headerText="Territory Rep"/>
			<mx:AdvancedDataGridColumn dataField="Actual"/>
			<mx:AdvancedDataGridColumn dataField="Estimate"/>
		</mx:columns>
	</mx:AdvancedDataGrid>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Articles similaires

Commentaires (8) Trackbacks (0)
  1. j'ai la hierarchie d'objets suivant :

    Actionscript:
    1. Client {
    2. var nom:String;
    3. var comptes:ArrayCollection; //collection d'objet Compte
    4. }
    5. Compte {
    6. var numeroCompte:String;
    7. var mouvements:ArrayCollection; //collection d'objet Mouvement
    8. }
    9. Mouvement {
    10. var numeroMouvement:String;
    11. }

    je voudrai afficher dans une AdvancedDataGrid
    dans la première colonne un tree avec comme label le client.nom
    dans la deuxième colonne le compte.numeroCompte
    et dans la troisième le mouvement.numeroMouvement

    comment puis-je faire ? j'ai essayer en utilisant une HierachicalData, mais je ne peux spécifier que les enfants du client, pas les enfants du comptes.
    une idée ?

  2. Bonjour,
    Si vous devez garder cette structure avec ces noms, ce que je ferai, c'est que je donnerai un nom générique au childrenField (children par exemple) et dans chaque classe ayant des enfants, 'ajouterai un getter sur children qui renverrai les enfants.
    Par exemple pour la classe Client:

    Actionscript:
    1. public function get children():ArrayCollection{
    2.   return _comptes;
    3. }

    et dans Compte:

    Actionscript:
    1. public function get children():ArrayCollection{
    2.   return _mouvements;
    3. }

    Ici le getter sert en quelque sorte de "proxy"
    Je n'ai pas eu le temps de tester mais cela fonctionne à mon avis ;)

    Fabien

  3. non, je ne peux pas faire de proxy de donnée comme tu m'indiques.
    existe-t-il une autre solution ?

  4. Je ne pense pas non. C'est quoi qui gène la mise en place d'un getter au juste ?

    Fabien

  5. la hierarchie est donnée à titre d'exemple,
    je souhaite faire ce type de manip sur tout une palanquée d'objets, et en tout état de cause, je risque d'avoir sur l'objet Client une seconde collection d'objets Action qui contient elle-même une collection d'objet Trucmuche
    que je souhaiterais afficher de la même manière.

    donc, je me vois mal spécifier sur mon objet un getter children1, un getter children2, etc.

    de plus, ce n'est pas moi qui gére la structure de l'objet Client.

  6. j'ai trouvé une parade.
    j'etend HierarchicalData et j'y rajoute deux attributs String : childrenLevel1 et childrenLevel2

    je surcharge la méthode getChildren pour renvoyer le bon children suivant si c'est le level1 (comptes) ou le level2 (mouvement)

    Actionscript:
    1. override public function getChildren(node:Object):Object {
    2.    var children:* = null;
    3.    if (node != null &amp;&amp; node is Object) {
    4.         if ( node.hasOwnProperty(childrenLevel1) )
    5.             children = node[childrenLevel1];
    6.         else if ( node.hasOwnProperty(childrenLevel2) )
    7.             children = node[childrenLevel2];
    8.         }
    9.    }       
    10.    return children;
    11. }

    et dans mon dataprovider de mon advancedDatagrid, je mets donc :

    [mxml][/mxml]

    et cela marche !
    bon dans la cas présent, je me limite à deux niveaux, mais on pourrait très bien gerer une liste de children pour gerer un plus grand nombre de niveau.

  7. oups, mon mxml a été mangé...

    ext:HierarchicalDataExtended source="{clients}" childrenLevel1="comptes" childrenLevel2="mouvements"

  8. Merci pour l'info, ça peut servir ;)

    Fabien


Leave a comment

(required)

Aucun trackbacks pour l'instant