【问题标题】:Dynamically creating DataGrid from imported .txt file从导入的 .txt 文件动态创建 DataGrid
【发布时间】:2013-07-03 07:44:15
【问题描述】:

我有一个从 Excel 导出的制表符分隔的 .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

在这种情况下,我有九列,但该方法应该适用于任意数量的列。 我想从这些值动态地创建一个 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>

我能够动态地创建列和数据字段,但我无法为数据提供者项目创建(见下一行):

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] };

如何动态创建这些值(不知道列号和数据字段名称)?

提前致谢

【问题讨论】:

    标签: actionscript-3 apache-flex flex4 flex3 flex4.5


    【解决方案1】:

    您的解决方案几乎是好的。请参阅下面的代码,希望对您有所帮助。

    //应用程序

    <?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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2015-08-05
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多