Flex Datagrid列总计

时间:2015-04-13 21:34:09

标签: flex datagrid flash-builder

我有一个数据网格,其中包含标题,价格,数量和总列数。标题,价格和数量数据从xml文件加载,总数填充labelFunction以将价格乘以数量。

我可以使用labelFunction填充每行的总数,方法是将字符串返回到总列下的行,但是我无法弄清楚如何获得总数的总计柱。我希望得到整体总数并将其显示在textBox / datagrid之外的其他位置。

我可以通过使用updateEsimate函数来获取总数,但它只会在datagrid上使用itemEditEnd发送总数(这意味着我必须点击eat qty row for它计算好了)我希望它在加载后自动给我总数。

请帮助!

(一些示例代码)

        public function updateEstimate(event:DataGridEvent):void
        {
            // TODO Auto-generated method stub

            var sum:Number = 0;

            for(var i:int=0; i<orderGrid.dataProvider.length ; i++) {

                sum += Number(orderGrid.dataProvider.getItemAt(i).total);
                totaltxt.text = sum.toString();

            }

            totaltxt.text = sum.toString();

        }




        public function getTotal(item:Object, column:DataGridColumn):String
        {


            var sum:Number = item.price * item.quantity;

            return sum.toString();


        }

    <mx:XMLListCollection id="xmlProdListColl"
                          source="{productXML.lastResult.offer}"
                          />


</fx:Declarations>
<mx:DataGrid id="orderGrid" x="44" y="0" width="640" height="155" 
             dataProvider="{xmlProdListColl}" 
             doubleClickEnabled="true" editable="true"
             itemEditEnd="orderGrid_itemEditEndHandler(event); updateEstimate(event)">
    <mx:columns>
        <mx:DataGridColumn headerText="Title" dataField="title" editable="false"/>
        <mx:DataGridColumn headerText="Price" dataField="price" editable="false"/>
        <mx:DataGridColumn headerText="Quantity" dataField="quantity"/>
        <mx:DataGridColumn headerText="Total" labelFunction="getTotal" editable="false"/>
    </mx:columns>
</mx:DataGrid>


<s:RichText id="totaltxt" width="147" height="84" fontSize="18" text=""  textAlign="center"
            verticalAlign="middle" />

2 个答案:

答案 0 :(得分:0)

您可以在XMLListCollection上使用CollectionEvent。这将在开始时以及对数据进行任何更新时发送:

public function updateEstimate(event:CollectionEvent):void{
    // your update code
}

<mx:XMLListCollection id="xmlProdListColl"
                      collectionChange="updateEstimate(event)"
                      source="{productXML.lastResult.offer}"/>

答案 1 :(得分:0)

从我看到你计算getTotal()中的总数来显示总数但不设置实际对象中的“total”属性。它是您在updateEstimate()中使用的总属性。因此,无论何时编辑数量,您仍会在数据网格中看到正确的总数,但文本字段中的值将保持不变

我不是binded dataProviders的忠实粉丝,因为你永远都不知道数据何时可用而且很难修改它(就像我们在这里需要的那样)。我更喜欢我自己的dataProvider变量,这些变量是强类型的,我可以按照自己的意愿修改:)

所以我会这样做:

我认为,你的XML看起来像这样,并且你没有“总”值:

<root>
<lastResult>
    <offer>
        <title>Title</title>
        <price>20</price>
        <quantity>1</quantity>
    </offer>
    <offer>
        <title>Title 2</title>
        <price>30</price>
        <quantity>2</quantity>
    </offer>
</lastResult>

在您的代码中的某个时刻,您将获得XML。您可以在此处修改它,添加总属性并将dataProvider传递给网格:

private var _orderDataProvider:XMLListCollection;

private function gotData():void
{
     var list:XMLList = new XMLList(productXML.lastResult.offer);
    _orderDataProvider = new XMLListCollection(list);

    updateEstimate(); // call this before we assign the dataprovider to the grid, so we will have totals in items
    orderGrid.dataProvider = _orderDataProvider;
}

public function updateEstimate(event:DataGridEvent = null):void
{
    // update all totals in all items and the "Estimated total" in one go               
    var sum:Number = 0;

    for (var i:int = 0; i < _orderDataProvider.length; i++)
    {
        var item:Object = _orderDataProvider.getItemAt(i);
        item.total = item.quantity * item.price;
        sum += Number(_orderDataProvider.getItemAt(i).total);
    }

    totaltxt.text = sum.toString();
}

MXML:

<mx:DataGrid id="orderGrid"
             x="44"
             y="0"
             width="640"
             height="155"
             doubleClickEnabled="true"
             editable="true"
             itemEditEnd="updateEstimate(event)">

    <mx:columns>

        <mx:DataGridColumn headerText="Title"
                           dataField="title"
                           editable="false"/>

        <mx:DataGridColumn headerText="Price"
                           dataField="price"
                           editable="false"/>

        <mx:DataGridColumn headerText="Quantity"
                           dataField="quantity"/>

        <mx:DataGridColumn headerText="Total"
                           dataField="total"
                           editable="false"/>

    </mx:columns>

</mx:DataGrid>

<s:RichText id="totaltxt"
            width="147"
            height="84"
            fontSize="18"
            text=""
            textAlign="center"
            verticalAlign="middle"/>

现在您看到这不是理想的代码,因为我们每次编辑时都会更新所有项目中的总计,尽管您只编辑一个条目但我们不必乱用几个函数,所以只要你不这样做列表中有1000个条目,应该没问题。