`
yunzhongxia
  • 浏览: 648475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flex DataGrid和AdvancedDataGrid 数字 日期的排序

阅读更多
<?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="org/util/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"},
			{data:"112",label:"a",date:"2009/11/11"},
			{data:"1",label:"12b",date:"2009/11/01"},
			{data:"2",label:"Ass",date:"2009/11/20"},
			{data:"0",label:"ass",date:"2009/11/14"},
			{data:"3",label:"csx",date:"2010/11/12"},
			{data:"1232",label:"cdf",date:"2009/11/13"},
			{data:"4",label:"xzm",date:"2001/12/10"},
			{data:"345",label:"awq",date:"2009/01/10"}
			]);
          
            
        ]]>
    </mx:Script>
    <mx:DataGrid id="dataGrid"
            rowCount="10" dataProvider="{ac}"
            headerRelease="dataGridSort(event)" width="600">
        <mx:columns>
            <mx:DataGridColumn  dataField="label" headerText="字符串" />
            <mx:DataGridColumn  dataField="data"  headerText="数字"/>
            <mx:DataGridColumn  dataField="date"  headerText="日期"/>
        </mx:columns>
    </mx:DataGrid>
	<mx:AdvancedDataGrid  dataProvider="{ac}" headerRelease="advancedDataGridSort(event)" width="600" rowCount="10">
		<mx:columns>
			<mx:AdvancedDataGridColumn dataField="label"  headerText="字符串" />
			<mx:AdvancedDataGridColumn dataField="data" headerText="数字" />
			<mx:AdvancedDataGridColumn dataField="date" headerText="日期" />
		</mx:columns>
	</mx:AdvancedDataGrid>
</mx:Application>

 flex默认的排序只支持string和numer两种排序,从数据库中读出数据到flex前段,很多时候本来是Number类型转化为了Strng类型(java中的Bigdecimal ,因为As3中没有这么大的数据类型),因此排序就乱了。自己动手写了个方法在点击列头上的排序按钮的时候重置此列的排序函数。另外本方法还支持日期格式,当期是有局限的。

 用法:在需要排序的表格上加上headerRelease事件。

// ActionScript file 韩敬诺 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];
	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;
	}
}
/**
 * 得到日期的格式  判断的顺序为 2009-11-12 2009/11/12 2009.11.12
 */
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;
}

 

 思路: 在做汽车的项目时,就想解决这个问题,但是一直没想到好的方法。flex是基于事件的组件开发,真是flex的真谛。排序函数很容易写,如何把要排序的列传过来是个问题,flex在干一件事情之前会触发一个事件,headerRelease是关键。

 

 

   另外,也可以用DatagridColumn的sortCompareFunction进行自定义排序,

mySortCompareFunction(obj1:Object, obj2:Object):int 

  很多时候,我们需要判断根据obj中的那个属性进行排序比较,而不是对每个表格列进行排序。

  一个比较巧妙的方法是可以利用Function。

  

/**
			 * Numerically sorts a column in the DataGrid.
			 *
			 * @param	fieldName	The string name for the dataField in the column that you want to sort.
			 */
			private function numericSortByField(fieldName:String):Function
			{
				return function(obj1:Object, obj2:Object):int
				{
					var value1:Number = (obj1[fieldName] == '' || obj1[fieldName] == null) ? null : new Number(obj1[fieldName]);
					var value2:Number = (obj2[fieldName] == '' || obj2[fieldName] == null) ? null : new Number(obj2[fieldName]);
					return ObjectUtil.numericCompare(value1, value2);
				}
			}

 

   使用很简单,如果列的数据类型是数字,可以指定列的sortCompareFunction

 

					if(dataType=="NUMBER"){
						//如果是数字则需要按照数字进行排序
						dataGridColumn.sortCompareFunction=numericSortByField(dataField);
					}

 

 

 

 

 

 

 

 

分享到:
评论
4 楼 250124797 2011-10-26  
谢谢,正要可以参考
3 楼 lifengshurui 2011-08-05  
谢谢分享啊,学习一下!
2 楼 荒村听雨31 2011-07-08  
1 楼 bruce.peng 2009-11-23  
今天正好要这个,拿来用了。谢谢 

相关推荐

    flex-datagrid-advancedDataGrid-demo

    6. 排序和过滤:如何实现列的排序功能,以及如何添加过滤条件来筛选显示的数据。 7. 拖放功能:如果示例包含此功能,将介绍如何启用和自定义拖放操作,以便用户能重新排列或移动数据。 8. 响应式设计:可能还会...

    开源DataGrid和AdvancedDataGrid复制到Excel工具类

    标题中的“开源DataGrid和AdvancedDataGrid复制到Excel工具类”指的是一个专门设计用于将数据从Flex中的DataGrid和AdvancedDataGrid组件导出到Microsoft Excel的开源工具。这个工具类提高了用户在处理大量数据时的...

    DataGrid和AdvancedDataGrid CheckBox全选功能1.1

    在本文中,我们将深入探讨如何在Flex中实现DataGrid和AdvancedDataGrid组件的CheckBox全选功能。这个功能在数据展示和交互式操作中非常常见,它允许用户通过一个主CheckBox来选择或取消选择所有行数据。 首先,我们...

    flex DataGrid 表头分组

    当我们处理的数据需要进行分类或者分组时,Flex DataGrid 提供了表头分组的功能,这使得数据的展示更加有条理和易于理解。本文将详细探讨Flex DataGrid的表头分组特性及其实现方式。 首先,表头分组允许我们将数据...

    DataGrid和AdvancedDataGrid CheckBox全选功能

    在本文中,我们将深入探讨两种在Flex或Adobe AIR应用程序中常用的组件——`DataGrid`和`AdvancedDataGrid`,特别是关于它们的CheckBox全选功能。`DataGrid`和`AdvancedDataGrid`是Flex中用于展示数据集合的强大工具...

    Flex Datagrid checkbox实现

    Flex Datagrid提供了许多高级特性,如排序、过滤、分页等,可以通过自定义列样式、数据提供程序和事件处理来实现。此外,还可以通过使用ItemEditor实现单元格编辑,或者通过使用AdvancedDataGrid组件来处理更复杂的...

    Flex应用AdvancedDataGrid表头皮肤

    它提供了比基本DataGrid更丰富的功能,如多级表头、排序、分组、过滤和自定义渲染等。本文将深入探讨Flex应用中的AdvancedDataGrid表头皮肤设计与实现。 AdvancedDataGrid的表头皮肤是用户界面的重要组成部分,它...

    Flex技术中AdvancedDataGrid使用方法

    与`DataGrid`组件类似,`AdvancedDataGrid`也支持用户在数据加载完毕后对数据进行排序,不同的是它不仅支持单列排序还支持多列排序。 **实现步骤:** 1. **启用多列排序功能:** 使用`AdvancedDataGrid`时,用户...

    Flex中DataGrid和其它控件使用

    总结来说,Flex中的DataGrid和AdvancedDataGrid是强大且灵活的数据展示工具,它们可以与其他多种控件协同工作,满足各种复杂的数据展示和交互需求。理解和掌握这些知识点,将有助于构建高效、用户友好的Flex应用程序...

    Flex dataGrid 自定义显示列

    Flex DataGrid提供了内置的排序功能,通过设置`sortable`属性和监听`sort`事件来实现。过滤功能通常需要编写自定义代码来实现,而分组则可以通过`grouping`属性和`AdvancedDataGrid`的`groupingEnabled`属性来开启。...

    flex datagrid 改变

    通过阅读和理解这个文件,我们可以学习到如何在实际项目中应用和改变Flex DataGrid。 总之,Flex DataGrid的自定义是一个广泛的领域,涵盖了从基本的样式调整到复杂的业务逻辑实现。通过学习和实践,开发者可以创建...

    flex 使用AdvancedDataGrid组件的课件管理系统

    AdvancedDataGrid相比于普通的DataGrid,提供了更多的功能和自定义选项,如: 1. 多级分组:可以对数据进行多级分类和分组,使数据结构更加清晰。 2. 复杂排序:支持对列进行多种排序方式,包括升序、降序以及多个...

    AdvancedDataGrid综合应用

    在Flex开发中,AdvancedDataGrid是一个强大的组件,它扩展了基本的DataGrid,提供了更复杂的数据展示和交互功能。这个主题涵盖了如何在Flex项目中有效地利用AdvancedDataGrid来实现数据的高级显示和操作。 1. **...

    flex中dataGrid全选和全不选功能

    在Flex框架中,DataGrid是用于展示数据列表的常用组件之一。它提供了丰富的特性来处理数据,包括排序、过滤和...通过以上步骤,我们可以在Flex的DataGrid中成功实现全选和全不选功能,提升数据操作的效率和便利性。

    Flex DataGrid checkBox

    `flex_AdvancedDataGrid实现checkBox全选功能`可能涉及到更复杂的用例,如分组、排序和过滤。在AdvancedDataGrid中,我们可能需要处理更多与数据提供者结构相关的细节,以确保全选/全不选逻辑的正确性。 7. **性能...

    FLEX AdvancedDataGrid 复选框

    总之,“FLEX AdvancedDataGrid 复选框”涉及了Flex组件定制、数据绑定、事件处理、状态管理等多个方面,是提高用户交互性和功能性的关键技术。通过理解并应用这些知识,开发者可以构建出更加强大且易用的数据展示...

    Flex 全选效果 批量删除

    在Flex编程中,AdvancedDataGrid和DataGrid是两种常用的组件,用于展示数据并提供交互功能。本示例项目“Flex全选效果批量删除”聚焦于如何实现这些组件的一个实用功能,即用户可以通过全选复选框来一次性选择多个...

    Flex 3 Cookbook(英文版)

    DataGrid和AdvancedDataGrid是Flex中用于展示表格数据的组件。书中阐述了如何利用这两个组件,包括排序、过滤和编辑数据的功能,提高数据展示的灵活性。 #### Renderers 渲染器用于自定义列表或网格中的项外观。书...

    AdvancedDataGrid 动态添加节点 控制树

    在Flex开发中,AdvancedDataGrid是一个强大的组件,用于展示大量数据并进行复杂的数据操作,如分组、排序和过滤。这个组件特别适用于构建数据密集型的用户界面,尤其是在需要显示层次结构数据时。本篇文章将深入探讨...

Global site tag (gtag.js) - Google Analytics