在FLASH里使用DATAGRID,其他的功能都不错,就一样不好,排序始终是按照字母(分大小写)顺序排列,如果遇到数字型的排序后就很不爽了。做了好几个FLASH富客户端的程序(都是查询统计信息为主的程序),里面大量使用了DATAGRID,客户一直提出要按照数字大小排序。本想用绑DataSet的方法实现,
虽然加载速度比直接绑定慢的多(我用remoting传数据)。但flash里还有一个规定,绑定数据必须放在第一帧,而我的DataGrid是很多帧都存在,根本无法绑,要不就是重写程序(很不现实)。只有从脚本上动脑筋了,今天终于解决了这个头痛的问题。
这个思路是从《FlashMX2004 ActionScript2.0 与RIA应用程序开发》里关于修改DATAGRID表头渐变的方法里想到的。当然最彻底的办法是重制DATAGRID组件,但这样工作量太大了。
将下面的代码放到flash的第一帧(或主场景的第一帧)即可。
_global.mx.controls.DataGrid.prototype.headerRelease = function(Void):Void {
var o = this.owner;
// the grid
var c:mx.controls.gridclasses.DataGridColumn = this.column;
if (!c.sortable || !o.sortableColumns || !o.enabled) {
return;
}
this.headerUp();
this.asc = !this.asc;
var dir:String = (this.asc) ? "ASC" : "DESC";
// set the grids sortIndex
o.sortIndex = o.getColumnIndex(c.columnName);
o.sortDirection = dir;
o.placeSortArrow();
// do the sort if were allowed to
if (c.sortOnHeaderRelease) {
//和DataSet绑定时使用
if (o.__dataProvider._dataset != undefined) {
o.sortItemsBy(c.columnName, dir);
} else {
//普通数据源
var item = o.__dataProvider;
if (o.__dataProvider._items != undefined) {
//flash remoting 数据源
item = o.__dataProvider._items;
}
item.sortOn(c.columnName, Array.NUMERIC | Array.DESCENDING);
if (dir.toUpperCase() == "DESC") {
item.reverse();
}
o.__dataProvider.updateViews("sort");
}
}
// dispatch the event
o.dispatchEvent({type:"headerRelease", view:o, columnIndex:o.getColumnIndex(c.columnName)});
o.dontEdit = true;
};
注意不同的数据源的绑定方式不一样,我只考虑了三种情况,红色部分是我修改的位置,其余部分是原函数里有的。上面那个单独的this一定不能忘了,不然。。。
其实原理和C#的override或new有点相似
极力推荐作flash的朋友(特别是涉及到数据交互的)看上面说的《FlashMX2004 ActionScript2.0 与RIA应用程序开发》,你能从中学到很多和受到很大的启发。