Definindo a ordem inicial de um DataGrid no Flex 3

Às vezes precisamos, no Flex, fazer com que um DataGrid mostre os dados ordenados por uma determinada coluna. O problema é que esses dados não vêm ordenados do backend (pois não faz nenhum sentido ordená-los lá, isso é tarefa para o frontend). Isso é possível quando o usuário clica no cabeçalho da coluna (desde que a ordenação não tenha sido desabilitada), mas … você acredita que ele vai clicar? :)

Temos duas formas de ordenar os dados a serem mostrados: ordenando o dataProvider do DataGrid ou simulando o clique no cabeçalho da coluna. Cada um deles tem suas vantagens e desvantagens. Vamos ver:

Ordenando o dataProvider

De acordo a documentação, a melhor forma de ordenar os dados do dataGrid é ordenar seu dataProvider. Para isso, ele tem que implementar a interface ICollectionView (um ArrayCollection, por exemplo), e você pode usar o objeto Sort, assim:

[as]
arrColl.sort = new Sort();
arrColl.sort.fields = [new SortField("nome", false, true)];
arrColl.refresh();
[/as]

Dessa forma, você está ordenando o seu dataProvider de acordo os campos (SortField) especificados. Nesse caso, o ArrayCollection arrColl será ordenado pelo campo “nome”, ignorando a diferença entre maiúsculas/minúsculas (segundo parâmetro – caseInsensitive) e em ordem ascendente (terceiro parâmetro – descending). Ainda existe um quarto parâmetro (numeric), um valor booleano que indica se os valores daquela coluna são numéricos ou textuais, o que resolve o problema da ordenação em colunas que possuem valores numéricos, mas que o FlashPlayer interpreta como texto.

Essa forma de ordenação não funciona caso o seu dataProvider seja um XML. Veja um exemplo no site BealeARTS.

Simulando o clique no cabeçalho da coluna

Essa é a solução mais óbvia: se o usuário precisaria clicar no cabeçalho da coluna que queremos ordenar toda vez que o dataProvider fosse carregado e não queremos confiar que ele fará isso (e já sabemos que ele não fará), podemos fazer isso pra ele!

Imagine: quando o usuário clica no cabeçalho da coluna, o que acontece? Ele dispara um evento, não é? Então taí a solução: disparar esse evento quando o dataProvider for atualizado. Aqui está um exemplo de como disparar esse evento:

[as]
dispatchEvent ( new DataGridEvent(DataGridEvent.HEADER_RELEASE, false, true, 0, null, 0, null, null, 0));
[/as]

Vamos explicar melhor as coisas. Os parâmetros passados para o DataGridEvent são: o tipo do evento (type), se ele vai ou não “flutuar” entre os componentes superiores a ele na hierarquia (bubble), se o evento pode ou não ser interrompido enquanto flutua (cancellable), o índice da coluna a ser ordenada contada a partir do zero (columnIndex), o campo dataField da coluna (dataField), o número da linha onde está o item a ser ordenado contado a partir de zero (rowIndex), a razão do evento no caso de um evento do tipo itemEditEnd (reason) e o ItemRenderer do cabeçalho que foi clicado (itemRenderer).

A desvantagem dessa forma de ordenação é que ela é menos flexível. você só consegue ordenar uma coluna por vez, e não tem como especificar que a ordenação deve ignorar ou não a diferença entre os caracteres maiúsculos e minúsculos. Além disso, dependendo de onde você aplicar essa “técnica”, podemos até considerar isso uma “gambiarra”, algo que devemos evitar sempre. Veja um exemplo no site Flexamples.

Boa sorte! ;)


Poderia avaliar este artigo, por favor?

1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Nenhum voto)
Loading ... Loading ...

Posts relacionados

  • Tatiane

    Foi muito útil, obrigada!

  • Tatiane

    Foi muito útil, obrigada!

  • Aaa

    naum funciona meu