Flex - DataGrid Edit - 允许在数据网格中编辑的错误或正确方法?

时间:2011-12-12 19:05:34

标签: flex events datagrid flash-builder

当我编辑网格的最后一行时,我的itemEditEnd事件方法被调用,但是我的ArrayCollection中的数据没有更新以反映所做的更改。所有其他列都可以工作,只是最后一列似乎有问题。我不确定这是一个错误,还是我需要做一些与众不同的事情? (Flash Builder 4.5 / Flex 4.5.1)

我有一个简单的可编辑DataGrid,它带有一个ArrayCollection,因为它是数据提供者。它填充,我可以编辑。我正在捕获itemEditEnd事件并从我的数组集中获取行以传回服务器:

public var _recs:ArrayCollection = new ArrayCollection;

<mx:DataGrid id="recsDG" dataProvider="{_recs}" 
                 editable="true" itemEditEnd="recsDG_itemEditEndHandler(event)">
        <mx:columns>
            <mx:DataGridColumn headerText="id" dataField="id" editable="false"/>
            <mx:DataGridColumn headerText="type" dataField="type"/>
... more columns ...
        </mx:columns>
    </mx:DataGrid>



protected function recsDG_itemEditEndHandler(event:DataGridEvent):void
        {
                    // THIS IS MY ARRAY COLLECTION/ROW(?):  _recs[event.rowIndex]
           }

如果我再次点击最后一列并再次更改它,我可以看到数组集合中的值现在已更改为我之前所做的更改。例如,当调试器跟踪时,假设我的原始值为“AAA”,我将其更改为“BBB”并按Tab键,在itemEditEnd的调试器中,它显示“AAA”(仅适用于此最后一列)。然后我将值更改为“CCC”和tab,在调试器中我看到“BBB”!

我还尝试了'event.currentTarget.itemEditorInstance.data'属性,并且也没有使用键入的新值进行更新。

作为临时解决方法,我在网格的末尾添加了一个可编辑的列,没有列标题,1像素宽。这似乎有效,当我退出时,现在它不再是最后一列,它似乎工作。虽然有点像kluge。

OH,我刚注意到,当我点击时,它们都没有更新,只有当我选中时!那是另一个问题??

1 个答案:

答案 0 :(得分:0)

确保您的数据提供者标记为[Bindable]。另外,在itemEditEnd处理程序方法中尝试_recs.refresh()。我在一个简单的项目中设置了下面的代码,它似乎工作正常(所有单元格在按Tab键后立即更新数组集合)。另外,我正在使用Flex 4.5.1 SDK。如果这不能解决您的问题,您可以发布您正在使用的完整代码,还是提供一个可以重现问题的示例应用程序?

<?xml version="1.0" encoding="utf-8"?>

    

</fx:Declarations>

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.DataGridEvent;

        [Bindable]
        public var _data:ArrayCollection = new ArrayCollection([
            {id:1,name:'Ted',pos:'Mgr'},
            {id:2,name:'Bob',pos:'Mgr'},
            {id:3,name:'Jeb',pos:'Mgr'}
        ]);

        protected function dg_itemEditEndHandler(event:DataGridEvent):void
        {
            _data.refresh();
        }

    ]]>
</fx:Script>

<s:Panel title="Halo DataGrid Control Example"
         width="75%" height="75%" 
         horizontalCenter="0" verticalCenter="0">
    <s:VGroup left="10" right="10" top="10" bottom="10">
        <s:Label width="100%" color="blue"
                 text="Select a row in the DataGrid control."/>

        <mx:DataGrid id="dg" width="100%" height="100%" rowCount="5" dataProvider="{_data}" editable="true" itemEditEnd="dg_itemEditEndHandler(event)">
            <mx:columns>
                <mx:DataGridColumn dataField="id" headerText="ID"/>
                <mx:DataGridColumn dataField="name" headerText="NAME"/>
                <mx:DataGridColumn dataField="pos" headerText="POSITION"/>
            </mx:columns>
        </mx:DataGrid>

        <mx:DataGrid id="dg2" width="100%" height="100%" rowCount="5" dataProvider="{_data}" editable="false" >
            <mx:columns>
                <mx:DataGridColumn dataField="id" headerText="ID"/>
                <mx:DataGridColumn dataField="name" headerText="NAME"/>
                <mx:DataGridColumn dataField="pos" headerText="POSITION"/>
            </mx:columns>
        </mx:DataGrid>
    </s:VGroup>
</s:Panel>