2010-11-17 26 views
0

J'ai un datagrid avancé et j'implémente un tri personnalisé. Ma grille adv.data ralentit sur chaque tri conséquent ... et si les nœuds sont ouverts, cela expire simplement.Flex AdvancedDataGrid Problème de tri personnalisé

Mes données se présente comme suit (g = grp sur ID) *

ID f_name l_name fld1 fld2 
(g) 
-------------------------------------- 
1  A1  B1  xyx xyz 
     A6  B6  xyx xyz 
-------------------------------------- 
2  A3  B3  xyx xyz 
     A8  B8  xyx xyz 
-------------------------------------- 

Quand je sorte sur f_name ou L_Name le tri ArrayCollection doit classer et afficher les données comme suit (g = grp sur ID) * :

ID  f_name l_name fld1 fld2 
(g) 
----------------------------------------- 
1(1)  A1  B1  xyx xyz 
2(2)  A3  B3  xyx xyz 
----------------------------------------- 
1(3)  A6  B6  xyx xyz 
2(4)  A6  B6  xyx xyz 
----------------------------------------- 

Pour ce faire, je suis Intégrant un événement de tri qui ressemble à la

suivante
protected function adg1_headerReleaseHandler(event:AdvancedDataGridEvent):void 
{ 
event.preventDefault(); 

sort_dir = !sort_dir; 
var sort:Sort = new Sort(); 
sort.fields = [new SortField(event.dataField, true,sort_dir),new SortField('ID', true,sort_dir)] 
_ds.sort = sort; 
_ds.refresh(); 

adg1.dataProvider = null; 
var previousRegId:int = 0; 
var counter:int = 0; 

for each (var item:DueInVO in _ds) { 
    if (previousRegId != item.ID) { 
    counter++; 
    previousRegId = item.ID 
    } 
    item.uid = counter; 
} 

/* 
var previousRegId:int = 0; 
var counter:int = 0; 
var csr:IViewCursor = DataSource.createCursor(); 
while(!csr.afterLast){ 
    if (previousRegId != csr.current.registration_id) { 
    counter++; 
    previousRegId = csr.current.registration_id 
    } 

    csr.current.uid = counter; 
    csr.moveNext(); 
} 
*/ 
setGrouping(['uid']); 
//csr = null; 
} 

et la fonction setGrouping se présente comme suit:

protected function setGrouping(columnNames:Array):void{ 
var _groupingColumns:Array = []; 
var gc:GroupingField; 
if (columnNames.length > 0) { 
    var _groupedData:GroupingCollection2 = new GroupingCollection2(); 
    var _grouping:Grouping = new Grouping(); 

    for (var i:int=0;i<columnNames.length;i++) { 
    gc = new GroupingField(columnNames[i]); 
    //gc.numeric = true; 
    //gc.compareFunction = compareFunc; 
    //gc.groupingFunction = groupFunc; 
    _groupingColumns.push(gc); 

    } 
    _groupedData.source = _ds; 
    _grouping.fields = _groupingColumns; 
    _groupedData.grouping = _grouping 
    _groupedData.refresh(); 
    adg1.dataProvider = _groupedData; 
} else { 
    adg1.dataProvider = _ds; 
} 
} 

Toutefois, chaque demande par conséquent de trier prend plus de temps et plus de temps à résoudre. Comme indiqué ci-dessus, si les nœuds de groupement sont activés, il y a une probabilité élevée que le lecteur Flash se bloque.

Je suppose qu'il y a une mem-leak quelque part mais je ne suis pas capable de mettre le doigt dessus.

Si quelqu'un demande le code complet, je serai heureux de fournir ..

Toute aide est grandement appréciée

Répondre

0

Au lieu de faire cela, il vous suffit de fournir un sortCompareFunction à votre colonne ADG. Vous n'avez pas besoin de capturer l'événement de clic d'en-tête et tout ça. C'est déjà fait pour toi. Tout ce que vous avez à faire est de spécifier comment votre comparaison pour une colonne particulière se déroulera.

+0

Fonction de rappel qui est appelée lors du tri des données dans la colonne. Si cette propriété n'est pas spécifiée, le tri essaie d'utiliser une chaîne de base ou un tri par nombre sur les données. Si les données ne sont pas une chaîne ou un nombre ou si la propriété dataField n'est pas une propriété valide du fournisseur de données, le tri ne fonctionne pas ou génère une exception.Si vous spécifiez une valeur de la propriété labelFunction, vous devez également fournir une fonction à la propriété sortCompareFunction, sauf si le tri n'est pas autorisé sur cette colonne. – user478727

+0

Le sortCompareFunction prend deux objets comme arguments. Ces objets peuvent être n'importe quoi, et votre code pour cette fonction a pour tâche de déterminer quelle propriété de l'objet comparer et comment le comparer. Les données ne doivent absolument pas être une chaîne ou un nombre. – Robusto

0

Je l'ai eu! ... Robusto merci de m'indiquer dans la bonne direction. Le problème avec votre suggestion dans mon cas est que je génère des colonnes à partir d'un fichier de configuration, donc je peux rendre ce composant de grille réutilisable. Donc à cause de cela: 1. J'utilise un labelFunction 2. column.sortCompareFunction = Le rappel myfunc ne fonctionne tout simplement pas comme cité dans la documentation de l'API Adobe. Cependant, comme vous l'avez dit, j'écrivais du code alambiqué. J'avais besoin d'ajouter gc.compareFunction = myCompare; au code suivant (comparez ci-dessus):

protected function setGrouping (columnNames: Array): void { _groupingColumns = [];

  if (columnNames.length > 0) { 
       _groupedData = new GroupingCollection2(); 

       _grouping = new Grouping(); 

       for (var i:int=0;i<columnNames.length;i++) { 
        var gc:GroupingField = new GroupingField(columnNames[i]); 
        gc.descending = _sort_direction; 

        gc.compareFunction = myCompare; 

        _groupingColumns.push(gc); 

       } 
       _groupedData.source = _ds; 
       _grouping.fields = _groupingColumns; 
       _groupedData.grouping = _grouping 
       _groupedData.refresh(); 
       _data = _groupedData; 
      } else { 
       _data = _ds; 
      } 

      setGridColumns(); 
     } 

Une fois cela fait, je devais juste écouter l'événement de tri dans l'auditeur AdvancedDataGrid et appelez le setGrouping ([abc]) à partir de là, comme suit:

protected function adg1_sortHandler(event:AdvancedDataGridEvent):void 
      { 
       _sortField = event.dataField; 
       if (temp.length == 0) { 
        temp.push(DefaultGroupColumn); 
       } 

       setGrouping(temp) 
       _sort_direction = !_sort_direction; 

J'espère que cette aide Quelqu'un! AAP