关于Flex的DataGrid的应用拓展(三)
DataGrid自身的排序组件可谓做的非常全面,而且非常好用。用户也可以自己实现排序算法。但有时我们需要实现一些额外的功能,如要实现数据库排序。就是当我点击某一列时,我希望实现数据库根据我的条件排序。实现排序这个功能并不难,只需要实现DataGridEvent.HEADER_RELEASE的Listener即可,但要实现排序箭头的存在可能就需要费一番周折。 这里我提供三种方法 1)复写header 类,把箭头(sortArrow)去掉。同时自己整两个图片放在那里,手工控制一下。这个思路没有实现过,据说可能; 2)复写DataGrid的dataProvider方法。对传入的值进行排序,这样就会出现箭头。如下面的实现步骤:
(1)实现对 dataProvider 的复写
/** * override current dataProvider to call refresh column */ [Inspectable(category="Data", defaultValue="undefined")] override public function set dataProvider(value:Object):void { super.dataProvider=value; checkorderArrow(); } (2)实现上面调用的方法: /** * order current column,purpose to show Arrow, * note: not used function */ public function checkorderArrow():void{ if(dataProvider&¤tsortColumn){ var coll:ArrayCollection=dataProvider as ArrayCollection; coll.sort = new Sort(); var field:SortField=new SortField(currentsortColumn.dataField, true, currentsortColumn.sortDescending); if(currentsortColumn.isNumberic){ field.compareFunction=sortFunction; } coll.sort.fields = [field]; coll.refresh(); mx_internal::sortDirection=currentsortColumn.sortDescending; } }
/** * @private * sort current column ,its code is from datagrid */ private function sortByColumn():void { if(!currentsortColumn){ return; } var c:SessionDataGridColumn = currentsortColumn; var desc:Boolean = c.sortDescending; // do the sort if we're allowed to if (c.sortable) { var s:Sort = collection.sort; var f:SortField; if (s) { s.compareFunction = null; // analyze the current sort to see what we've been given var sf:Array = s.fields; if (sf) { for (var i:int = 0; i < sf.length; i++) { if (sf[i].name == c.dataField) { // we're part of the current sort f = sf[i] // flip the logic so desc is new desired order desc = !f.descending; break; } } } } else s = new Sort; if (!f) f = new SortField(c.dataField); c.sortDescending = desc; var dir:String = (desc) ? "DESC" : "ASC"; sortDirection = dir; // set the grid's sortIndex lastSortIndex = sortIndex; sortIndex = point[1]; // if you have a labelFunction you must supply a sortCompareFunction f.name = c.dataField; if (c.sortCompareFunction != null) { f.compareFunction = c.sortCompareFunction; } else { f.compareFunction = null; } f.descending = desc; s.fields = [f]; } collection.sort = s; collection.refresh(); }
package { import mx.collections.ArrayCollection; import mx.collections.Sort; import mx.collections.SortField; import mx.controls.DataGrid; import mx.controls.dataGridClasses.DataGridColumn; import mx.core.mx_internal; import mx.events.DataGridEvent; import mx.utils.ObjectUtil; /** * added a cutomer datagrid for database sorting */ public class SortDatabaseDatagrid extends DataGrid { use namespace mx_internal; public function SortDatabaseDatagrid() { super(); this.addEventListener(DataGridEvent.HEADER_RELEASE,function(evt:DataGridEvent):void{ evt.currentTarget.currentsortColumn=DataGridColumn(evt.currentTarget.columns[evt.columnIndex]); point[0]=evt.rowIndex; point[1]=evt.columnIndex; }); } private var point:Array=[]; //remember current clicking column private var _currentsortColumn:SessionDataGridColumn; public function get currentsortColumn():SessionDataGridColumn { return _currentsortColumn; } public function set currentsortColumn(value:SessionDataGridColumn):void { _currentsortColumn = value; } /** * order current column,purpose to show Arrow, * note: not used function */ public function checkorderArrow():void{ if(dataProvider&¤tsortColumn){ var coll:ArrayCollection=dataProvider as ArrayCollection; coll.sort = new Sort(); var field:SortField=new SortField(currentsortColumn.dataField, true, currentsortColumn.sortDescending); if(currentsortColumn.isNumberic){ field.compareFunction=sortFunction; } coll.sort.fields = [field]; coll.refresh(); mx_internal::sortDirection=currentsortColumn.sortDescending; } } /** * @private * sort current column ,its code is from datagrid */ private function sortByColumn():void { if(!currentsortColumn){ return; } var c:SessionDataGridColumn = currentsortColumn; var desc:Boolean = c.sortDescending; // do the sort if we're allowed to if (c.sortable) { var s:Sort = collection.sort; var f:SortField; if (s) { s.compareFunction = null; // analyze the current sort to see what we've been given var sf:Array = s.fields; if (sf) { for (var i:int = 0; i < sf.length; i++) { if (sf[i].name == c.dataField) { // we're part of the current sort f = sf[i] // flip the logic so desc is new desired order desc = !f.descending; break; } } } } else s = new Sort; if (!f) f = new SortField(c.dataField); c.sortDescending = desc; var dir:String = (desc) ? "DESC" : "ASC"; sortDirection = dir; // set the grid's sortIndex lastSortIndex = sortIndex; sortIndex = point[1]; // if you have a labelFunction you must supply a sortCompareFunction f.name = c.dataField; if (c.sortCompareFunction != null) { f.compareFunction = c.sortCompareFunction; } else { f.compareFunction = null; } f.descending = desc; s.fields = [f]; } collection.sort = s; collection.refresh(); } }}