关于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();

}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值