Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 12h42   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
Par défaut filtre sur fichier xml

Salut,

Voilà je voudrais faire quelques choses mais je ne sais pas si c'est possible, j'espère que vous me direz oui^^.
Donc j'ai un fichier xml comme suit:
Code :
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
<?xml version="1.0" encoding="UTF-8" ?>
<root>
	<contact>
		<id_contact>1</id_contact>
		<nom>emma</nom>
		<mail>test@mail.com</mail>
		<info>info</info>
	</contact>
	<contact num=3>
		<id_contact>3</id_contact>
		<nom>julien</nom>
		<mail>julien</mail>
		<info>julien</info>
	</contact>
	<contact>
		<id_contact>4</id_contact>
		<nom>marc</nom>
		<mail>marc</mail>
		<info>marc</info>
	</contact>
	<contact>
		<id_contact>5</id_contact>
		<nom>infoa</nom>
		<mail>mailc</mail>
		<info>infob</info>
	</contact>
</root>
Depuis flex j'aimerais pouvoir grâce à des dropdownlist faire des filtres qui me permettront d'afficher que certain contact dans un datagrid. J'ai une dropdown list qui me propose de choisir tout les attributs du contact par exemple nom, mail... mon deuxième dropdownlist me propose en fonction du premier choix les valeurs de ces attributs par exemple si je choisit nom il me proposera emma,marc,julien...
Donc depuis flex je récupère les chois dans des variables string.
Ce que j'aimerais faire et qui me pose problème c'est pouvoir donc pouvoir afficher la ligne qui m'affichera seulement les données de emma par exemple si je choisit ce nom.
J'avais pensé à quelque chose du genre:
Code :
1
2
	var valeur:XMLListCollection = new XMLListCollection(fichierXML.contact.nom==emma);
	dataGrid.dataProvider=valeur;
Voilà en faite j'aimerais savoir quoi mettre à la place de nom==emma

Merci
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 13h39   #2
Modérateur
 
Homme
Consultant Flex / Java
Inscription : novembre 2008
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Luxembourg

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

Informations forums :
Inscription : novembre 2008
Messages : 452
Points : 637
Points : 637
Salut,
ne pourrais tu pas plutôt remplir ta datagrid à partir de ton xml, et appliquer une filterFunction à ta grid , en fonction des valeurs sélectionnées dans les combobox ?
__________________
N'oubliez pas avant de poster :
et bien sûr la doc Flex
Krazymins est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h09   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
Oui ça fonctionnerait aussi, mais comment implémenter tout ça tu as une idée?
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h44   #4
Modérateur
 
Homme
Consultant Flex / Java
Inscription : novembre 2008
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Luxembourg

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

Informations forums :
Inscription : novembre 2008
Messages : 452
Points : 637
Points : 637
Oui ce n'est pas bien compliqué, mais il va falloir que tu cherches un peu de ton côté aussi , d'autant plus que les articles sur ce genre de sujet sont nombreux sur la toile ..
Je risque de faire de la paraphrase de mon post précédent, mais voici en gros ce que tu dois faire :

- Récupérer ton xml, remplir le dataprovider de ta datagrid avec les données
2 exemples : (http://journal.third-road.net/2007/0...s-donnees-xml/, et http://journal.third-road.net/2007/0...s-donnees-xml/)
- affecter une filterFunction sur la grid :

Code :
1
2
 
<mx:AdvancedDatagrid id="myDG" filterFunction="myDGFilterFunction" />
Et la filterfunction :

Citation:
private function myDGFilterFunction(obj:Object):Boolean {
var containsSurname:Boolean = (obj.name == mySurnameCombobox.selectedLabel);
var containsFirstname:Boolean = (obj.prenom == myfirstnameCombobox.selectedLabel);
var res:Boolean = containsSurname && containsFirstname;
return res;
}
Pour chaque item de ton dataprovider il vérifie la condition spécifiée. si celle-ci est vérifiée (res == true), alors la donnée est affichée et le contraire si res == false.
__________________
N'oubliez pas avant de poster :
et bien sûr la doc Flex
Krazymins est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 15h38   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
Ok merci j'ai cherché et j'ai compris j'arrive à faire ma fonction de tri, le soucis c'est que j'ai une erreur
Code :
<mx:DataGrid x="10" y="10" id="dataGrid" height="342" width="722" filterFunction="myDGFilterFunction">
Apparemment je peux pas mettre l'attribut filterfunction sur mon datagrid.

J'obtiens l'erreur: impossible de résoudre l'attribut filterfunction pour le type de composant ... datatgrid.
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 15h48   #6
Modérateur
 
Homme
Consultant Flex / Java
Inscription : novembre 2008
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Luxembourg

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

Informations forums :
Inscription : novembre 2008
Messages : 452
Points : 637
Points : 637
Oui car tu utilises une datagrid, et non une advancedDatagrid. N'oublie pas de jeter un coup d'oeil dans la doc ...
__________________
N'oubliez pas avant de poster :
et bien sûr la doc Flex
Krazymins est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 15h56   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
J'ai peut être trouvé une solution mais je suis pas sur,
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected function drop2_changeHandler(event:IndexChangeEvent):void
{
 
	var valeur:XMLListCollection = new XMLListCollection();
	valeur.filterFunction = filtre1;
	valeur.refresh();
	dataGrid.dataProvider=valeur;
}
 
private function filtre1(obj:Object):Boolean {
	var critere:String=drop1.selectedItem;
	var var1:String=drop2.selectedItem;
	return obj[critere]==var1;
}
Voilà mes 2 fonctions je récupère les noms sélectionnés dans mes2 dropdownlist, j'applique le filtre sur mon XMLListCollection crée pour contenir le résultat, dans ma fonction de filtre je retourne l'objet pour le critère choisit et la valeur du critère par exemple critère = nom et var1 = emma. Je pense que c'est ici que ça ne vas pas ou alors je me trompe complétement?
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h39   #8
Modérateur
 
Homme
Consultant Flex / Java
Inscription : novembre 2008
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Luxembourg

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

Informations forums :
Inscription : novembre 2008
Messages : 452
Points : 637
Points : 637
Dans ta filterFunction, ce ne serait pas plutôt :

Code :
1
2
var critere:String=drop1.selectedLabel;
var var1:String=drop2.selectedLabel;
__________________
N'oubliez pas avant de poster :
et bien sûr la doc Flex
Krazymins est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h43   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
Non quand j'essaie de mettre cette syntaxe j'obtiens cette erreur:

1119: Accès à la propriété selectedLabel peut-être non définie, via la référence de type static spark.componentsropDownList.

Je comprend pas pourquoi mon code fonctionne pas j'ai beau chercher je vois pas mon erreur alors que je doit l'avoir sous le nez
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 16h49   #10
Modérateur
 
Homme
Consultant Flex / Java
Inscription : novembre 2008
Messages : 452
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Luxembourg

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

Informations forums :
Inscription : novembre 2008
Messages : 452
Points : 637
Points : 637
Est-ce que tu pourrais nous montrer un peu plus de ton code stp, ce sera plus facile pour t'aider (les dropdowns, la DG, la filterFunction , la fonction init si tu en as une etc ..)
__________________
N'oubliez pas avant de poster :
et bien sûr la doc Flex
Krazymins est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 21h39   #11
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
ok voila le code
Code :
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
protected function drop1_changeHandler(event:IndexChangeEvent):void
{
	var critere:String=drop1.selectedItem;
	drop2.enabled=true;
	drop2.prompt="Selectionnez un résultat";
	var panel:int=tn.selectedIndex;
	if ( panel==0 ){
		var valeur:XMLListCollection = new XMLListCollection(fichierXML.contact[critere]);		
		drop2.dataProvider=valeur;
	}
	else if ( panel==1){
		var valeur:XMLListCollection = new XMLListCollection(fichierXML2.organisme[critere]);
		drop2.dataProvider=valeur;
	}
}
 
protected function drop2_changeHandler(event:IndexChangeEvent):void
{
 
	var valeur:XMLListCollection = new XMLListCollection();
	valeur.filterFunction = filtre1;
	valeur.refresh();
	dataGrid.dataProvider=valeur;
}
 
private function filtre1(obj:Object):Boolean {
	var critere:String=drop1.selectedItem;
	var var1:String=drop2.selectedItem;
	return obj.contact[critere]==var1;
} 
 
protected function refresh_clickHandler(event:MouseEvent):void{
	dataGrid.dataProvider=fichierXML.contact;	
}
Voilà tout ce que j'ai j'espère que sa vous aidera
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 10h04   #12
Membre régulier
 
Avatar de ToniConti
 
Inscription : novembre 2009
Messages : 231
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 231
Points : 90
Points : 90
Bonjour,

C'est une implémentation que je fais souvent et je me dis que faire partager ma façon de faire (fonctionnelle) pourrait aider :

Code :
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
<mx:Script>
  <![CDATA[
 
  private function filtre1(item:Object):Boolean
  {
    var validite:Boolean = true;
 
    if(cbForce.selectedItem && cbForce.selectedItem.FORCE_DE_VENTE != "Tous")
      validite &&= (item.FORCE_DE_VENTE == cbForce.selectedItem.FORCE_DE_VENTE);
    if(cbEditeur.selectedItem && cbEditeur.selectedItem.EDITEUR != "Tous")
      validite &&= (item.EDITEUR == cbEditeur.selectedItem.EDITEUR);
    if(cbClient.selectedItem && cbClient.selectedItem.CLIENT != "Tous")
      validite &&= (item.CLIENT == cbClient.selectedItem.CLIENT);
    if(cbDebut.selectedItem && cbDebut.selectedItem.DEBUT != "Tous")
      validite &&= (item.DEBUT == cbDebut.selectedItem.DEBUT);
    if(cbTaux.selectedItem && cbTaux.selectedItem.TAUX != "Tous")
      validite &&= (item.TAUX == cbTaux.selectedItem.TAUX);
 
    return validite;
  }
 
  ]]>
</mx:Script>
 
//Mes filtres
<mx:HBox paddingBottom="15">
  <mx:ComboBox id="cbForce" labelField="FORCE_DE_VENTE" change="provider.refresh()" width="100" />
  <mx:ComboBox id="cbEditeur" labelField="EDITEUR" change="provider.refresh()" width="100" />
  <mx:ComboBox id="cbClient" labelField="CLIENT" change="provider.refresh()" width="100" />
  <mx:ComboBox id="cbDebut" labelField="DEBUT" change="provider.refresh()" width="100" labelFunction="formatComboFR" />
  <mx:ComboBox id="cbTaux" labelField="TAUX" change="provider.refresh()" width="100" />
</mx:HBox>
 
//Ma Datagrid
<mx:DataGrid id="liste1" width="100%" height="100%" dataProvider="{provider}" allowMultipleSelection="true" >
  <mx:columns>
    <mx:DataGridColumn dataField="FORCE_DE_VENTE" headerText="Force de vente" width="100" />
    <mx:DataGridColumn dataField="EDITEUR" headerText="Editeur" width="100" />
    <mx:DataGridColumn dataField="CLIENT" headerText="Client" width="100" />
    <mx:DataGridColumn dataField="DEBUT" headerText="Date début" width="100" labelFunction="formatGridFR" />
    <mx:DataGridColumn dataField="TAUX" headerText="Taux" width="100" />
  </mx:columns>
</mx:DataGrid>
Cette solution gère les cas de :
- bug de sélection dans les combobox (cbForce.selectedItem && ...)
- possibibilité de tout avoir (chaque combobox contient la valeur "Tous")
- plusieurs filtres combinés

A remarquer aussi la façon que le provider de la DataGrid est déclaré qu'une seule fois
ainsi que l'évènement "change" des combobox qui vont provoquer le refresh du provider directement.

Attention le provider doit être déclaré bindable comme ceci :
Code :
  [Bindable] private var provider:XMLListCollection;
J'espère que ceci aidera, bon courage
ToniConti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 13h26   #13
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 60
Points : 12
Points : 12
Merci de ta réponse je regarderais ça ce week end car mes cours on repris et j'ai pas trop de temps, je vous tien au courant pour les tests merci encore
xclue est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h05.


 
 
 
 
Partenaires

Hébergement Web