2010-03-23 6 views
0

Sorte d'un débutant Flex ici donc supportez-moi. J'ai un DataGrid défini comme suit:Les noms des colonnes DataGrid ne semblent pas être liés

<mx:Script> 
... 
private function getColumns(names:ArrayCollection):Array { 
    var ret:Array = new Array(); 
    for each (var name:String in names) { 
     var column:DataGridColumn = new DataGridColumn(name); 
     ret.push(column); 
    } 
    return ret; 
} 
</mx:Script> 
<mx:DataGrid id="grid" width="100%" height="100%" paddingTop="0" 
    columns="{getColumns(_dataSetLoader.columnNames)}" 
    horizontalScrollPolicy="auto" labelFunction="labelFunction" 
    dataProvider="{_dataSetLoader.data}" 
/> 

... où _dataSetLoader est une instance d'un objet qui ressemble à:

[Bindable] 
public class DataSetLoader extends EventDispatcher { 
    ... 
    private var _data:ArrayCollection = new ArrayCollection(); 
    private var _columnNames:ArrayCollection = new ArrayCollection(); 
    ... 
    public function reset():void { 
     _status = NOTLOADED; 
     _data.removeAll(); 
     _columnNames.removeAll(); 
    } 
    ... 

Lorsque la réinitialisation() est appelée sur l'instance dataSetLoader, Le DataGrid vide les données dans les cellules, comme prévu, mais laisse les noms de colonnes, même si reset() appelle _columnNames.removeAll(). La modification de la collection ne devrait-elle pas provoquer une modification du DataGrid?

Répondre

0

Vos données sont correctement liées car vous vous référez directement à la variable en tant que dataProvider. Pour les colonnes, vous faites référence à un appel de fonction.

Pouvez-vous affecter les valeurs de _dataSetLoader.columnNames à une ArrayCollection pouvant être liée à la place? Utilisez ensuite ArrayCollection en tant que colonnes.

+0

Eh bien, les colonnes sont un tableau plutôt qu'une collection Array. Mais en tout cas, j'ai aussi essayé d'ajouter un tableau appelé _columnNamesAsArray à la classe DataSetLoader, en le référençant dans la clause column = et en le vidant dans reset(), mais en obtenant le même résultat. Aussi, ma compréhension est que la liaison de données fonctionne également à travers les appels de fonction, aussi longtemps que l'argument de la fonction est lié? Autrement dit, la modification de _columnNames devrait déclencher un appel à getColumns(). Est-ce que je me trompe? – Jason

0

Eh bien, il existe diverses alternatives ou des solutions de rechange. Cela dépend de quelle est exactement votre exigence.

est inférieur à ce que vous pouvez faire avec votre composant DataGrid

  1. Si vous connaissez déjà le nom de colonne i.e. Dans votre interface utilisateur Interface les noms de colonnes ne changent pas. Vous pourriez vouloir les coder en dur au lieu de les fournir dynamiquement. Si le nom de la colonne change avec la collection de tableaux ou le fournisseur de données, je vous suggère de supprimer la propriété column de votre grille de données et de laisser afficher les noms de colonnes par défaut.

  2. Vous pouvez également ajouter des colonnes lors de l'exécution en fonction des entrées fournies par les listes déroulantes ou les cases à cocher ou d'autres conditions.

Pour plus d'informations, consultez .

+0

Oui, aucune de ces options ne fonctionne pour moi. Le DataGrid est essentiellement la mise en œuvre d'un lecteur CSV. La première ligne du fichier CSV correspond aux noms des colonnes, la deuxième ligne correspond aux types de champs et le reste des lignes sont des données. Ainsi, les noms de colonne changent tout le temps, en fonction du fichier en cours de lecture. C'est pourquoi je voudrais les stocker dans un ArrayCollection et utiliser la liaison de données pour gérer les mises à jour de la vue. – Jason

+0

Si vous ne filtrez aucune colonne, l'option 2 devrait fonctionner. –

Questions connexes