我有一个数据网格,其中包含标题,价格,数量和总列数。标题,价格和数量数据从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" />
答案 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个条目,应该没问题。