Apache flex Flex Spark数据网格单元1*存储在单元3中的单元2

Apache flex Flex Spark数据网格单元1*存储在单元3中的单元2,apache-flex,datagrid,flex-spark,Apache Flex,Datagrid,Flex Spark,我对数据网格和spark有点陌生,一直绞尽脑汁想弄明白这一点。我有一个加载了XMLList的datagrid。一个字段是一个数值,将乘以另一个字段计算,结果将存储并动态显示在网格中 例如: XML 项目1 10 因此,用户将输入价格,并在网格中使用价格*数量值更新成本,保存表单时,数据提供者将使用结果更新成本 添加到网格中,XML已经绑定。我可以对单元格进行简单的更新。我需要帮助弄清楚在哪里做计算。只有价格是可编辑的,当该单元格更改值时,我希望计算成本 编辑会话的处理程序:

我对数据网格和spark有点陌生,一直绞尽脑汁想弄明白这一点。我有一个加载了XMLList的datagrid。一个字段是一个数值,将乘以另一个字段计算,结果将存储并动态显示在网格中

例如:

XML


项目1
10
因此,用户将输入价格,并在网格中使用价格*数量值更新成本,保存表单时,数据提供者将使用结果更新成本

添加到网格中,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>
导入spark.components.gridClasses.CellPosition;
导入spark.events.GridEvent;
私有var mouseDownRowIndex:int;
私有var mouseDownColumnIndex:int;
受保护函数dataGrid\u gridMouseDownHandler(事件:GridEvent):void
{
mouseDownRowIndex=event.rowIndex;
mouseDownColumnIndex=event.columnIndex;
}
受保护函数dataGrid\u GridMouseHandler(事件:GridEvent):void
{
//在以下情况下启动网格项编辑器:
//-行索引有效
//-mouseUp位于同一单元格上,mouseDown
//-shift键和ctrl键未按下
//-单元格是可编辑的
//-编辑器尚未运行
//如果单元格已运行,则编辑器可能已在运行
//选中,数据网格启动编辑器。
如果(event.rowIndex>=0&&
event.rowIndex==mouseDownRowIndex&&
event.columnIndex==mouseDownColumnIndex&&
!(event.shiftKey | | event.ctrlKey)&&
event.column.ediate&&
!event.grid.dataGrid.itemEditorInstance)
{
event.grid.dataGrid.startItemEditorSession(event.rowIndex,event.columnIndex);
}
}

您应该使数据源可绑定

因此,在代码(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>

提供的代码绝对不完整。这就是一个例子


祝你好运。

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

数据网格是数据源的所有者,而不是GridItemRenderer。 因此,您不应该使用mouseDownEvents。(当通过单元格进行制表时会发生什么情况?)。您甚至可以考虑将这种业务逻辑从视图中移入控制器(或模型)。

对于您的示例,您确实不需要“奇特”的GridItemRenderer。一切都必须在数据网格之外进行计算

spark Datagrid有一个名为“gridItemEditorSessionSave”的事件

spark.components.DataGrid.GridItemEditor会话保存

在项目编辑器中的数据保存到数据中后调度 提供程序和编辑器已关闭

事件类型:spark.events.GridItemEditorEvent.GRID\u项目\u编辑器\u会话\u保存

语言版本:3.0

播放器版本:Flash 10,AIR 2.5

产品版本:Flex 4.5

就我个人而言,我将实现一个可绑定的ValueObject,并在IList实现中转换我的XMLList,例如和ArrayCollection,其中包含一组这些对象。示例如下:

[Bindable]
public class MyValueObject
{
   public var percentComplete:Number;
   public var weight:Number;

   public function get extension():Number
   {
      return percentComplete*weight;
   }
}
如果您使用这些ValueObject填充datagrid,您可以使用哑视图,甚至更好,您可以使用任何您喜欢的视图,而无需更改实际应用程序。(这不是OO编程的目的吗?)


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

我查看了gridItemEditorSessionSave事件,但我需要在网格中动态计算并显示这些字段,而不是在最后。我试图重现的功能类似于电子表格。我的示例将为您提供电子表格的功能。只有在编辑完单元格后,电子表格才会重新计算公式。如果您真的想在编辑PercentComplete ItemRenderer期间重新计算,您可以尝试使用KeyDown Eventlistener(它注册击键),但我个人建议不要这样做。
[Bindable]
public class MyValueObject
{
   public var percentComplete:Number;
   public var weight:Number;

   public function get extension():Number
   {
      return percentComplete*weight;
   }
}