`

flex,datagrid 按照列来排序

    博客分类:
  • flex
阅读更多
排序部分
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>  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics