向mx DataGrid添加新行时出现问题

时间:2012-09-13 14:24:56

标签: actionscript-3 flex flex3

我正在使用mx:DataGrid,我无法改变为spark(这是一个遗留项目)。 DataGrid是可编辑的,当用户进入最后一列时,我想添加一个新列并在新行的第一列中启动编辑模式。我可以做这个。

我的问题是有时最后一列无法编辑,所以我添加了一个itemEditBeginning监听器来停止编辑并添加新行。那是我的问题。当用户进入最后一个字段时,会添加新行但我看不到它。我必须单击列标题来对datagrid数据进行排序,然后出现新行。这是一种延迟。

我的代码更大,但这个简单的代码可以重现同样的问题:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           creationComplete="application1_creationCompleteHandler(event)"
           minWidth="955" minHeight="600">
    <fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.CollectionEvent;
        import mx.events.CollectionEventKind;
        import mx.events.DataGridEvent;
        import mx.events.FlexEvent;

        [Bindable] public var itens:ArrayCollection;

        protected function application1_creationCompleteHandler(event:FlexEvent):void {
            itens = new ArrayCollection();
            itens.addEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChange);

            itens.addItem({a: '1', b: '2'});
        }

        protected function onCollectionChange(event:CollectionEvent):void {
            if (event.kind == CollectionEventKind.ADD) {
                var row:int = itens.length - 1;
                var column:int = 0;
                var args:Array = [row, column];
                callLater(moveTo, args);
            }
        }

        protected function moveTo(row:int, col:int):void    {
            itensDg.editedItemPosition = { rowIndex:row, columnIndex:col };
        }

        protected function addInfo():void {
            itens.addItem({a: '10', b: '20'});
        }

        protected function itensDg_itemEditBeginningHandler(event:DataGridEvent):void {
            if (event.columnIndex == 1) {
                event.preventDefault();
                addInfo();
            }
        }

    ]]>
    </fx:Script>

    <mx:DataGrid id="itensDg" dataProvider="{itens}" editable="true" 
             itemEditBeginning="itensDg_itemEditBeginningHandler(event)" />
</s:Application>

有关如何解决此问题的任何提示?

感谢。

2 个答案:

答案 0 :(得分:0)

尝试按如下方式更新addInfo():

    protected function addInfo():void {
        itens.addItem({a: '10', b: '20'});
        itens.refresh();
    }

答案 1 :(得分:0)

Trish的回答让我找到了一个有效的解决方案。 DataGrid有自己的itemEditBeginning侦听器,可以修改editedItemPosition。首先,我试图阻止itemEditBeginning事件的传播,但我意识到一些焦点和鼠标事件也修改了editItemPosition。因此,项目已添加到数组中,我的onCollectionChange侦听器被调用,但其他事件稍后修改了editedItemPosition。

因此,我没有更改CollectionEvent侦听器中的editedItemPosition,而只是在添加元素后更改了它:

protected function addInfo():void {
    itens.addItem({a: '10', b: '20'});
    var row:int = itens.length - 1;
    var column:int = 0;
    var args:Array = [row, column];
    callLater(moveTo, args);
}