2009-10-19 5 views
0

J'essaie d'afficher une liste d'éléments dans une grille de données à partir d'une liste XML.Deep Nested XML

<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> 

Mon code actuel me permet de récupérer toutes les séries dans un XMLList puis-je avoir une classe nesteddatagrid qui me permet de faire des choses comme.

<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> 

Cependant, cette affiche la grille de données à deux rangées, la première rangée comporte une série dans la colonne, puis les deux fichiers entassés dans la deuxième cellule dans la même rangée. La deuxième rangée est la même mais a le numéro 2 dans la colonne Série et les deux fichiers de la série # 2 entassés dans la cellule à côté de lui.

Si je n'utilise pas la classe de données imbriquées je peux tirer les fichiers à l'aide Series.file à la place et les 4 de la liste des fichiers correctement, mais je ne suis pas le numéro de série pour chaque ...

Répondre

1

Avec La structure actuelle du XML, il est plus facile de le représenter avec une grille à deux colonnes - la première colonne étant le numéro de série, et la deuxième colonne étant une autre DataGrid à 2 ou 3 colonnes qui affiche les détails du fichier. Mais si vous ne voulez pas changer la structure, le code suivant est ce dont vous avez besoin. Notez que puisque la propriété dataField n'est pas définie, vous devez spécifier un sortCompareFunction pour trier la grille en fonction du numéro de série. Dans le cas contraire, des exceptions peuvent être générées lors du tri.

<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()[email protected]; 
} 

MISE À JOUR:

<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 
+0

Merci pour la réponse, comment suggérez-vous séparant les grilles de données? Comment la grille de la série sait-elle combien de cellules remplir avec le premier numéro de série? Je ne comprends pas vraiment le code ci-dessus, je sais comment il est censé fonctionner mais je n'arrive pas à le faire fonctionner. J'ai ajouté la fonction en tant que fonction publique dans la balise mx: Script. – medoix

+0

Votre fichier XML n'est pas bien formé. '' est faux, changez-le en '' – Amarghosh

+0

changez dataProvider from 'filesList.series.file' en' filesList.Series.file' (série majuscule) – Amarghosh