2009-10-28 6 views
1

Comment filtrer une grille de données en fonction de la valeur de la zone de liste déroulante? Quelqu'un peut-il me montrer de bons exemples?Filtrer un dataGrid avec un comboBox en flex

Dans mon application, je filtre déjà une grille de données en fonction du texte saisi par l'utilisateur. Je vérifie si la chaîne entrée correspond à l'entrée de la colonne de données et si une correspondance est trouvée, la fonction filterFunction du fournisseur de données est appelée. Tout ce que j'ai fait avec l'aide d'un tutoriel seulement, car j'apprends flex comme je fais mon projet.

est que le code:

<mx:FormItem direction="horizontal"> 
    <mx:ComboBox id="searchCriteria1" dataProvider="{criteriaDP1}" change="searchFunction()"/> 
    <mx:TextInput id="search" change="searchFunction()"/> 
    <mx:Button label="Clear Search" click="clear()" /> 
</mx:FormItem> 

private function searchFunction():void{ 
defectList.filterFunction = filterItems; 
defectList.refresh(); 
} 

private function filterItems(item:Object):Boolean 
{ 
var isMatch:Boolean = false   

    if(searchCriteria1.selectedItem.label == "Defect Id") 
{ 
    if(item.defId.toString().search(search.text.toString()) != -1) 
    { 
     isMatch = true 
    } 
} 
else if(searchCriteria1.selectedItem.label == "Review Id") 
{ 
    if(item.revId.toString().search(search.text.toString()) != -1) 
    { 
     isMatch = true 
    } 
} 
    return isMatch; 

} 

Ici defectList est le fournisseur de données à la grille de données, revId, defId sont les colonnes de la grille de données.

Maintenant, comment puis-je filtrer, avec des listes déroulantes. J'ai une liste déroulante appelée "priorité" avec les valeurs "haut", "moyen", "bas", "tout". Si je sélectionne tout, aucun filtrage n'est effectué. Si je sélectionne "high", seuls les champs avec une valeur de colonne de priprity "high" devraient apparaître.

EDIT J'ai même essayé comme ceci:

if(searchCriteria2.selectedItem.label=="Priority") 
{ 
     if (item.revType.toLowerCase().search(searchCriteria.selectedLabel.toLowerCase()) != -1) 
{ 
       Alert("yes"); 
    isMatch=true 
} 
} 

critèreRech est le comboBox, où j'ai les articles, "ALL", "HIGH" ... J'ai deux lignes avec la valeur " haut "et je reçois l'alerte" oui "pour deux fois seulement. Mais dans la grille de données, toutes les quatre lignes sont affichées.

Répondre

0

Vous semblez effectuer une recherche sur la colonne revType plutôt que sur la colonne Priorité.

Il peut être utile de trouver un moyen de réduire la quantité de code dupliqué dans votre application pour éviter les bugs comme celui-ci. Par exemple, votre liste de champs pourrait ressembler à ceci:

[Bindable] 
var criteriaDP1:ArrayCollection = new ArrayCollection([{label:"Review ID", value:"RevID"}, 
                 {label:"Defect Id", value:"DefID"}]); 

Sa mise en place comme cela vous permettra d'utiliser le champ value comme un index sur votre fournisseur de données, comme ceci:

public function search_clickHandler():void 
{ 
    defectList.filterFunction = function(item:Object):Boolean 
    { 
     var gridValue:String = item[searchCriteria.selectedItem.value].toString().toLowerCase(); 
     var searchValue:String = search.text.toLowerCase(); 
     if(gridValue.search(searchValue) != -1) 
     { 
      return true;       
     } 
     return false; 
    }; 
    defectList.refresh(); 
} 
Questions connexes