Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex FlexDataGrid列总数_Apache Flex_Datagrid_Flash Builder - Fatal编程技术网

Apache flex FlexDataGrid列总数

Apache flex FlexDataGrid列总数,apache-flex,datagrid,flash-builder,Apache Flex,Datagrid,Flash Builder,我有一个数据网格,它有一个标题、价格、数量和总数列。标题、价格和数量数据是从xml文件加载的,总数由labelFunction填充,以将价格乘以数量 我可以使用labelFunction向total列下的行返回一个字符串来填充每行的总计,但是我很难弄清楚如何获得total列的总计。我想得到总的总数,并将其显示在文本框/数据网格之外的其他地方 我可以使用updateEsimate函数来获取总数,但它只会使用datagrid上的itemEditEnd发送总数(这意味着我必须单击eat qty行才能进

我有一个数据网格,它有一个标题、价格、数量和总数列。标题、价格和数量数据是从xml文件加载的,总数由labelFunction填充,以将价格乘以数量

我可以使用labelFunction向total列下的行返回一个字符串来填充每行的总计,但是我很难弄清楚如何获得total列的总计。我想得到总的总数,并将其显示在文本框/数据网格之外的其他地方

我可以使用updateEsimate函数来获取总数,但它只会使用datagrid上的itemEditEnd发送总数(这意味着我必须单击eat qty行才能进行汇总),我希望它在加载后自动给我总数

救命啊

(一些示例代码)

公共函数updateEstimate(事件:DataGridEvent):void
{
//TODO自动生成的方法存根
var总和:数值=0;

对于(var i:int=0;i您可以在XMLListCollection上使用CollectionEvent。这将在开始时以及对数据进行任何更新时被调度:

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

<mx:XMLListCollection id="xmlProdListColl"
                      collectionChange="updateEstimate(event)"
                      source="{productXML.lastResult.offer}"/>
公共函数更新估计(事件:CollectionEvent):无效{
//您的更新代码
}

据我所见,您在getTotal()中计算总计以显示总计,但不是实际对象中的“total”属性。它是您在updateEstimate()中使用的total属性。因此,无论何时编辑数量,您仍然可以在datagrid中看到正确的总数,但textfield中的值将保持不变

我不太喜欢绑定数据提供程序,因为你永远不知道数据何时可用,而且很难修改它(就像我们这里需要它)。我更喜欢我自己的数据提供程序变量,这些变量是强类型的,我可以随意修改:)

所以我会这样做:

我假设,您的XML看起来像这样,并且没有“total”值:

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

标题
20
1.
标题2
30
2.

在代码中的某个时刻,您将拥有XML。在这里,您可以通过添加total属性对其进行修改,并将数据提供程序传递到网格:

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();
}
private var\u orderDataProvider:XMLListCollection;
私有函数gotData():void
{
var列表:XMLList=新的XMLList(productXML.lastResult.offer);
_orderDataProvider=新的XMLListCollection(列表);
updateEstimate();//在将数据提供程序分配给网格之前调用此函数,这样我们就可以得到项目总数
orderGrid.dataProvider=\u orderDataProvider;
}
公共函数updateEstimate(事件:DataGridEvent=null):void
{
//一次性更新所有项目的所有总计和“估计总计”
var总和:数值=0;
对于(变量i:int=0;i<\u orderDataProvider.length;i++)
{
var item:Object=\u orderDataProvider.getItemAt(i);
item.total=item.quantity*item.price;
总和+=数量(_orderDataProvider.getItemAt(i).total);
}
totaltxt.text=sum.toString();
}
MXML:



现在,正如您所看到的,这不是理想的代码,因为我们在每次编辑时都会更新所有项目的总数,虽然您只编辑一个条目,但我们不必处理多个函数,所以只要列表中没有1000个条目,就应该可以了。

谢谢您让我找到了正确的方向!这仍然不起作用-您仍然没有o单击单元格以推送总计(仍具有itemEditEnd功能).还有其他想法吗???CollectionEvent没有发送吗?没有。我只是根据您的上述响应进行了更改。是否还有其他我应该添加的内容?我应该使用getItemAt以外的内容吗?这是否与selectedItem一样工作,或者它仍然可以循环打开?sum+=Number(orderGrid.dataProvider.getItemAt(i).total);非常感谢!!!在updateEstimate函数中添加“=null”使我可以在其他地方(enterState、组合框刷新、ItemEdit等)使用此函数,而不仅仅是在dataGrid中。
<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>
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();
}
<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"/>