Flex DataGrid mit ComboBox-itemRenderer
Werde ich spare versuchen, herauszufinden, die "richtige" Möglichkeit zum einbetten von einer ComboBox innerhalb einer Flex (3.4) DataGrid. Durch Rechte (z.B. laut dieser Seite http://blog.flexmonkeypatches.com/2008/02/18/simple-datagrid-combobox-as-item-editor-example/) es sollte einfach sein, aber ich kann nicht für das Leben von mir diese Arbeit machen.
Den Unterschied habe ich zum Beispiel weiter oben verlinkt ist, dass mein display mit dem Wert (was der Benutzer sieht) unterscheidet sich von der id-Wert wählen und zu speichern, in meinem Daten-provider.
Also was ich habe ist:
<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>
Wo transactionTypesData
hat die beiden 'Daten' und 'label' Felder (wie pro, was die ComboBox
- warum auf der Erde nicht sowohl ein labelField-und idField ich werde nie wissen).
Sowieso, die über MXML-code nicht funktioniert auf zwei Arten:
- Die combo-box zeigt nicht mit jedem ausgewählten Element.
- Nach dem auswählen eines Elements, die es nicht speichern zurück das ausgewählte Element dem datenspeicher.
So, hat jemand eine ähnliche situation arbeiten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Jeff ' s Antwort ist eine partielle Antwort für den ein Ansatz (siehe http://flex.gunua.com/?p=119 ein vollständiges Beispiel für diese wird verwendet, um gute Wirkung), es ist nicht so allgemein wie ich wollte.
Glücklicherweise fand ich endlich ein paar große Hilfe auf Experten Austauschen (die Antworten von hobbit72) beschreibt, wie eine benutzerdefinierte Komponente erstellen, die in einem raster als ItemRenderer.
Ich habe verlängert, dass der code auch Unterstützung mit Hilfe der combo-box als ItemEditor als gut. Die full-Komponente ist wie folgt:
Verwendung dieser Komponente ist straight forward. Als ItemRenderer:
Verwendung dieser Komponente ist straight forward. Und als ItemEditor:
Beachten Sie, dass, wenn Sie es als eine ItemEditor, eine benutzerdefinierte labelFunction - (sieht, dass sich der Name aus der PersonID in meinem Fall) muss verwendet werden, sonst sehen Sie nur den Schlüssel in der Startaufstellung, wenn das Feld nicht bearbeitet (kein problem, wenn Sie Ihre Schlüssel/Werte sind die gleichen).
Beachten Sie, dass in meinem Fall, ich wollte das item Fokus-out-Ereignis zu propagieren bis zu Ihnen sofortige Rückmeldung an den Benutzer (mein DataGrid hat
itemFocusOut="handleChange()"
), daher derchange
Ereignis erstellen einer ITEM_FOCUS_OUT-Ereignis.Beachten Sie, dass es gibt wahrscheinlich einfachere Möglichkeiten, um eine ComboBox als ItemEditor, wenn Sie nichts dagegen haben die ComboBox wird nur angezeigt, wenn der Benutzer klickt auf die Zelle zu Bearbeiten. Der Ansatz, den ich wollte, war eine Allgemeine Möglichkeit, zu zeigen, ein Kombinationsfeld in einem DataGrid für alle Zeilen, und bearbeitet und mit anständigen event-Propagierung.
Die einfachste Methode zum hinzufügen von itemRenderers zu DataGrids ist, um eine benutzerdefinierte MXML-Komponente. In Ihrem Fall stellen Sie eine Leinwand HBox oder VBox als die benutzerdefinierte Komponente hinzufügen, die combobox als Kind.Setzen Sie die Eigenschaft dataProvider auf das dataGrid selbst, und weisen Sie die itemRenderer auf die Spalte, und dann überschreiben Sie die set-Daten-Funktion der itemRenderer für den Zugriff auf alle Daten aus der angegebenen Daten-provider für diese Instanz, wie unten gesehen:
Diese Methode aufgerufen wird, werden für jede Instanz des itemRenderer
In meinem Fall habe ich eine spark-datagrid-wo eine der Spalten hat eine ItemRenderer-nutzt eine DropDownListBox. Mein problem war, dass, als mein Artikel-Liste ändern, die DropDownLists nicht aktualisiert mit der neuen dataProvider. Um dieses Problem zu lösen, ich musste die dataProvider für die DropDownListBox als Teil der Daten (der ItemRenderer), und dann durch überschreiben der setter die Daten nur ordnen Sie die DropDownlListBox die dataProvider. Wahrscheinlich ein bisschen Aufwand, aber wenn jemand eine bessere Lösung haben, bitte lassen Sie mich wissen: