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í