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

在昨天完成的例子中,我发现了一个问题,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的元素裁剪掉,那不就方便多了,免得我们做这么多无用功。

你可能感兴趣的:(Provider)