Flex控件--AdvancedDataGrid实现列头过滤功能(顺便写了Button列
源于自己正在做的一个项目,Flex,自己写的代码。因为接触Flex没多久,见笑了。。。。。 ? 先上效果图: ? 扩展了一点点东西,例如排序,鼠标移过去会变成黑色,移走会变成灰色,升降序也有箭头表示,红色字体是过滤字体。。。。 ? 使用方法挺简单的,直接用标签就可以了,也添加tooltip的功能。。 使用例子: <fx:Script> <![CDATA[ import MyAdvancedDataGrid.ADGCheckBoxColumn; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.managers.PopUpManager; [Bindable] public var dataArray:ArrayCollection = new ArrayCollection; [Bindable] public var dataArr:ArrayCollection = new ArrayCollection; private function Init():void{ dataArray.addItem({isSelected:false,name:'Christina Coenraets',phone:'555-219-2270',email:'ccoenraets@fictitious.com',text:"1a",textid:1}); dataArray.addItem({isSelected:false,name:'Joanne Wall',phone:'555-219-2012',email:'jwall@fictitious.com',text:"2b",textid:2}); dataArray.addItem({isSelected:true,name:'Maurice Smith',email:'maurice@fictitious.com',name:'Mary Jones',phone:'555-219-2000',email:'mjones@fictitious.com',text:"3c",textid:3}); dataArray.addItem({isSelected:false,name:'God Win',phone:'555-219-2005',email:'godwin@fictitious.com',textid:1}); //mydg.dataProvider = dataArray; dataArr.addItem({text:"1a",textid:1}); dataArr.addItem({text:"2b",textid:2}); dataArr.addItem({text:"3c",textid:3}); dataArr.addItem({text:"4d",textid:4}); dataArr.addItem({text:"5e",textid:5}); dataArr.addItem({text:"6f",textid:6}); } ]]> </fx:Script> <framework:FrameGrid id="mydg" x="0" y="36" width="488" height="289" dataProvider="{dataArray}" draggableColumns="false"> <framework:groupedColumns> <!--<mx:AdvancedDataGridColumn dataField="isSelected"/>--> <mx:AdvancedDataGridColumn dataField="isSelected" headerText="aaa"/> <framework:ADGCheckBoxColumn toolTip="checkBox" enabled="false" dataField="isSelected" headerText="abx"/> <framework:ADGCheckBoxColumn toolTip="复选框" headerText="aab"/> <mx:AdvancedDataGridColumnGroup headerText="asdf"> <framework:ADGDefaultColumn editable="true" dataField="name" /> <framework:ADGDefaultColumn dataField="phone" /> <framework:ADGDefaultColumn dataField="email" /> <framework:ADGTextBoxColumn dataField="phone" editable="true" /> </mx:AdvancedDataGridColumnGroup> <framework:ADGComboBoxColumn toolTip="下拉框" itemList="{dataArr}" labelField="text" valueField="textid" dataField="text"/> <framework:ADGButtonColumn toolTip="按钮啊" buttonLabel="aa" textAlign="center" headerText="buttonColumn"/> </framework:groupedColumns> </framework:FrameGrid>
FrameGrid.as是我继承AdvanceDataGrid写的一个dg控件,主要还是用来定位回去,,就是我开头说的偷懒=。= FrameGrid.as: package cn.net.fjh.framework { import flash.events.Event; import flash.events.FocusEvent; import flash.events.TextEvent; import mx.controls.AdvancedDataGrid; import mx.events.AdvancedDataGridEvent; import mx.events.DataGridEvent; import mx.events.FlexEvent; import mx.utils.ObjectUtil; import mx.collections.ArrayCollection; import flash.display.Sprite; public class FrameGrid extends AdvancedDataGrid { public function FrameGrid() { super(); this.draggableColumns = false; this.addEventListener(FlexEvent.UPDATE_COMPLETE,locationOld); } private function locationOld(e:Event):void{ var arr:Array = this.headerInfos as Array; focusFilterTextInput(arr); } private function focusFilterTextInput(arr:Array):void{ for ( var i : int = 0; i < arr.length; i ++ ) { if(arr[i].children != null){ focusFilterTextInput(arr[i].children as Array); } else{ var obj:Object = ObjectUtil.getClassInfo(arr[i].headerItem); var ClassName:String = obj.name as String; if(ClassName.length > 1){ if(ClassName.toString().search("ADGHeaderRenderer") > -1){ //arr[i].headerItem var ADGHR:ADGHeaderRenderer = arr[i].headerItem as ADGHeaderRenderer; if(ADGHR.filterFlag){ ADGHR.headerTextInput.setFocus(); var textLength:int = ADGHR.headerTextInput.text.length; ADGHR.headerTextInput.setSelection(textLength,textLength); ADGHR.filterFlag = false; } } } } } } } }
ADGHeaderRenderer.as: package cn.net.fjh.framework { import flash.events.Event; import flash.events.MouseEvent; import mx.collections.ArrayCollection; import mx.collections.Sort; import mx.collections.SortField; import mx.controls.AdvancedDataGrid; import mx.controls.Button; import mx.controls.Label; import mx.controls.TextInput; import mx.controls.listClasses.AdvancedListBaseContentHolder; import mx.controls.listClasses.IListItemRenderer; import mx.core.UIComponent; import mx.events.CollectionEvent; import mx.events.FlexEvent; public class ADGHeaderRenderer extends UIComponent implements IListItemRenderer { private var _data:Object; private var headerLabel:Label = new Label(); private var _columnName:String; private var _filterFlag:Boolean = false; private var headerSortButton:Label = new Label(); private var up:String = "↑";//在这里修改升降序图标(其实就是字符,,) private var down:String = "↓"; public var headerTextInput:TextInput = new TextInput(); public function ADGHeaderRenderer() { super(); this.height = 40; this.addEventListener(MouseEvent.MOUSE_OVER,mouSEOverChangeOn); this.addEventListener(MouseEvent.MOUSE_OUT,mouSEOverChangeOff); } private function mouSEOverChangeOn(e:Event):void{ headerSortButton.setStyle("color",0x000000); } private function mouSEOverChangeOff(e:Event):void{ headerSortButton.setStyle("color",0xCCCCCC); } [Bindable("dataChange")] public function get data():Object{ return this._data; } public function set data(value:Object):void{ this._data = value; invalidateProperties(); dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); } public function get columnName():String{ return this._columnName; } public function set columnName(value:String):void{ this._columnName = value; } public function get filterFlag():Boolean{ return this._filterFlag; } public function set filterFlag(value:Boolean):void{ this._filterFlag = value; } override protected function createChildren() : void { super.createChildren(); headerLabel.setStyle("color",0x000000); headerLabel.useHandCursor=true; headerLabel.buttonMode=true; headerLabel.mouseChildren=false; headerLabel.addEventListener(MouseEvent.CLICK,sortButtonClick); addChild(headerLabel); headerTextInput.setStyle("color",0xFF0000); headerTextInput.setStyle("contentBackgroundColor",0xFFFFFF); headerTextInput.id = columnName+"TextInput"; headerTextInput.addEventListener(Event.CHANGE,columnFilter); addChild(headerTextInput); //headerSortButt //headerSortButton.i headerSortButton.text = up; headerSortButton.setStyle("color",0xCCCCCC); headerSortButton.useHandCursor=true; headerSortButton.buttonMode=true; headerSortButton.mouseChildren=false; headerSortButton.addEventListener(MouseEvent.CLICK,sortButtonClick); addChild(headerSortButton); } private function sortButtonClick(e:Event):void{ var dg:FrameGrid = FrameGrid(this.owner);//获取DataGrid对象 var arr:ArrayCollection = dg.dataProvider as ArrayCollection; arr.sort = new Sort(); if(headerSortButton.text == down) { arr.sort.fields = [ new SortField(columnName,true,false) ]; headerSortButton.text = up; } else { arr.sort.fields = [ new SortField(columnName,true) ]; headerSortButton.text = down; } arr.refresh(); } private function columnFilter(e:Event):void{ this.filterFlag = true; var dg:FrameGrid = FrameGrid(this.owner);//获取DataGrid对象 var arr:ArrayCollection = dg.dataProvider as ArrayCollection; //arr.addEventListener(CollectionEvent.COLLECTION_CHANGE,dgChange); arr.filterFunction = columnfilter; arr.refresh(); } private function columnfilter(item:Object):Boolean{ if(headerTextInput.text == "") return true; else { var str:String = item[columnName].toString(); if(str.toLowerCase().search(headerTextInput.text.toLowerCase()) >= 0) return true; else return false; } } override protected function commitProperties():void { super.commitProperties(); if(data.headerText == "") { headerLabel.text = data.dataField; this.toolTip = data.dataField; headerSortButton.toolTip = data.dataField; headerTextInput.toolTip = data.dataField; headerLabel.toolTip = data.dataField; } else { headerLabel.text = data.headerText; this.toolTip = data.headerText; headerSortButton.toolTip = data.headerText; headerTextInput.toolTip = data.headerText; headerLabel.toolTip = data.headerText; } } override protected function updateDisplayList(unscaledWidth:Number,unscaledHeight:Number ) : void { super.updateDisplayList(unscaledWidth,unscaledHeight); var labelPointX:int = (unscaledWidth-headerLabel.textWidth)/2-headerSortButton.width; headerLabel.move(labelPointX>0?labelPointX:0,(unscaledHeight-headerTextInput.height-headerLabel.height)/2); headerLabel.setActualSize(unscaledWidth,20); var buttonPointX:int = unscaledWidth-headerSortButton.textWidth-5; headerSortButton.move(buttonPointX>0?buttonPointX:0,0); headerSortButton.setActualSize(13,unscaledHeight-20); headerTextInput.move(0,unscaledHeight-headerTextInput.height); headerTextInput.setActualSize(unscaledWidth,20); } } }
代码上传了,,,,使用方法就参考下使用例子吧~ 下载:AdvancedDataGrid源代码(修正版)(上次的有点遗漏导致checkBox选择获取不了数据,已修正,2013-12-13) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |