A idéia:
Ao organizar ou alterar os tamanhos das colunas de um DataGrid/AdvancedDataGrid salve as posições e os tamanhos das colunas.
A solução:
Altere o tamanho e/ou a ordem das colunas, e recarregue a página. Elas irão voltar na mesma ordem e tamanho que você as deixou.
Clique com o botão direito em cima do DataGrid, depois em "view source" para visualizar o código fonte.
ou
SalvarColunas.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application viewSourceURL="srcview/index.html"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.events.FlexEvent;
import mx.utils.ObjectUtil;
/* salvar ordem das colunas */
public function reordenarColunas(event:Event, nomeSharedObj:String):void {
var grid:* = event.currentTarget;
if (grid is DataGrid||grid is AdvancedDataGrid) {
var colunas:ArrayCollection = null;
//le informações salvas
var shared:SharedObjectHelper = new SharedObjectHelper(nomeSharedObj);
if (shared.getObjects()) {
if (shared.getObjects().length>0) {
if (shared.getObjects()!=null) {
colunas = shared.getObjects();
}
}
}
if (colunas==null) { //se nao tiver nada salvo, salva, e nao faz nada.
salvarOrdemColunas(event, nomeSharedObj);
return;
}
var colunasAtual:Array = grid.columns.slice(0, grid.columns.length); //pega as colunas atual
if (colunasAtual.length!=colunas.length) { //se sao colunas diferentes salva as novas.
salvarOrdemColunas(event, nomeSharedObj);
return;
}
var colunasNovo:Array = new Array();
var i:int = 0;
while (colunas.length>0) { //enquanto tiver colunas a serem alteradas
if (colunasAtual[i]!=null) { //se ja foi alterado a coluna é setado como nula.
if (colunasAtual[i].dataField.toString()==colunas.getItemAt(0).datafield.toString()) { //verifica se a atual é igual a coluna a ordenada
colunasAtual[i].width = colunas.getItemAt(0).width; //seta o tamanho da coluna
colunasNovo.push(colunasAtual[i]); //adiciona a coluna na ultima possição (para deixar na ordem)
//remove o que ja foi verificado
colunas.removeItemAt(0);
colunasAtual[i] = null;
i = -1; //zera o contador para reavaliar todas as colunas
}
}
i++;
}
grid.horizontalScrollPolicy = "on"; //atribui o Scroll horizontal por causa dos Widths setados na mao
grid.columns = colunasNovo; //seta as novas colunas no grid
grid.validateProperties(); //atualiza o grid para aparecer as novas colunas
}
}
public function salvarOrdemColunas(event:Event, nomeSharedObj:String):void {
var grid:* = event.currentTarget;
if (grid is DataGrid||grid is AdvancedDataGrid) {
var shared:SharedObjectHelper = new SharedObjectHelper(nomeSharedObj);
shared.clear();
var obj:Object = null;
for each (var i:Object in grid.columns) {
obj = new Object();
obj.datafield = i.dataField;
obj.width = i.width;
shared.addObject(obj);
}
}
}
]]>
</fx:Script>
<!--
columnStretch = ao redimencionar as colunas.
headerShift = ao trocar as colunas de posição.
-->
<mx:AdvancedDataGrid columnStretch="salvarOrdemColunas(event,'nomeDoObjetoSalvo')"
creationComplete="reordenarColunas(event,'nomeDoObjetoSalvo')"
headerShift="salvarOrdemColunas(event,'nomeDoObjetoSalvo')">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="a"/>
<mx:AdvancedDataGridColumn dataField="b"/>
<mx:AdvancedDataGridColumn dataField="c"/>
<mx:AdvancedDataGridColumn dataField="d"/>
<mx:AdvancedDataGridColumn dataField="e"/>
</mx:columns>
</mx:AdvancedDataGrid>
</s:Application>
SharedObjectHelper.as
package {
import flash.net.SharedObject;
import mx.collections.ArrayCollection;
public class SharedObjectHelper {
private var _sharedObject:SharedObject;
private var _dadosSharedObject:ArrayCollection;
private var _nomeArquivoSharedObject:String;
/**
* Construtor
*/
public function SharedObjectHelper(valor:String) {
inicializaHelper(valor);
}
/**
* Limpa objeto dentro do SharedObject
*/
public function clear():void {
_dadosSharedObject.removeAll();
_sharedObject.flush();
}
/**
* @private
* Responsavel por recuperar a instancia do SharedObject baseado no
* parametro.
*
*/
private function inicializaHelper(valor:String):void {
_dadosSharedObject = new ArrayCollection();
_nomeArquivoSharedObject = valor;
_sharedObject = SharedObject.getLocal(_nomeArquivoSharedObject);
if (getObjects()) {
_dadosSharedObject = getObjects();
}
}
/**
* Retorna todos um array de dados que está armazendo no SharedObject
* @return ArrayCollection
*/
public function getObjects():ArrayCollection {
return _sharedObject.data[_nomeArquivoSharedObject];
}
/**
* Adiciona um dado ao array de dados.
* @param Object
*/
public function addObject(o:Object):void {
_dadosSharedObject.addItem(o);
updateSharedObjects();
}
/**
* @private
* Vincula o array de dados a um SharedObject.
*/
private function updateSharedObjects():void {
_sharedObject.data[_nomeArquivoSharedObject] = _dadosSharedObject;
_sharedObject.flush();
}
}
}
Da maneira que foi implementado, as definições da posição e do tamanho das colunas são salvas na memória do FlashPlayer (como se fosse os cookies das páginas web), ao limpar esse "cookie" as configurações voltam ao estado original.
Por hoje é isso. Em breve novas dicas.
Comentem!!!