Hi FlexCoders,
I am able to retrieve an XML data from a backend (ASP.NET) webservice and 
simultaneously, bind it to my datagrid.

I want to convert the XML data to an ArrayCollection and bind that Array 
Collection to the datagrid instead of the XML data.

The conversion needs to be done so that I could implement a search/filter 
functionality for my datagrid.

Here's some of the codes I have:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; 
    layout="vertical" 
    backgroundGradientColors="[#FFCC00, #993300]" 
    horizontalAlign="left" >
 <mx:Script>
  <![CDATA[
   import mx.utils.ArrayUtil;
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.soap.mxml.WebService;
   import mx.managers.CursorManager;
   import mx.managers.PopUpManager;
   import mx.utils.ObjectUtil;
   
   /**
    * @bindable 
    * @private
    * @property Will hold the data passed from the web service.
   */
   [Bindable]
   private var _xmlData:XML;
   
   [Bindable]
   private var arrDP:ArrayCollection = new ArrayCollection;
   
   private function getGridData():void
   {
    CursorManager.setBusyCursor();
    var service:WebService = new WebService();
    
    service.addEventListener(ResultEvent.RESULT, serviceResultHandler);
    service.addEventListener(FaultEvent.FAULT, serviceFaultHandler);
    service.loadWSDL("http://localhost:55841/Service1.asmx?WSDL";);
    service.RetrieveSuppliers2();
    arrDP = new ArrayCollection(mx.utils.ArrayUtil.toArray(_xmlData));
   }
   
   private function serviceResultHandler(event:ResultEvent) :void
   {
    CursorManager.removeBusyCursor();
    _xmlData = XML(event.result);
    this.MydataGrid.visible = true;
   }
   
   private function serviceFaultHandler(event:FaultEvent) :void
   {
    CursorManager.removeBusyCursor();
    Alert.show(String(event.fault), "Error");
    this.btnLoad.enabled = true;
   }
   
   private function sortNumericColumn(itemA:Object, itemB:Object): int
   {
    return ObjectUtil.numericCompare(itemA.SupplierID, itemB.SupplierID);
   }
   
   private function searchFilterGrid(e:Event) :void
   {
    e.stopImmediatePropagation()
    if(txtSearch.text == '')
    {
     arrDP.filterFunction = null;
    }
    else
    {
     arrDP.filterFunction = textFilter;
    }
   }
   
   private function textFilter(item:Object) :Boolean
   {
    return item.CompanyName.toLowerCase().indexOf(txtSearch.text.toLowerCase()) 
!= -1;
   }
  ]]>
 </mx:Script>
 
 <mx:HBox height="50"
    width="100%"
    horizontalScrollPolicy="off"
    verticalScrollPolicy="off">
  <mx:ComboBox >
   <mx:dataProvider>
    <mx:Array>
     <mx:String>All</mx:String>
     <mx:String>Supplier ID</mx:String>
     <mx:String>Company Name</mx:String>
     <mx:String>Contact Name</mx:String>
     <mx:String>Contact Title</mx:String>
     <mx:String>Address</mx:String>
    </mx:Array>
   </mx:dataProvider> 
  </mx:ComboBox>
  <mx:TextInput id="txtSearch" width="200" change="searchFilterGrid(event)" />
  <mx:CheckBox label="Filter" />
  <mx:Label id="lblRecordCount" />
 </mx:HBox>
 
 <mx:VBox horizontalCenter="0" 
    verticalCenter="0" 
    horizontalScrollPolicy="off"
    verticalScrollPolicy="off"
    height="100%"
    width="100%" >
  <mx:HBox width="70%" height="100%" borderStyle="solid">
   <mx:DataGrid id="MydataGrid" 
       creationComplete="getGridData();" 
       horizontalScrollPolicy="on" 
       width="100%" 
       height="100%" 
       visible="false" 
       dataProvider="{_xmlData.*}" 
       itemClick="getDataItems();" >
    <mx:columns>
     <mx:DataGridColumn headerText="ID" dataField="SupplierID" 
sortCompareFunction="sortNumericColumn" width="30"/>
     <mx:DataGridColumn headerText="Company Name" dataField="CompanyName" 
width="200"/>
     <mx:DataGridColumn headerText="Contact Name" dataField="ContactName"  
width="150"/>
     <mx:DataGridColumn headerText="Contact Title" dataField="ContactTitle" 
width="150"/>
     <mx:DataGridColumn headerText="Address" dataField="Address" width="250"/>
    </mx:columns>
   </mx:DataGrid>
  </mx:HBox>
 </mx:VBox>
</mx:Application>

When I replace the dataProvider for the datagrid with this:

dataProvider="{arrDP}"

No data is shown on the datagrid.  How can I then convert the XML to array 
collection and subsequently, be able to bind it to my datagrid?

I would appreciate your advice on this matter.

Thanks and regards,

Angelo


      

Reply via email to