读书人

关于Flex的DataGrid的使用拓展(三)

发布时间: 2012-10-09 10:21:45 作者: rapoo

关于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&&currentsortColumn){                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;                           }        }  

注:这个方法中用到了currentsortColumn,这个是要在headerRelease时需要记住的列。
3)第三种方法和第二种方法不同的地方是在排序的实现上,如以下的代码:
  /**         *  @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();                    }     }}         

读书人网 >flex

热点推荐