AdvancedDataGrid自定义排序问题

TECHBAGA007 2010-03-23 07:14:50
之前在DataGrid写了一个排序方法,public function sortList(colName:String,sortType:String):void{
var sortField:SortField;
this.colName = colName;
if(sortType=="desc"){
sortField = new SortField(colName);
sortField.descending = true;
}
if(sortType=="asc"){
sortField = new SortField(colName);
sortField.descending = false;
}
var sort:Sort = new Sort();
sort.fields = [sortField];

dpFlat.sort = sort;
dpFlat.refresh();
}
很好用,但是在AdvancedDataGrid中,这个方法就不好使了。
我的想法是,在AdvancedDataGrid中,不打乱分组,然后对某一列进行排序,应该如何实现?请赐教
...全文
509 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangxin5257 2010-03-24
  • 打赏
  • 举报
回复
你把你代码贴出来,你感觉什么地方不对,我帮你改下吧。
TECHBAGA007 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangxin5257 的回复:]
引用 3 楼 xiaofox008 的回复:
不打乱分组,然后对某一列进行排序,应该如何实现?

AdvancedDataGrid本身支持多列排序,优先第一列,再排序第二列..第三列,但需要操作的人按顺序

你的是不是在初始化的时候先排序? 如果你还想自定义排序的话,把你的代码贴出来吧. 我帮你看看
[/Quote]
我就是想自定义排序,应该如何实现?
TECHBAGA007 2010-03-24
  • 打赏
  • 举报
回复
AdvancedDataGrid本身是支持排序,但我不想单击表头排序,我想自定义排序的触发事件,比如当我点击一个自定义按钮时,对AdvancedDataGrid的某一列进行排序。
huangxin5257 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaofox008 的回复:]
不打乱分组,然后对某一列进行排序,应该如何实现?
[/Quote]
AdvancedDataGrid本身支持多列排序,优先第一列,再排序第二列..第三列,但需要操作的人按顺序

你的是不是在初始化的时候先排序? 如果你还想自定义排序的话,把你的代码贴出来吧. 我帮你看看
TECHBAGA007 2010-03-24
  • 打赏
  • 举报
回复
问题解决了,在分组初始化数据的时候 按照Estimate排序,然后就可以了,谢谢啦
huangxin5257 2010-03-24
  • 打赏
  • 举报
回复
不打乱Estimate原来的排列顺序,那就选择同样的排序算法
默认是按照字符串排序,所以想让Estimate列不动,就用同样的排序算法(字符串排序)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.DateField;
import mx.events.AdvancedDataGridEvent;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.utils.ObjectUtil;
import mx.collections.ArrayCollection;
import mx.collections.Grouping;
import mx.collections.GroupingCollection;
import mx.collections.GroupingField;
import mx.controls.Alert;
//include "SimpleFlatData.as"
[Bindable]
public var dpFlat:ArrayCollection = new ArrayCollection([
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"T.R. Smith", Actual:55498, Estimate:50000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Alice Treu", Actual:44985, Estimate:8000},
{Name:"name", Region:"Southwest", Territory:"Arizona", Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Abc", Territory_Rep:"Dana Binn", Actual:29885, Estimate:20000},
{Name:"name", Region:"Southwest", Territory:"Central California", Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},
{Name:"name", Region:"Southwest", Territory:"evada", Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Srthern California", Territory_Rep:"Bauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Vrthern California", Territory_Rep:"Fauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Jane Grove", Actual:44913, Estimate:9000}]);

public function numericCompareFunc(itemA:int, itemB:int):int
{
return ObjectUtil.numericCompare(itemA, itemB);
}
public function stringCompareFunc(itemA:String, itemB:String):int
{
return ObjectUtil.stringCompare(itemA, itemB);
}
public function myCompare(a:Object, b:Object, fields:Array=null):int
{
var result:int = 0;
var i:int = 0;
var propList:Array = ["Estimate","Territory"];
var len:int = propList.length;
var propName:String;
while (result == 0 && (i < len))
{
propName = propList[i];
if (propName == "Estimate") {
// 下面是修改的内容:
// 把数值排序换成字符串排序
// result = numericCompareFunc(a[propName], b[propName]);
// 默认是按照字符串排序,所以想让Estimate列不动,就用同样的排序算法(字符串排序)
result = stringCompareFunc(a[propName], b[propName]);
} else {
result = stringCompareFunc(a[propName], b[propName]);
}
i++;
}
return result;
}
public function sortTerritory():void
{
gc.grouping.compareFunction = myCompare;
gc.refresh();
}
]]>
</mx:Script>
<mx:GroupingCollection id="gc" source="{dpFlat}" >
<mx:Grouping >
<mx:GroupingField id="gf" name="Estimate" caseInsensitive="true" />
</mx:Grouping>
</mx:GroupingCollection>
<mx:AdvancedDataGrid id="myADG" width="100%" height="100%"
dataProvider="{gc}"
initialize="{gc.refresh()}"
displayItemsExpanded="true"
creationComplete="{myADG.expandAll()}"
defaultLeafIcon="{null}"
folderOpenIcon="{null}"
folderClosedIcon="{null}">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory" />
<mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep" sortable="false"/>
<mx:AdvancedDataGridColumn dataField="Actual" visible="false" />
<mx:AdvancedDataGridColumn dataField="Estimate" sortable="false"/>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
<mx:Button label="按Territory排序" click="sortTerritory()"/>
</mx:Application>

TECHBAGA007 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huangxin5257 的回复:]
代码给你

XML code

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.DateField;……
[/Quote]
我明白你的思路,这样排序,需要先对分组字段进行排序,然后再对需要排序的字段进行二次排序,
但是我不想对分组字段排序,我只想对Territory字段排序,不打乱Estimate原来的排列顺序。
这个问题要是能帮我解决,我可以另开帖给分。
huangxin5257 2010-03-24
  • 打赏
  • 举报
回复
代码给你

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.DateField;
import mx.events.AdvancedDataGridEvent;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.utils.ObjectUtil;
import mx.collections.ArrayCollection;
import mx.collections.Grouping;
import mx.collections.GroupingCollection;
import mx.collections.GroupingField;
import mx.controls.Alert;
//include "SimpleFlatData.as"
[Bindable]
public var dpFlat:ArrayCollection = new ArrayCollection([
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"T.R. Smith", Actual:55498, Estimate:50000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Alice Treu", Actual:44985, Estimate:8000},
{Name:"name", Region:"Southwest", Territory:"Arizona", Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Abc", Territory_Rep:"Dana Binn", Actual:29885, Estimate:20000},
{Name:"name", Region:"Southwest", Territory:"Central California", Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},
{Name:"name", Region:"Southwest", Territory:"evada", Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Srthern California", Territory_Rep:"Bauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Vrthern California", Territory_Rep:"Fauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Jane Grove", Actual:44913, Estimate:9000}]);

public function numericCompareFunc(itemA:int, itemB:int):int
{
return ObjectUtil.numericCompare(itemA, itemB);
}
public function stringCompareFunc(itemA:String, itemB:String):int
{
return ObjectUtil.stringCompare(itemA, itemB);
}
public function myCompare(a:Object, b:Object, fields:Array=null):int
{
var result:int = 0;
var i:int = 0;
var propList:Array = ["Estimate","Territory"];
var len:int = propList.length;
var propName:String;
while (result == 0 && (i < len))
{
propName = propList[i];
if (propName == "Estimate") {
result = numericCompareFunc(a[propName], b[propName]);
} else {
result = stringCompareFunc(a[propName], b[propName]);
}
i++;
}
return result;
}
public function sortTerritory():void
{
gc.grouping.compareFunction = myCompare;
gc.refresh();
}
]]>
</mx:Script>
<mx:GroupingCollection id="gc" source="{dpFlat}" >
<mx:Grouping >
<mx:GroupingField id="gf" name="Estimate" caseInsensitive="true" />
</mx:Grouping>
</mx:GroupingCollection>
<mx:AdvancedDataGrid id="myADG" width="100%" height="100%"
dataProvider="{gc}"
initialize="{gc.refresh()}"
displayItemsExpanded="true"
creationComplete="{myADG.expandAll()}"
defaultLeafIcon="{null}"
folderOpenIcon="{null}"
folderClosedIcon="{null}">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory" />
<mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep" sortable="false"/>
<mx:AdvancedDataGridColumn dataField="Actual" visible="false" />
<mx:AdvancedDataGridColumn dataField="Estimate" sortable="false"/>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
<mx:Button label="按Territory排序" click="sortTerritory()"/>
</mx:Application>


TECHBAGA007 2010-03-24
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.DateField;
import mx.events.AdvancedDataGridEvent;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.utils.ObjectUtil;
import mx.collections.ArrayCollection;
import mx.collections.Grouping;
import mx.collections.GroupingCollection;
import mx.collections.GroupingField;
import mx.controls.Alert;
//include "SimpleFlatData.as"
[Bindable]
public var dpFlat:ArrayCollection = new ArrayCollection([
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"T.R. Smith", Actual:55498, Estimate:50000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Alice Treu", Actual:44985, Estimate:8000},
{Name:"name", Region:"Southwest", Territory:"Arizona", Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Abc", Territory_Rep:"Dana Binn", Actual:29885, Estimate:20000},
{Name:"name", Region:"Southwest", Territory:"Central California", Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},
{Name:"name", Region:"Southwest", Territory:"evada", Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},
{Name:"name", Region:"Southwest", Territory:"Northern California", Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Srthern California", Territory_Rep:"Bauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Vrthern California", Territory_Rep:"Fauren Ipsum", Actual:38805, Estimate:40000},
{Name:"name", Region:"Southwest", Territory:"Southern California", Territory_Rep:"Jane Grove", Actual:44913, Estimate:9000}]);

public function changeGroup(str:String):void{
gf.name = str;
gc.refresh();
}
public function mySortCompareFunc(itemA:Object,itemB:Object):int{
var dataA:int = int(itemA.Territory);
var dataB:int = int(itemB.Territory);
return ObjectUtil.compare(dataA, dataB);
}

public function groupCompareFunc(a:Object, b:Object, fields:Array=null):int{
if(a[gf.name] != b[gf.name]){
return 0;
}else{
if (a["Territory"]==null && b["Territory"]==null)
return 0;
if (a["Territory"] == null)
return 1;
if (b["Territory"] == null)
return -1;
if(a["Territory"] == b["Territory"])
return 0;
return ObjectUtil.stringCompare(a["Territory"], b["Territory"]);
}
}
]]>
</mx:Script>
<mx:GroupingCollection id="gc" source="{dpFlat}" >
<mx:Grouping >
<mx:GroupingField id="gf" name="Estimate" caseInsensitive="true" />
</mx:Grouping>
</mx:GroupingCollection>
<mx:AdvancedDataGrid id="myADG" width="100%" height="100%"
dataProvider="{gc}"
initialize="{gc.refresh()}"
displayItemsExpanded="true"
creationComplete="{myADG.expandAll()}"
defaultLeafIcon="{null}"
folderOpenIcon="{null}"
folderClosedIcon="{null}">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory" />
<mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep" sortable="false"/>
<mx:AdvancedDataGridColumn dataField="Actual" visible="false" />
<mx:AdvancedDataGridColumn dataField="Estimate" sortable="false"/>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
<mx:Button label="按Territory排序" click=""/>
</mx:Application>

我就想在点击按钮的时候,对Territory列进行排序,就像点击标题行时的排序。
TECHBAGA007 2010-03-23
  • 打赏
  • 举报
回复
无奈。。。
TECHBAGA007 2010-03-23
  • 打赏
  • 举报
回复
没人会啊?
TECHBAGA007 2010-03-23
  • 打赏
  • 举报
回复
跪求高手解答

4,328

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧