Flex Spark Datagrid Cell 1 * Cell 2存储在Cell 3中

时间:2012-08-13 20:34:47

标签: flex datagrid flex-spark

我对数据网格和火花有点新意,并一直在抨击我的大脑来解决这个问题。我有一个数据网格加载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>

3 个答案:

答案 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编程的目的吗?)

这个问题与第一个完全不同。我愿意提供答案,但你应该自己做一些研究。