Bonjour à tous,
Aidez-moi, je vais "criser". Je désire ajouter un élément à un composant de type "List".
Mon "dataProvider" est défini en XML.
Je crée le composant de type "List" de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part private var __selectionXML:XML = <themes><theme name="toto"/></themes>;
Et, pour ajouter un élément, j'ai essayé plein de choses... Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private var __listSlector:List = new List(); private var __selectionXML:XML = <themes><theme name="toto"/></themes>; ... // Construction du composant de tye "List". __listSlector.dataProvider = __selectionXML.theme; __listSlector.width = 100; __listSlector.labelField = "@name";
Mais, rien ne marche. Je ne maîtrise pas bien les XMLList et XMLListCollection... Cela doit venir de mon ignorance sur le sujet. Mais cela fait deux jours que je bloque sur ce problème... J'ai relu la documentation des dizaines de fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // On ajoute la sélection à la liste de sélections. // "item" ressemble à "<theme name="Theme B1" interested="no"/>" item.@categorie = XML(__treeSelector.selectedItem).parent().@name; trace("Add: " + item.@name + " " + item.@interested); __selectionXML.appendChild(item); trace(__selectionXML.toString());
Voici une application complète pour illustrer le problème :
et
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 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ private var __themesXML:XML = <themes> <categorie name="Catégorie A"> <theme name="Theme A1" interested="yes"/> <theme name="Theme A2" interested="no"/> </categorie> <categorie name="Catégorie B"> <theme name="Theme B1" interested="no"/> <theme name="Theme B2" interested="yes"/> </categorie> </themes>; private function init():void { this.addChild(new ThemesSelector(__themesXML)); } ]]> </mx:Script> </mx:Application>
Une très grand merci à qui pourra me débloquer sur ce coup!
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 package { import flash.events.Event; import flash.events.MouseEvent; import mx.collections.XMLListCollection; import mx.collections.ICollectionView; import mx.containers.Box; import mx.containers.HBox; import mx.containers.VBox; import mx.controls.Button; import mx.controls.List; import mx.controls.Spacer; import mx.controls.Tree; public class ThemesSelector extends Box { private var __treeSelector:Tree = new Tree(); private var __listSlector:List = new List(); private var __addButton:Button = new Button(); private var __removeButton:Button = new Button(); private var __themesXML:XMLListCollection; private var __selectionXML:XML = <themes><theme name="toto"/></themes>; /** Construit le sélectionneur de thèmes. * * @param themesXML Document XML qui représente la liste de thèmes, organisés par catégories. * Le format du document XML qui représente la liste des thèmes est le suivant : * <themes> * <categorie name="Catégorie A"> * <theme name="Theme A1" interested="yes"/> * <theme name="Theme A2" interested="no"/> * </categorie> * <categorie name="Catégorie B"> * <theme name="Theme B1" interested="no"/> * <theme name="Theme B2" interested="yes"/> * </categorie> * </themes> * @param allowMultipleSelection Cet indicateur permet d'indiquer si le composant accepte des sélections multiples. */ public function ThemesSelector(themesXML:XML) { super(); __themesXML = new XMLListCollection(themesXML.categorie); __createFormular(); __addButton.addEventListener(MouseEvent.CLICK, __addThemeToList); __removeButton.addEventListener(MouseEvent.CLICK, __removeThemeFromList); } /** Ce gestionnaire d'évènement est exécuté lorsque l'utilisateur décide d'ajouter un centre d'intérêt à sa liste. * * @param event Évènement envoyé lorsque l'utilisateur clique sur le bouton. */ private function __addThemeToList(event:Event):void { var item:XML; // Si aucun thème n'est sélectionné, on ne fait rien. if (__treeSelector.selectedItem == null) { return; } // Il est interdit de sélectionner une catégorie. item = new XML(__treeSelector.selectedItem); if (item.localName() == "categorie") { return; } // On ajoute la sélection à la liste de sélections. // "item" ressemble à "<theme name="Theme B1" interested="no"/>" item.@categorie = XML(__treeSelector.selectedItem).parent().@name; trace("Add: " + item.@name + " " + item.@interested); __selectionXML.appendChild(item); trace(__selectionXML.toString()); // Et on retire la sélection du sélecteur. } /** Ce gestionnaire d'évènement est exécuté lorsque l'utilisateur décide d'ajouter un centre d'intérêt de sa liste. * * @param event Évènement envoyé lorsque l'utilisateur clique sur le bouton. */ private function __removeThemeFromList(event:Event):void { } /** Cette fonction est utilisée pour déterminer le label à afficher en fonction du type de noeud. * * @param item Noeud XML courant. * @param La fonction retourne une chaîne de caractères qui représente la catégorie ou le thème à afficher. */ private function __treeLabel(item:Object):String { var node:XML = XML(item); switch (node.localName()) { case 'categorie': return node.@name; case 'theme': return node.@name; } return null; } /** Cette fonction construit le formulaire. */ private function __createFormular():void { var mainHbox:HBox = new HBox(); var treeToListSpacerLeft:Spacer = new Spacer(); var treeToListSpacerRight:Spacer = new Spacer(); var vbox:VBox = new VBox(); // Construction du composant de type "Tree". __treeSelector.dataProvider = __themesXML; __treeSelector.allowMultipleSelection = false; __treeSelector.labelFunction = __treeLabel; // Construction de la zone centrale. treeToListSpacerLeft.width = 15; treeToListSpacerLeft.percentHeight = 100; treeToListSpacerRight.width = 15; treeToListSpacerRight.percentHeight = 100; __addButton.label = "+"; __removeButton.label = "-"; vbox.addChild(__addButton); vbox.addChild(__removeButton); // Construction du composant de type "List". __listSlector.dataProvider = __selectionXML.theme; __listSlector.width = 100; __listSlector.labelField = "@name"; // Construction du composant. mainHbox.addChild(__treeSelector); mainHbox.addChild(treeToListSpacerLeft); mainHbox.addChild(vbox); mainHbox.addChild(treeToListSpacerRight); mainHbox.addChild(__listSlector); this.addChild(mainHbox); } /** Cette fonction rend le composant éligible au traitement par le "garbage colector". */ public function destroy():void { __addButton.removeEventListener(MouseEvent.CLICK, __addThemeToList); __removeButton.removeEventListener(MouseEvent.CLICK, __removeThemeFromList); }
Merci,
Denis
Partager