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