2010-08-25 5 views
1

J'utilise AdvancedDatagrid dans Flex 3. Une colonne de AdvancedDatagrid contient des nombres et des alphabets. Quand je trier cette colonne, les nombres viennent avant les alphabets (comportement par défaut du tri interne d'AdvancedDatagrid). Mais je veux que les alphabets viennent avant le nombre quand je trie. Je sais que je vais devoir écrire la fonction de tri personnalisée. Mais quelqu'un peut-il donner une idée sur la façon de procéder?Tri dans AdvancedDatagrid dans Flex 3

Merci d'avance.

Répondre

1

Utilisez sortCompareFunction

Le contrôle AdvancedDataGrid utilise cette fonction pour trier les éléments de la collection du fournisseur de données. La signature de la fonction de la fonction de rappel prend deux paramètres et a la forme suivante:

mySortCompareFunction(obj1:Object, obj2:Object):int

OBJ1 - Un élément de données à comparer.

obj2 - Un autre élément de données à comparer avec obj1.

La fonction doit renvoyer une valeur basée sur la comparaison des objets:

  • -1 si obj1 apparaît avant obj2 dans l'ordre croissant.
  • 0 si obj1 = obj2.
  • 1 si obj1 doit apparaître après obj2 dans l'ordre croissant.
<mx:AdvancedDataGridColumn sortCompareFunction="mySort" 
    dataField="colData"/> 

Effectuez les opérations suivantes comparer la fonction de tri.

public function mySort(obj1:Object, obj2:Object):int 
{ 
    var s1:String = obj1.colData; 
    var s2:String = obj2.colData; 
    var result:Number = s1.localeCompare(s2); 
    if(result != 0) 
     result = result > 0 ? 1 : -1; 
    if(s1.match(/^\d/)) 
    { 
     if(s2.match(/^\d/)) 
      return result; 
     else 
      return 1; 
    } 
    else if(s2.match(/^\d/)) 
     return -1; 
    else 
     return result; 
} 

Il vérifie le premier caractère des chaînes et repousse celles qui commencent par un chiffre vers le bas dans l'ordre de tri. Il utilise localeCompare pour comparer deux chaînes si elles commencent toutes les deux avec des lettres ou des chiffres - sinon, il dit que celui commençant par une lettre devrait précéder celui avec un chiffre. Ainsi abc précédera 123 mais a12 viendra encore avant abc.

Si vous voulez un type totalement différent où les lettres précèdent toujours les chiffres indépendamment de leur position dans la chaîne, vous devrez en écrire une à partir du zéro - String::charCodeAt pourrait être un bon point de départ.