0

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

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

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

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

关于如何解决这个问题的任何提示?

谢谢。

4

2 回答 2

0

尝试更新 addInfo() 如下:

    protected function addInfo():void {
        itens.addItem({a: '10', b: '20'});
        itens.refresh();
    }
于 2012-09-13T19:20:59.957 回答
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);
}
于 2012-09-14T14:03:27.703 回答