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
suivanteprotected 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
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
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