Search code examples
actionscript-3apache-flexdatagridmxml

How to add Column to Adobe flex mx:DataGrid in mxml and/or actionsctpt?


I have simple mxml code

<mx:DataGrid id="DGG"
             editable="true">
    <mx:dataProvider>
        <mx:Object scheduledDate="4/1/2006"/>
    </mx:dataProvider>
</mx:DataGrid>
<mx:Button id="SetBut"
           label="Set Array as Data Provider"
           click="SetDP(); AddBut.visible = true;"
           x="100.5"
           y="164"
           width="211"/>
<mx:Button id="AddBut"
           label="Add a column!"
           click="AddCol();"
           x="100.5"
           y="194"
           width="211"
           visible="false"/>
<mx:Script>
    <![CDATA[
        import mx.controls.dataGridClasses.DataGridColumn;
        import mx.collections.ArrayCollection;

        [Bindable]
        public var MyAC:ArrayCollection=new ArrayCollection([{scheduledDate: "4/1/2006", homeTeam: "Chester Bucks"}]);

        public function SetDP():void
        {
            DGG.dataProvider=MyAC
        }

        public function AddCol():void
        {
            MyAC.addItem({scheduledDate: "4/5/2007", homeTeam: "Long Valley Hitters", Umpire: "Amanda Hugenkis"});
            DGG.columns.push(new DataGridColumn("Umpire"));
        }
    ]]>
</mx:Script>

I want to add rows to my table datagrid how to do such thing?

How to add Column to Adobe flex mx:DataGrid in mxml and/or actionsctpt?

(You can put this code in Flash or AIR app - it will compile with no errors, but will not add any columns=( )


Solution

  • The best way to add rows is to use a bindable dataProvider, and I prefer the ArrayCollection Class.

    [Bindable] public var MyAC:ArrayCollection = new ArrayCollection([
      {scheduledDate:"4/1/2006", homeTeam:"Chester Bucks",awayTeam:"Long Valley Hitters", field:"Dawn Field", umpire:"Phil McKraken"}
    ]);
    

    Then in your datagrid, instead of defining your DP through MXML add it like this:

    <mx:DataGrid id="dataGrid" editable="true" dataprovider="{MyAC}"....>
    

    Then you can add rows by adding items into your MyAC var via action script:

    MyAC.AddItem({scheduledDate:"4/5/2006", homeTeam:"Long Valley Hitters",awayTeam:"Chester Bucks", field:"Sunset Field", Umpire:"Amanda Hugenkis"})
    

    Since it's bound it will automatically show up in the dataGrid.

    Assume you define your columns in MXML as in your example you can add the Umpire column like so:

    dataGrid.columns.push(new DataGridColumn("Umpire"));
    

    Credit to ClownBaby for the column adding AS that was already posted.

    EDIT 2/1/2010: Full Code Example

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
    
            [Bindable] public var MyAC:ArrayCollection = new ArrayCollection([
              {scheduledDate:"4/1/2006", homeTeam:"Chester Bucks",awayTeam:"Long Valley Hitters", field:"Dawn Field", umpire:"Phil McKraken"}
            ]);
    
            public function addRow():void{
                MyAC.addItem({scheduledDate:"4/5/2006", homeTeam:"Long Valley Hitters",awayTeam:"Chester Bucks", field:"Sunset Field", Umpire:"Amanda Hugenkis"})
            }
    
            public function addCol():void{
                var dgc:DataGridColumn = new DataGridColumn("Umpire");
                    var cols:Array = dataGrid.columns;
                    cols.push(dgc);
                    dataGrid.columns = cols;
            }
        ]]>
    </mx:Script>
    
    <mx:DataGrid id="dataGrid" editable="true" dataProvider="{MyAC}">
        <mx:columns>
            <mx:DataGridColumn dataField="scheduledDate" />
            <mx:DataGridColumn dataField="homeTeam" />
            <mx:DataGridColumn dataField="awayTeam" />
            <mx:DataGridColumn dataField="field" />
        </mx:columns>
    </mx:DataGrid>
        <mx:Button x="10" y="150" label="Add Row" click="addRow();"/>
        <mx:Button x="202" y="150" label="Add Col" click="addCol();"/>
    
    </mx:Application>