Multiple list in a combobox
Test.mxml-----------------------
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:components="components.*" creationComplete="application1_creationCompleteHandler(event)" > <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <fx:Script> <![CDATA[ import TO.AlphaComposeValueTO; import TO.ComposeValueTo; import TO.TestTO; import mx.collections.ArrayCollection; import mx.events.FlexEvent; public static const VALUE : String = "value"; public static const DESCRIPTION : String = "description"; public static const LONG_DESCRIPTION : String = "longDescription"; [Bindable] private var columns : Array = [DESCRIPTION,LONG_DESCRIPTION]; [Bindable] public var _dataProvider:ArrayCollection=new ArrayCollection(); [Bindable] public var tableTos : ArrayCollection = new ArrayCollection(); protected function application1_creationCompleteHandler(event:FlexEvent):void { // TODO Auto-generated method stub var avt : AlphaComposeValueTO = null; avt = new AlphaComposeValueTO(); avt.value = 1; avt.description = "ABCD"; avt.longDescription = "Long TEST1"; _dataProvider.addItem(avt); avt = new AlphaComposeValueTO(); avt.value = 2; avt.description = "AB1D"; avt.longDescription = "Long TEST2"; _dataProvider.addItem(avt); avt = new AlphaComposeValueTO(); avt.value = 3; avt.description = "IJKL"; avt.longDescription = "Long TEST3"; _dataProvider.addItem(avt); avt = new AlphaComposeValueTO(); avt.value = 4; avt.description = "MNOP"; avt.longDescription = "Long TEST4"; _dataProvider.addItem(avt); var tto : TestTO = new TestTO(); var type:ComposeValueTo; type.description="fuyun"; type.longDescription="yiqiefuyun"; /* tto.type=type; */ tto.amount=13; /* tto.amount = 100; tto.expirationDate = new Date(); */ tableTos.addItem(tto); } public function fx(item : Object, column:DataGridColumn) : String { if (item != null && _labelField != null && _labelField != "" && dataField != null && dataField != "") { if (item.hasOwnProperty(dataField) && item[dataField] != null) { var _data : Object = item[dataField]; if (_data.hasOwnProperty(_labelField)) { return _data[_labelField]; } } } return return null; } ]]> </fx:Script> <mx:DataGrid x="40" y="40" dataProvider="{tableTos}"> <mx:columns> <mx:DataGridColumn headerText="amount" dataField="amount" labelFunction="fx"> </mx:DataGridColumn> <!--<components:GuiDridColumn headerText="Type" dropdownColumns="{columns}" dataProvider="{_dataProvider}" labelField="description"> </components:GuiDridColumn>--> </mx:columns> </mx:DataGrid> </s:Application>
GuiComboBox.as------------
package components { import mx.controls.ComboBox; import mx.core.ClassFactory; public class GuiComboBox extends ComboBox { public function GuiComboBox() { super(); } private var _dropdownColumns:Array = []; public function get dropdownColumns():Array { return _dropdownColumns; } public function set dropdownColumns(value:Array):void { _dropdownColumns = value; if (this.itemRenderer != null) { return; } var _renderer:ClassFactory; _renderer = new ClassFactory(GuiComboBoxItemRender); _renderer.properties = {"dropdownColumns": _dropdownColumns}; this.itemRenderer = _renderer; } } }
GuiComboBoxItemRender.as..................
package components { import mx.containers.Grid; import mx.containers.GridItem; import mx.containers.GridRow; import mx.controls.Label; public class GuiComboBoxItemRender extends Grid { private var _dropdownColumns:Array = [] private var labels : Array = new Array(); private var gridRow : GridRow = new GridRow(); public function GuiComboBoxItemRender() { super(); this.setStyle("width", "100%"); this.setStyle("height", "100%"); this.setStyle("horizontalGap", "0"); this.setStyle("verticalGap", "0"); this.setStyle("horizontalScrollPolicy", "off"); this.setStyle("verticalScrollPolicy", "off"); this.addElement(gridRow); } public function set dropdownColumns(value:Array):void { _dropdownColumns = value; if (value != null && value.length > 0) { for each(var key : String in value) { var label : Label = new Label(); var item : GridItem = new GridItem(); label.id = key; labels[key] = label; label.width = 100; item.addElement(label); gridRow.addElement(item); } } invalidateProperties(); invalidateDisplayList(); } override protected function commitProperties():void { super.commitProperties(); for each (var key in this._dropdownColumns) { if (this.labels.hasOwnProperty(key)) { (Label(labels[key])).text = (data == null? "" : data[key]); } } } } }
GuiDridColumn.as------------
package components { import mx.controls.dataGridClasses.DataGridColumn; import mx.core.ClassFactory; public class GuiDridColumn extends DataGridColumn { private var _dataProvider:Object; private var _dropdownColumns:Array = []; public function GuiDridColumn(columnName:String=null) { super(columnName); this.labelFunction = defaultDateLabelFunction; var _renderer:ClassFactory; _renderer = new ClassFactory(GuiComboBox); this.itemRenderer = _renderer; } public function defaultDateLabelFunction(item : Object, column:DataGridColumn) : String { if (item != null && _labelField != null && _labelField != "" && dataField != null && dataField != "") { if (item.hasOwnProperty(dataField) && item[dataField] != null) { var _data : Object = item[dataField]; if (_data.hasOwnProperty(_labelField)) { return _data[_labelField]; } } } return null; } private var _labelField : String; public function get labelField():String { return _labelField; } public function set labelField(value:String):void { _labelField = value; } public function get dataProvider():Object { return _dataProvider; }
public function set dataProvider(value:Object):void { _dataProvider = value; }
public function get dropdownColumns():Array { return _dropdownColumns; } public function set dropdownColumns(value:Array):void { this._dropdownColumns = value;
} } }
----
AlphaComposeValueTO
ComposeValueTo
GuiDataGridTO
TestTO