您的位置:首页 > 其它

在Flash中调用WS时的身份验证_5:dataProvider的问题

2006-08-20 01:37 302 查看
在昨天完成的例子中,我发现了一个问题,dataProvider不知道为什么,会增加一些内容数据类型未知的object,比如我自定义了一个数组给datagrid作为数据源,如下:
var tt:Array=new Array();
tt=[{name:"JimLee",sex:"F"},{name:"lwanchen",sex:"X"}];
dbGrid.dataProvider=tt;
将数组绑定到了dbGrid之后,按照我的想法,这时候如果
trace(dbGrid.dataProvider.length);
应该返回2,因为赋值给dbGrid.dataProvider的数组tt只有两个元素,但事实是上,flash返回的值可能是8,可能是9,就不是2,如果写个循环如下跟踪dbGrid.dataProvider中的元素:
for (var i:int=0;i<dbGrid.dataProvider.length;i++){
trace(dbGrid.dataProvider[i].name);
trace(dbGrid.dataProvider[i].sex);
}
你会发现,除了应该返回的前面定义的[{name:"JimLee",sex:"F"},{name:"lwanchen",sex:"X"}]之外,还会返回几个undefinded的数值!!
问题出在哪儿呢?
在翻看帮助文档,dataProvider的源文件等等之后,终于找到了问题的症结所在:如果提供的数组元素个数小于dataGrid组件的高度/rowHeight(dataGrid属性,行高),flash将自动将剩下的行数用undefinded类型的object补齐。
知道了原因就好办了,下面修改一下前面的代码(只需要在as中修改就可以了):
1、 新增变量resultRowNum
var resultRowNum:Number=0;
2、 在方法GetArray_3中给resultRowNum赋值:
function GetArray_3(myDB){
resultRowNum=myDB.length;
gb_main.dataProvider=myDB;
trace(gb_main.dataProvider.length);
}
3、 对DataGrid组件gb_main的change事件进行处理,如果DataGrid是新增行,让变量resultRowNum等于DataGrid组件gb_mai中有数据的最大值。
ls_mdc = new Object();
ls_mdc.change = function(evt){
var tgb:Object=evt.target;
if (tgb.selectedIndex>(resultRowNum-1)){
resultRowNum=tgb.selectedIndex;
}
}
gb_main.addEventListener("change",ls_mdc);
4、 修改按钮dbBind3_bt的处理函数,提交DataGrid组件gb_mai到WS:
this.dbBind3_bt.onPress=function(){
//trace(gb_main.dataProvider[1]);
trace(gb_main.dataProvider.length);
var i:Number=0;
var tCar:Array=new Array();
trace(resultRowNum);
for (i=0;i<resultRowNum;i++){
tCar.push(gb_main.dataProvider[i]);
trace(tCar[i].model);
}
//tCar=gb_main.dataProvider;
/*for (i=0;i<(tCar.length/2-1);i++){
trace(tCar[i].model);
}
*/
var op_8:PendingCall=myws.GetArray_4(tCar);
op_8.onResult=GetArray_4;
}
这样,就可以了。可惜,如果MM公司提供一个类似trim的函数,将dataProvider中数据类型为undefinded的元素裁剪掉,那不就方便多了,免得我们做这么多无用功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: