我对数据网格和火花有点新意,并一直在抨击我的大脑来解决这个问题。我有一个数据网格加载XMLList。一个字段是一个数值,将计算到另一个字段,并且该结果将被存储并在运行中显示在网格中。
示例:
XML
<SampleTable>
<Row>
<Item>Item 1</Item>
<Quantity>10</Quantity>
<Price></Price>
<Cost></Cost>
</Row>
</SampleTable>
因此,用户可以输入价格,并使用Price * Quantity值在网格中更新Cost,并在保存表单时使用结果更新dataprovider。
添加网格并且XML已经绑定。我可以对单元格进行简单的更新。我需要帮助搞清楚在哪里进行计算。只有价格可以编辑,当该单元格更改值时,我希望计算成本。
编辑会话的处理程序:
import spark.components.gridClasses.CellPosition;
import spark.events.GridEvent;
private var mouseDownRowIndex:int;
private var mouseDownColumnIndex:int;
protected function dataGrid_gridMouseDownHandler(event:GridEvent):void
{
mouseDownRowIndex = event.rowIndex;
mouseDownColumnIndex = event.columnIndex;
}
protected function dataGrid_gridMouseUpHandler(event:GridEvent):void
{
// Start a grid item editor if:
// - the rowIndex is valid
// - mouseUp is on the same cell and mouseDown
// - shift and ctrl keys are not down
// - cell is editable
// - an editor is not already running
// An editor may already be running if the cell was already
// selected and the data grid started the editor.
if (event.rowIndex >= 0 &&
event.rowIndex == mouseDownRowIndex &&
event.columnIndex == mouseDownColumnIndex &&
!(event.shiftKey || event.ctrlKey) &&
event.column.editable &&
!event.grid.dataGrid.itemEditorInstance)
{
event.grid.dataGrid.startItemEditorSession(event.rowIndex, event.columnIndex);
}
}
<s:DataGrid id="dgTest" x="10" y="68" width="900" editable="true" electionMode="singleCell" requestedRowCount="4" gridMouseDown="dataGrid_gridMouseDownHandler(event)" gridMouseUp="dataGrid_gridMouseUpHandler(event)">
<s:columns>
<s:ArrayList>
<s:GridColumn width="250" dataField="Item" headerText="Item" resizable="true" sortable="false" editable="false"></s:GridColumn>
<s:GridColumn width="160" dataField="Quantity" headerText="Quantity" resizable="false" sortable="false" editable="false"></s:GridColumn>
<s:GridColumn width="90" dataField="Price" headerText="Price" resizable="false" sortable="false" ></s:GridColumn>
<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false" sortable="false" editable="false"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
答案 0 :(得分:0)
您应该使您的数据源可以绑定。
所以在代码(AS)中,这将是:
[Bindable]
var myXMLList:XMLList;
我认为不可能绑定到XMLList。您应该使用XMLListCollection。
我还不清楚你是想在某个地方保存你的数据,还是只想想象......
s:GridColumn有一个名为“labelFunction”的属性。也许这足以满足您的需求。
public function myLabelFunction(item:Object, column:DataGridColumn):String
{
var amount:Number = item.Quantiy;
var price:Number = item.Price;
return amount*price as String
}
在你的例子中
<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false" sortable="false" editable="false"></s:GridColumn>
将改为
<s:GridColumn width="90" dataField="Cost" headerText="Cost" resizable="false" sortable="false" editable="false" labelFunction="myLabelFunction"></s:GridColumn>
提供的代码绝不完整。它就是一个例子。
祝你好运。答案 1 :(得分:0)
使用itemrenderer工作了。它很难看但很有效。
我遇到的问题是将此事件移至更改PercentComplete字段而不是此字段上的click事件。这是我遇到麻烦的时间。
<s:GridColumn width="90" dataField="Extension" headerText="Extension" resizable="false" sortable="false" rendererIsEditable="true">
<s:itemRenderer>
<fx:Component>
<s:GridItemRenderer mouseDown="itemrenderer1_dataChangeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import spark.events.GridEvent;
protected function itemrenderer1_dataChangeHandler(event):void
{
if(data){
var data_field:String = ((parseFloat(data['PercentComplete'])/100)*parseFloat(data['Weight'])).toFixed(2).toString();
this.dataLabel.text = data_field;
data.Extension[0] = data_field;
}
}
]]>
</fx:Script>
<s:Label id="dataLabel" text="{data.Extension}" height="100%" width="100%" textAlign="left" verticalAlign="middle"/>
</s:GridItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:GridColumn>
答案 2 :(得分:0)
Datagrid是数据源的所有者,而不是GridItemRenderer。 因此,您不应该使用mouseDownEvents。 (当Tab通过你的细胞时会发生什么?)。您甚至可以考虑将这种业务逻辑从您的视图中移到控制器(或您的模型)中。
对于您的示例,您真的不需要“花哨的”GridItemRenderer。必须在数据网格之外计算所有内容。
spark Datagrid有一个名为“gridItemEditorSessionSave”的事件。
<强> spark.components.DataGrid.gridItemEditorSessionSave 强>
将项目编辑器中的数据保存到数据中后调度 提供者和编辑已经关闭。
事件类型: spark.events.GridItemEditorEvent.GRID_ITEM_EDITOR_SESSION_SAVE
语言版本: 3.0
播放器版本: Flash 10,AIR 2.5
产品版本: Flex 4.5
就个人而言,我将实现一个Bindable ValueObject并在IList实现中转换我的XMLList,例如包含一组这些对象的ArrayCollection。示例如下:
[Bindable]
public class MyValueObject
{
public var percentComplete:Number;
public var weight:Number;
public function get extension():Number
{
return percentComplete*weight;
}
}
如果使用这些ValueObjects填充数据网格,您可以使用哑视图,甚至更好,您可以使用任何您喜欢的视图而无需更改实际应用程序。 (这不是OO编程的目的吗?)
这个问题与第一个完全不同。我愿意提供答案,但你应该自己做一些研究。