Flex 解析显示.net web service的DataTable返回

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    
<mx:Script>
    
<![CDATA[
        import mx.controls.Alert;
    
]]>
</mx:Script>
<mx:WebService useProxy="false" wsdl="http://localhost/WebSite/Service.asmx?WSDL" id="ws" showBusyCursor="true">
        
<mx:operation name="GetDataTable2">
        
</mx:operation>
</mx:WebService>
<mx:Button x="153" y="20" label="Get DataSet" click="ws.GetDataTable2.send();"/>
<mx:DataGrid left="22" right="22" top="50" bottom="386" id="dg2"
         dataProvider
="{ws.GetDataTable2.lastResult.diffgram.NewDataSet.Table}">
        
<mx:columns>
            
<mx:DataGridColumn headerText="编号" dataField="编号"/>
            
<mx:DataGridColumn headerText="门禁控制器号" dataField="门禁控制器号"/>
            
<mx:DataGridColumn headerText="帐号" dataField="帐号"/>
            
<mx:DataGridColumn headerText="卡号" dataField="卡号"/>
            
<mx:DataGridColumn headerText="交易时间" dataField="交易时间"/>
            
<mx:DataGridColumn headerText="上传结果" dataField="上传结果"/>
            
<mx:DataGridColumn headerText="流水类型" dataField="流水类型"/>
        
</mx:columns>
    
</mx:DataGrid>
</mx:Application>

注意此处:
dataProvider="{ws.GetDataTable2.lastResult.diffgram.NewDataSet.Table}">

应该指出的是在Flex中解析DataTable是非常慢的,能够明显感觉到鼠标的停顿。
而且存在一个问题就是DataTable中只有一条数据的时候,Flex解析的结果是ProxyObject而不是ArrayCollection,需要手工处理才能绑定DataGrid。

建议使用DataSet返回XmlDocument,不过同样存在一条数据的问题。
.NET
[WebMethod]
    
public XmlDocument GetList(int id)
    {
        
try
        {
            DataSet ds 
= new BLL.User.GetList(id);
            XmlDocument xml 
= new XmlDocument();
            xml.LoadXml(ds.GetXml());
            
return xml;
        }
        
catch (Exception ex)
        {
            XmlDocument xml 
= new XmlDocument();
            xml.LoadXml(
"<Error>" + ex.Message + "</Error>");
            
return xml;
        }
    }

Flex
private var mydata:ArrayCollection = new ArrayCollection(); //Data
private function getListResult(event:ResultEvent):void{  
    
try{
        mydata.removeAll();
//清空原数据
    if(event.result.Error != null){ //服务器端异常,见.NET上的catch
        Alert.show(event.result.Error);
    }
else{            
        
if(event.result.diffgram.NewDataSet != null){
            
if(event.result.diffgram.NewDataSet.ds is ArrayCollection) //判断是否是一条数据,使用DataTable时同样存在
            mydata = event.result.diffgram.NewDataSet.ds as ArrayCollection;     
        
else
            mydata.addItem(event.result.diffgram.NewDataSet.ds);  
//只有一条数据         
        }  
    }
    }
    
catch(err:Error){
        
//处理异常
    }   
}


posted @ 2006-09-20 16:43  Liren  阅读(1699)  评论(2编辑  收藏  举报