sortCompareFunction non viene chiamato quando si usa HierarchicalData in un AdvancedDataGrid

Flex Soft! Commenta l'articolo


Come da titolo, la chiamata a sortCompareFunction quando come dataprovider viene usato un HierarchicalData non parte.

Il codice seguente mostra come un datagrid riordini la colonna secondo una funzione specifica:

<mx:AdvancedDataGrid dataProvider={list} > 
<mx:AdvancedDataGridColumn headerText="Prodotto" labelFunction="getDescrizione" sortCompareFunction="sortProdottoDescrizione" sortable="true" />

Se però utilizziamo un oggetto gerarchico, esce fuori un bug, per cui sortCompareFunction non viene chiamata.
Sono riuscito a correggere questo bug aggirando il problema.

<mx:AdvancedDataGrid > 
<mx:dataProvider>
	<mx:HierarchicalData source="{_list}"/>
</mx:dataProvider>
<mx:AdvancedDataGridColumn headerText="Prodotto" labelFunction="getDescrizione" sortCompareFunction="sortProdottoDescrizione" sortable="true" />

Aggiungiamo al datagrid l’evento headerRelease:

<mx:AdvancedDataGrid headerRelease="clickHeaderDataGrid(event)"> 
<mx:dataProvider>
	<mx:HierarchicalData source="{_list}"/>
</mx:dataProvider>
<mx:AdvancedDataGridColumn headerText="Prodotto" labelFunction="getDescrizione" sortCompareFunction="sortProdottoDescrizione" sortable="true" />

Dopodichè procediamo a riconoscere quale colonna è stata “cliccata”:

private function clickHeaderDataGrid(event:AdvancedDataGridEvent): void {
				var s: String = ((event.itemRenderer as AdvancedDataGridHeaderRenderer ).data as AdvancedDataGridColumn).headerText;
				if (s == 'Prodotto')
					headerSortProdottoDescrizione();
			}

La funzione headerSortProdottoDescrizione crea l’ordinamento che si era perso con la chiamata a sortCompareFuction:

static private var descendingProdottoDescrizione: Boolean = false;

private function headerSortProdottoDescrizione(): void {
				dgProdottiConf.validateNow();
				
				var sort:Sort = new Sort();
				var sortField:SortField = new SortField();
				
				sortField.descending = descendingProdottoDescrizione;
				descendingProdottoDescrizione = !descendingProdottoDescrizione;
				
				sortField.compareFunction = sortProdottoDescrizione;
				sort.fields = [sortField]; 
				_listProdottoConf.sort = sort;
				_listProdottoConf.refresh();
			}

Vediamolo in dettaglio. La variabile descendingProdottoDescrizione serve per mantenere ordine crescente e decrescente ad ogni click, altrimenti rimane sempre decrescente (anche questo è un bug). Assegna a compareFunction la funzione per l’ordinamento e applica l’ordinamento con .refresh().

Il risultato è quello di avere l’ordinamento che avevamo prima per un semplice datagrid, ma questa volta con l’oggetto gerarchico per rappresentare i dati.

Buon lavoro.

Scrivi un Commento

Home | Graffiti e Disegni | Educazione | Chi siamo | Blog | Progetti | Contatti
RSS Feed Comments RSS Accedi