Flex DataGrid – řazení dat

23.8.2007· Autor: Ondřej Brichta· Počet komentářů: 7

Řazení dat v DataGrid komponentě je často využívanou funkcí, ovšem výchozí nastavení řazení je téměř nepoužitelné, proto si dnes ukážeme jak připravit vlastní funkci pro řazení dat v této komponentě.

Řazení dat

Při zobrazení dat v DataGrid komponentě je možné tyt údaje řadit vzestupně/sestupně kliknutím na záhlaví konkrétních sloupců tabulky. Výchozí způsob řazení dat v této komponentě je povětšinou nevyhovující, protože jsou data řazena jako String řetězce. Co to ve svém důsledku znamená?

Pokud budeme mít údaje:
3,10,15,2,25,210
a necháme je seřadit od nejmenšího do největšího, dostaneme tuto posloupnost:
10,15,2,210,25,3
Hodnoty jsou brány jako proměnné typu String a podle toho jsou také řazeny. Pokud tak máme v tabulce číselné údaje, nebo jiné formáty dat (měna, datum ...), musíme využít odlišný způsob řazení dat.

Naštěstí je na tyto případy v DataGrid komponentě pamatováno a my můžeme vytvořit vlastní funkce, které budou řazení dat provádět. Tyto funkce se připojují k atributu „sortCompareFunction" v tagu „DataGridColumn": <mx:DataGridColumn sortCompareFunction="sortNums" ...

Samotná funkce třídění pak může vypadat následovně:

private function sortNums(n1:Object,n2:Object):int{
 var res:int;
 if(Number(n1.prodej)>Number(n2.prodej)){
 res = 1;
 }else if(Number(n1.prodej)<Number(n2.prodej)){
 res = -1;
 }else{
 res = 0;
 }
 return res;
 }

Funkce je volána s dvěma parametry, kterými jsou porovnávané hodnoty - řádky. Pokud jeden řádek obsahuje více položek (více sloupců) odkážeme se na konkrétní hodnotu přes stejnojmennou vlastnost předaného objektu: n2.prodej - odkaz na sloupec se zobrazením dat prodeje.

V samotné funkci je už na nás, jakým způsobem provedeme porovnání obou předaných hodnot, pouze musíme zajistit navrácení jedné z možných hodnot 1,-1 a 0, které představují vztah mezi předanými hodnotami.
Navrácení hodnoty 1 znamená, že první hodnota je větší než druhá, číslo -1 představuje opačný stav a hodnota 0 představuje rovnost obou hodnot.

V případě třídění číselných hodnot se nesetkáme s extra velkými potížemi, ty ovšem mohou nastat, pokud chceme třídit hodnoty ve formátu času, nebo data. Pokud budeme mít například datum ve formátu: DD/MM/RRRR nemůžeme použít klasické třídění, takže musíme přistoupit ke třídění pomocí vlastní funkce.

Jedna z účinných metod třídění dat vede k převodu obou hodnot na typ: RRRR/MM/DD který lze bez problému porovnávat jako typ String i jako typ Number (případně int). Jediné, co musíme zajistit, je převod případných jednociferných údaj na dvojciferné. Ovšem ani toto není nijak náročné, proto výsledná funkce třídění času může vypadat takto:

private function compareDates(d1:Object, d2:Object):int{
 var result:int;
 var row1Date:String;
 var row2Date:String;
 //rozdělíme data podle znaku /
 var arr1:Array = String(d1.datum).split("/");
 var arr2:Array = String(d2.datum).split("/");
 //pokud je některý údaj jednociferný, přidáme 0
 if(arr1[0].length==1){
 arr1[0]="0"+arr1[0];
 };
 if(arr1[1].length==1){
 arr1[1]="0"+arr1[1];
 };
 if(arr2[0].length==1){
 arr2[0]="0"+arr2[0];
 };
 if(arr2[1].length==1){
 arr2[1]="0"+arr2[1];
 };
 //převedeme formát na RRRR/MM/DD
 row1Date = new String(arr1[2] + arr1[1] + arr1[0]);
 row2Date = new String(arr2[2] + arr2[1] + arr2[0]);
 //porovnáme oba údaje
 if (row1Date > row2Date){
 result = 1;
 } else if (row1Date < row2Date){
 result = -1;
 } else{
 result = 0;
 }
 return result;
 }

Ukázka různého třídění dat v DataGrid komponentě:

Zdrojové soubory ukázky: sort.zip

Ondřej Brichta Vývojář multimediálních aplikací, šéfredaktor Flash.cz, školitel produktů Flash, Flex, Flash Media Server

Web: http://www.obria.cz |

Motto: <°))))><

Seriál: Tipy a triky

Tipy a triky je seriál zaměřený na zajímavá řešení a vylepšení flashových aplikací

Komentáře k článku  
datagrid - drag & drop lemrosh | 29.8.2007 8:59
řazení v DG lemrosh | 29.8.2007 9:09
Re: řazení v DG OBr | 30.8.2007 8:22
Re: Re: řazení v DG lemrosh | 30.8.2007 11:48
Re: Re: Re: řazení v DG OBr | 30.8.2007 14:13
Re: Re: Re: Re: řazení v DG lemrosh | 30.8.2007 15:42
Re: Re: Re: Re: Re: řazení v DG OBr | 31.8.2007 10:12

Přihlášení uživatele