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