我有一个高级数据网格,我正在实现自定义排序。我的adv.data网格在每个随后的排序中减慢...如果节点被打开,它只是超时。
我的数据如下所示(g = grp on ID)*
ID f_name l_name fld1 fld2
(g)
--------------------------------------
1 A1 B1 xyx xyz
A6 B6 xyx xyz
--------------------------------------
2 A3 B3 xyx xyz
A8 B8 xyx xyz
--------------------------------------
当我对F_NAME或L_NAME进行排序时,排序ArrayCollection应按如下方式对数据进行排序和显示(g = grp on ID)*:
ID f_name l_name fld1 fld2
(g)
-----------------------------------------
1(1) A1 B1 xyx xyz
2(2) A3 B3 xyx xyz
-----------------------------------------
1(3) A6 B6 xyx xyz
2(4) A6 B6 xyx xyz
-----------------------------------------
为此,我使用的排序事件如下所示
protected function adg1_headerReleaseHandler(event:AdvancedDataGridEvent):void
{
event.preventDefault();
sort_dir = !sort_dir;
var sort:Sort = new Sort();
sort.fields = [new SortField(event.dataField, true,sort_dir),new SortField('ID', true,sort_dir)]
_ds.sort = sort;
_ds.refresh();
adg1.dataProvider = null;
var previousRegId:int = 0;
var counter:int = 0;
for each (var item:DueInVO in _ds) {
if (previousRegId != item.ID) {
counter++;
previousRegId = item.ID
}
item.uid = counter;
}
/*
var previousRegId:int = 0;
var counter:int = 0;
var csr:IViewCursor = DataSource.createCursor();
while(!csr.afterLast){
if (previousRegId != csr.current.registration_id) {
counter++;
previousRegId = csr.current.registration_id
}
csr.current.uid = counter;
csr.moveNext();
}
*/
setGrouping(['uid']);
//csr = null;
}
并且setGrouping函数如下所示:
protected function setGrouping(columnNames:Array):void{
var _groupingColumns:Array = [];
var gc:GroupingField;
if (columnNames.length > 0) {
var _groupedData:GroupingCollection2 = new GroupingCollection2();
var _grouping:Grouping = new Grouping();
for (var i:int=0;i<columnNames.length;i++) {
gc = new GroupingField(columnNames[i]);
//gc.numeric = true;
//gc.compareFunction = compareFunc;
//gc.groupingFunction = groupFunc;
_groupingColumns.push(gc);
}
_groupedData.source = _ds;
_grouping.fields = _groupingColumns;
_groupedData.grouping = _grouping
_groupedData.refresh();
adg1.dataProvider = _groupedData;
} else {
adg1.dataProvider = _ds;
}
}
但是,每个随后的排序请求都需要更长时间才能解决。如上所述,如果分组节点被选中,则Flash播放器崩溃的可能性很大。
我猜测某处存在内存泄漏,但我无法指责它。
如果有人需要完整的代码,我很乐意提供它..
非常感谢所有帮助
答案 0 :(得分:0)
您只需向ADG列提供sortCompareFunction,而不是这样做。您不必捕获标题点击事件和所有这些。它已经为你完成了。您所要做的就是指定特定列的比较结果。
答案 1 :(得分:0)
我明白了!...... Robusto感谢你指点我正确的方向。在我的情况下你的建议的问题是我从配置文件生成列,所以我可以使这个网格组件可重用。因此: 1.我正在使用labelFunction 2. column.sortCompareFunction = myfunc回调根本无法从Adobe API文档中引用。
然而,正如你所说,我写的是复杂的代码。我需要添加gc.compareFunction = myCompare;以下代码(从上面比较):
protected function setGrouping(columnNames:Array):void { _groupingColumns = [];
if (columnNames.length > 0) {
_groupedData = new GroupingCollection2();
_grouping = new Grouping();
for (var i:int=0;i<columnNames.length;i++) {
var gc:GroupingField = new GroupingField(columnNames[i]);
gc.descending = _sort_direction;
gc.compareFunction = myCompare;
_groupingColumns.push(gc);
}
_groupedData.source = _ds;
_grouping.fields = _groupingColumns;
_groupedData.grouping = _grouping
_groupedData.refresh();
_data = _groupedData;
} else {
_data = _ds;
}
setGridColumns();
}
一旦完成,我只需要监听AdvancedDataGrid侦听器中的sort事件并从那里调用setGrouping([abc]),如下所示:
protected function adg1_sortHandler(event:AdvancedDataGridEvent):void
{
_sortField = event.dataField;
if (temp.length == 0) {
temp.push(DefaultGroupColumn);
}
setGrouping(temp)
_sort_direction = !_sort_direction;
我希望这有助于某人! AAP