flex,datagrid 按照列来排序

排序部分
import mx.controls.DateField;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.AdvancedDataGridEvent;
import mx.events.DataGridEvent;
import mx.utils.ObjectUtil;

/**
* 点击dataGrid列头上的排序按钮
*/
public function dataGridSort(evt:DataGridEvent):void
{
//1 得到要排序的列
var column:DataGridColumn=DataGridColumn(evt.currentTarget.columns[evt.columnIndex]);
//2 得到列名
var columnName:String=column.dataField;
//3 重写此列的排序函数
column.sortCompareFunction=function(obj1:Object, obj2:Object):int
{
return superSort(obj1, obj2, columnName);
};
}

/**
* 点击AdvancedDataGrid列头上的排序按钮
*/
private function advancedDataGridSort(evt:AdvancedDataGridEvent):void
{
var column:AdvancedDataGridColumn=AdvancedDataGridColumn(evt.currentTarget.columns[evt.columnIndex]);
var columnName:String=column.dataField;
column.sortCompareFunction=function(obj1:Object, obj2:Object):int
{
return superSort(obj1, obj2, columnName);
};
}

/**
* 根据不同的数据类型选择不同的排序方式 优先级是数字、日期、字符串
*/
public function superSort(obj1:Object, obj2:Object, columnName:String):int
{
//验证数据类型 Numbe Date String
if (!isNaN(obj1[columnName]))
{
return number_sortCompareFunc(obj1, obj2, columnName);
}
if (strIsDate(obj1[columnName]))
{
var inputFormat:String=getInputFormat(obj1[columnName]);
return date_sortCompareFunc(obj1, obj2, columnName, inputFormat);
}
return string_sortCompareFunc(obj1, obj2, columnName);
}

/**
* 日期的排序
*/
private function date_sortCompareFunc(obj1:Object, obj2:Object, columnName:String, inputFormat:String):int
{
var date1:Date=DateField.stringToDate(obj1[columnName], inputFormat);
var date2:Date=DateField.stringToDate(obj2[columnName], inputFormat);
return ObjectUtil.dateCompare(date1, date2);
}

/**
* 字符串的排序
*/
private function string_sortCompareFunc(obj1:Object, obj2:Object, columnName:String):int
{
// var str1:String=obj1[columnName];
// var str2:String=obj2[columnName];
var str1:String=convertChar(obj1[columnName]);
var str2:String=convertChar(obj2[columnName]);
return ObjectUtil.stringCompare(str1, str2, false);
}

/**
* 数字的排序
*/
private function number_sortCompareFunc(obj1:Object, obj2:Object, columnName:String):int
{
var num1:Number=Number(obj1[columnName]);
var num2:Number=Number(obj2[columnName]);
return ObjectUtil.numericCompare(num1, num2);
}

/**
* 验证一个字符串是否是日期格式
*/
private function strIsDate(str:String):Boolean
{
var inputFormat:String=getInputFormat(str);
//如果找不到日期表示符号则直接返回false
if (inputFormat == null)
{
return false;
}
var date:Date=DateField.stringToDate(str, inputFormat);
//如果是日期date不为null
if (date != null)
{
return true;
}
else
{
return false;
}
}

/**
* 得到日期的格式 判断的顺序为 2012-03-17 2012/03/17 2012.03.17
*/
private function getInputFormat(str:String):String
{
if (str.indexOf("-") != -1)
{
return "YYYY-MM-DD";
}
if (str.indexOf("/") != -1)
{
return "YYYY/MM/DD";
}
if (str.indexOf(".") != -1)
{
return "YYYY.MM.DD";
}
return null;
}

/**
* 判断中文
*/
public function isIn(min:int, max:int, n:int):Boolean
{
return min <= n && max >= n;
}

/**
* 中文排序
*/
public function convertChar(chineseChar:String):String
{
if (chineseChar != null)
{
var bytes:ByteArray=new ByteArray
var str:String;
for (var i:int=0; i < chineseChar.length; i++)
{
bytes.writeMultiByte(chineseChar.charAt(i), "cn-gb");
var n:int=bytes[i] << 8;
n+=bytes[i + 1];

if (isIn(0xB0A1, 0xB0C4, n))
str=str + "a";
if (isIn(0XB0C5, 0XB2C0, n))
str=str + "b";
if (isIn(0xB2C1, 0xB4ED, n))
str=str + "c";
if (isIn(0xB4EE, 0xB6E9, n))
str=str + "d";
if (isIn(0xB6EA, 0xB7A1, n))
str=str + "e";
if (isIn(0xB7A2, 0xB8c0, n))
str=str + "f";
if (isIn(0xB8C1, 0xB9FD, n))
str=str + "g";
if (isIn(0xB9FE, 0xBBF6, n))
str=str + "h";
if (isIn(0xBBF7, 0xBFA5, n))
return "j";
if (isIn(0xBFA6, 0xC0AB, n))
str=str + "k";
if (isIn(0xC0AC, 0xC2E7, n))
str=str + "l";
if (isIn(0xC2E8, 0xC4C2, n))
str=str + "m";
if (isIn(0xC4C3, 0xC5B5, n))
str=str + "n";
if (isIn(0xC5B6, 0xC5BD, n))
str=str + "o";
if (isIn(0xC5BE, 0xC6D9, n))
str=str + "p";
if (isIn(0xC6DA, 0xC8BA, n))
str=str + "q";
if (isIn(0xC8BB, 0xC8F5, n))
str=str + "r";
if (isIn(0xC8F6, 0xCBF0, n))
str=str + "s";
if (isIn(0xCBFA, 0xCDD9, n))
str=str + "t";
if (isIn(0xCDDA, 0xCEF3, n))
str=str + "w";
if (isIn(0xCEF4, 0xD188, n))
str=str + "x";
if (isIn(0xD1B9, 0xD4D0, n))
str=str + "y";
if (isIn(0xD4D1, 0xD7F9, n))
str=str + "z";

}
return str;
}
return null;
}



flex代码部分
<?xml version="1.0" encoding="utf-8"?>   
<!-- http://blog.flexexamples.com/2007/08/23/determining-a-datagridcolumn-objects-current-sort-order/ -->
<mx:Application name="DataGridColumn_sortDescending_test"
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white">
<mx:Script source="SortUtil.as"/>
<mx:Script>
<![CDATA[
import mx.controls.DateField;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
import mx.events.AdvancedDataGridEvent;
import mx.utils.ObjectUtil;
import mx.collections.ArrayCollection;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.DataGridEvent;
[Bindable]
public var ac:ArrayCollection=new ArrayCollection([
{data:"-1112",label:"ad",date:"2009/11/10",china:"啊"},
{data:"112",label:"a",date:"2009/11/11",china:"吧"},
{data:"1",label:"12b",date:"2009/11/01",china:"才"},
{data:"2",label:"Ass",date:"2009/11/20",china:"的"},
{data:"0",label:"ass",date:"2009/11/14",china:"饿"},
{data:"3",label:"csx",date:"2010/11/12",china:"飞"},
{data:"1232",label:"cdf",date:"2009/11/13",china:"个"},
{data:"4",label:"xzm",date:"2001/12/10",china:"好"},
{data:"345",label:"awq",date:"2009/01/10",china:"在"} ,
{data:"345",label:"awq",date:"2009/01/10",china:"a"} ,
{data:"345",label:"awq",date:"2009/01/10",china:"j"}
]);
]]>
</mx:Script>
<mx:DataGrid id="dataGrid"
rowCount="10" dataProvider="{ac}"
headerRelease="dataGridSort(event)" width="600">
<mx:columns>
<mx:DataGridColumn dataField="data" headerText="数字"/>
<mx:DataGridColumn dataField="date" headerText="日期"/>
<mx:DataGridColumn dataField="china" headerText="中文"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值