XML nidificati profonda
-
22-09-2019 - |
Domanda
Sto cercando di visualizzare un elenco di elementi in un datagrid da un XMLList.
<Series no="1">
<file>
<filenum>1</epnum>
<prodnum>4V01</prodnum>
<title>Series #1 - File #1</title>
</file>
<file>
<filenum>2</epnum>
<prodnum>4V02</prodnum>
<title>Series #1 - File #2</title>
</file>
</Series>
<Series no="2">
<file>
<filenum>1</epnum>
<prodnum>4V01</prodnum>
<title>Series #2 - File #1</title>
</file>
<file>
<filenum>2</epnum>
<prodnum>4V02</prodnum>
<title>Series #2 - File #2</title>
</file>
</Series>
Il mio codice attuale mi permette di recuperare tutte le serie in un XMLList e poi ho una classe nesteddatagrid che mi permette di fare le cose come.
<classes:NestedDataGrid width="100%" height="100%" id="gridFiles" dataProvider="{filesList}" >
<classes:columns>
<mx:DataGridColumn headerText="Season" dataField="@no" width="60"/>
<mx:DataGridColumn headerText="Episode" dataField="file.filenum" width="60"/>
<mx:DataGridColumn headerText="Title" dataField="file.title"/>
</classes:columns>
</classes:NestedDataGrid>
Tuttavia questo visualizza il datagrid con due file, la prima riga ha 1 nella colonna serie e quindi i due file stipati seconda cella nella stessa riga. La seconda fila è lo stesso, ma ha il numero 2 nella colonna Series e la # 2 file della serie due stipati nella cella accanto ad esso.
Se io non uso la classe di dati annidata posso tirare i file utilizzando Series.file posto e tutti e 4 della lista di file in modo corretto, ma non ho ricevuto il numero di serie per ogni ...
Soluzione
Con l'attuale struttura del XML, è più facile rappresentare con una griglia di due colonne - prima colonna è il numero di serie, e nella seconda colonna essendo un'altra DataGrid 2 o 3 colonna che mostra i dettagli del file. Ma se non si vuole modificare la struttura, il seguente codice è quello che serve. Si noti che, poiché proprietà dataField
non è impostata, è necessario specificare un sortCompareFunction
per l'ordinamento della griglia in base al numero di serie -. Altrimenti potrebbe generare eccezioni durante il tentativo di risolvere
<classes:NestedDataGrid width="100%" height="100%" id="gridFiles"
dataProvider="{filesList.Series.file}" >
<classes:columns><!-- classes copy pasted from OP's code. Whats that? -->
<mx:DataGridColumn headerText="Season" labelFunction="getSeries" width="60"/>
<mx:DataGridColumn headerText="Episode" dataField="filenum" width="60"/>
<mx:DataGridColumn headerText="Title" dataField="title"/>
</classes:columns>
</classes:NestedDataGrid>
private function getSeries(item:Object, col:DataGridColumn):String
{
return XML(item).parent().@no;
}
UPDATE:
<mx:DataGrid width="100%" height="100%" id="gridFiles" >
<mx:columns>
<mx:DataGridColumn headerText="Season" labelFunction="getSeries" width="60"/>
<mx:DataGridColumn headerText="Episode" dataField="epnum" width="60"/>
<mx:DataGridColumn headerText="Title" dataField="title"/>
</mx:columns>
</mx:DataGrid>
gridFiles.dataProvider = XML(event.result).descendants('episode');
//use the same getSeries function as above