2013-07-03 8 views
0

에서 데이터 그리드를 작성 : 나는 아홉 열이이 경우동적으로 내가 탭은 다음과 같습니다 엑셀에서 내 보낸 .txt 파일로 구분 한 수입 .txt 파일

Sector Section Family Code Brand Image Description Quantity Price 
Sector 1 Section 1 Family 1 10000 Fiat 10000 Description 10000 8 25,00 
Sector 1 Section 1 Family 1 10001 Kawasaky 10001 Description 10001 10 45,00 
Sector 1 Section 1 Family 1 10002 Ford 10002 Description 10002 15 10,00 
Sector 1 Section 1 Family 2 10003 Fiat 10003 Description 10003 100 8,00 

하지만, 방법은 임의의 숫자와 함께 작동합니다 열의 나는이 값들로부터 dinamically dataGrid를 만들고 싶습니다; 이것은 내 첫 번째 시도이다

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       creationComplete="creationCompleteHandler(event)"> 

    <fx:Script> 
     <![CDATA[ 
      import flash.net.URLLoader; 
      import flash.net.URLRequest; 
      import mx.collections.ArrayCollection; 
      import mx.controls.DataGrid; 
      import mx.controls.dataGridClasses.DataGridColumn; 
      import mx.events.FlexEvent; 

      private var loader:URLLoader = new URLLoader(); 
      private var request:URLRequest = new URLRequest("txtData/products.txt"); 

      protected function creationCompleteHandler(event:FlexEvent):void{ 
       loader.addEventListener(Event.COMPLETE, loader_complete); 
       loader.load(request); 
      } 

      protected function loader_complete(evt:Event):void { 
       //create array of lines from loaded .txt file 
       var lines:Array = evt.target.data.split(/\n/); 
       var dg:DataGrid = new DataGrid(); 
       var columns:Array = []; 
       var dataProvider:ArrayCollection = new ArrayCollection(); 

       for (var i:Number = 0; i<lines.length; i++) { 

        var line:String = lines[i]; 
        //create array of column values from each line 
        var lineArray:Array = line.split(/\t/); 

        for(var j:Number = 0; j<lineArray.length; j++){ 
         var prop:String = lineArray[j]; 
         if(i==0){ 
           //if first line of array, create column and assign value of prop to dataField 
          var c:DataGridColumn = new DataGridColumn(prop); 
          c.dataField = prop; 
          columns.push(c); 
         } 
         else{ 
           //create new object and add it to dataProvider 
          var dataObject:Object = {Sector: lineArray[0], Section: lineArray[1], Family: lineArray[2], Code: lineArray[3], Brand: lineArray[4], Image: lineArray[5], Description: lineArray[6], Quantity: lineArray[7], Price: lineArray[8] }; 
          dataProvider.addItem(dataObject); 
         } 
        } 
       } 
       //assign columns to dataGrid 
       dg.columns = columns; 
       //assign dataProvider to dataGrid 
       dg.dataProvider = dataProvider; 
       //add dataGrid to stage 
       this.addElement(dg); 
      } 
     ]]> 
    </fx:Script> 

</s:Application> 

, 대신 나는 (아래 라인을 참조) 데이터 공급자의 항목에 대해 그렇게 할 수 없습니다 나는 dinamically 열과 dataFields를 만들 수 있었다 :

var dataObject:Object = {Sector: lineArray[0], Section: lineArray[1], Family: lineArray[2], Code: lineArray[3], Brand: lineArray[4], Image: lineArray[5], Description: lineArray[6], Quantity: lineArray[7], Price: lineArray[8] }; 

어떻게이 값을 dinamically (열 번호 및 데이터 필드 이름을 모른 채) 만들 수 있습니까?

미리 감사드립니다.

답변

0

귀하의 솔루션이 우수합니다. 아래 내 코드를 참조하십시오, 당신을 도울 수 있기를 바랍니다.

enter image description here

// 앱

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      minWidth="955" minHeight="600" 
      creationComplete="creationCompleteHandler(event)"> 
<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.controls.DataGrid; 
     import mx.controls.dataGridClasses.DataGridColumn; 
     import mx.events.FlexEvent; 
     import mx.utils.ObjectUtil; 

     private var loader:URLLoader = new URLLoader(); 
     private var request:URLRequest = new URLRequest("com/dgtextfile/products.txt"); 

     protected function creationCompleteHandler(event:FlexEvent):void 
     { 
      loader.addEventListener(Event.COMPLETE, loader_complete); 
      loader.load(request); 
     } 

     protected function loader_complete(evt:Event):void 
     { 
      var lines:Array = evt.target.data.split(/\n/); 
      var dg:DataGrid = new DataGrid(); 
      var columns:Array = []; 
      var dataProvider:ArrayCollection = new ArrayCollection(); 
      var propArray:Array; 

      for (var i:Number = 0; i<lines.length; i++) 
      { 
       var line:String = lines[i]; 

       var lineArray:Array = line.split(/\t/); 

       var j:Number; 

       if (i == 0) 
       { 
        propArray = ObjectUtil.copy(lineArray) as Array; 

        for (j = 0; j < propArray.length; j++) 
        { 
         var c:DataGridColumn = new DataGridColumn(propArray[j]); 
         columns.push(c); 
        } 
       } 
       else 
       { 
        var obj:Object = new Object(); 

        for(j = 0; j < lineArray.length; j++) 
        { 
         obj[propArray[j]] = lineArray[j]; 
        } 

        dataProvider.addItem(obj); 
       } 
      } 

      dg.columns = columns; 
      dg.dataProvider = dataProvider; 

      vgMain.addElement(dg); 
     } 
    ]]> 
</fx:Script> 

<s:VGroup id="vgMain" x="20" y="20"/> 
</s:Application>