Flex DataGrid avec ComboBox itemRenderer
Je vais de rechange d'essayer de comprendre la "bonne" façon d'intégrer une zone de liste déroulante à l'intérieur d'un Flex (3.4) DataGrid. Par des Droits (par exemple en vertu de cette page http://blog.flexmonkeypatches.com/2008/02/18/simple-datagrid-combobox-as-item-editor-example/), il devrait être facile, mais je ne peux pas pour la vie de moi de faire ce travail.
La différence, j'ai l'exemple ci-dessus, c'est que mon affichage de la valeur (ce que voit l'utilisateur) est différente de la valeur de l'id, je veux sélectionner et stocker dans mon fournisseur de données.
Donc ce que j'ai est:
<mx:DataGridColumn headerText="Type" width="200" dataField="TransactionTypeID" editorDataField="value" textAlign="center" editable="true" rendererIsEditor="true">
<mx:itemRenderer>
<mx:Component>
<mx:ComboBox dataProvider="{parentDocument.transactionTypesData}"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
Où transactionTypesData
a la fois 'données' et 'label' champs (par ce que le ComboBox
- pourquoi sur la terre, il n'est pas de fournir à la fois un labelField et idField je ne le saurai jamais).
De toute façon, le code MXML ne fonctionne pas de deux façons:
- La liste déroulante ne s'affiche pas avec n'importe quel élément sélectionné.
- Après avoir sélectionné un élément, il ne stocke pas de retour que l'élément sélectionné dans la base de données.
Alors, est-ce quelqu'un a une semblable situation de travail?
OriginalL'auteur Jamie Love | 2009-09-11
Vous devez vous connecter pour publier un commentaire.
Alors que Jeff réponse est une réponse partielle pour une approche de ce type (voir http://flex.gunua.com/?p=119 pour un exemple complet de cet être utilisé à bon escient), il n'est pas aussi général que je voulais.
Heureusement, j'ai enfin trouvé une certaine grande aide sur Des Experts De L'Échange (les réponses par hobbit72) décrit comment créer un composant personnalisé qui travaille dans une grille comme un ItemRenderer.
Je l'ai étendu que le code à également en charge l'utilisation de la zone de liste déroulante comme un ItemEditor. La composante à part entière est comme suit:
L'aide de ce composant est simple. Comme un ItemRenderer:
L'aide de ce composant est simple. Et comme un ItemEditor:
Noter que lorsque vous l'utilisez comme un ItemEditor, une coutume labelFunction (qui recherche le Nom de la PersonID dans mon cas) doit être utilisé, sinon, vous ne voyez que la clé de la grille lorsque le champ n'est pas modifié (pas un problème si vos clés/valeurs sont les mêmes).
Noter que dans mon cas, je voulais que le point focus événement à propager jusqu'à fournir une rétroaction immédiate à l'utilisateur (mon DataGrid a
itemFocusOut="handleChange()"
), d'où lachange
cas de la création d'un ITEM_FOCUS_OUT événement.Remarque qu'il y a probablement des moyens plus simples pour avoir une zone de liste déroulante comme un ItemEditor lorsque vous n'avez pas l'esprit la zone de liste déroulante ne s'affiche que lorsque l'utilisateur clique sur la cellule à modifier. L'approche que je voulais, c'était une façon générique pour afficher une liste déroulante dans une grille de données pour toutes les lignes, et d'être modifiable et décent événement propagation.
Merci pour le code! bien que je ne suis pas sûr de savoir comment il fonctionne 🙂
J'aimerais voir une ÉTINCELLE version de ce.
OriginalL'auteur Jamie Love
La façon la plus simple pour ajouter itemRenderers à Datagrid est de personnaliser un composant MXML. Dans votre cas, faire une toile, HBox, ou VBox que le composant personnalisé et ajouter la zone de liste déroulante comme un enfant.Définir le dataProvider sur la grille de lui-même et d'attribuer le itemRenderer de la colonne, puis remplacer le jeu de données en fonction de la itemRenderer pour accéder à toutes les données du fournisseur de données pour cet exemple comme ci-dessous:
Cette méthode sera appelée pour chaque instance de la itemRenderer
OriginalL'auteur Jeff Pinkston
Dans mon cas, j'ai utilisé une étincelle datagrid où l'une des colonnes a une ItemRenderer qui utilise un DropDownListBox. Mon problème est que lorsque mon élément de la liste de changement, la DropDownLists n'est pas mis à jour avec le nouveau fournisseur. Pour résoudre ce problème, j'ai dû passer le dataProvider pour la DropDownListBox comme une partie des données (de la ItemRenderer), puis en remplaçant le setter de la données à affecter la DropDownlListBox du dataProvider. Probablement un peu de surcharge, mais si quelqu'un a une meilleure solution, s'il vous plaît laissez-moi savoir:
OriginalL'auteur Christo Smal