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

トリッシュの答えは私をうまくいく解決策に導きました。DataGridには、editedItemPositionを変更する独自のitemEditBeginningリスナーがあります。最初に、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 に答える
0

次のように addInfo() を更新してみてください。

    protected function addInfo():void {
        itens.addItem({a: '10', b: '20'});
        itens.refresh();
    }
于 2012-09-13T19:20:59.957 に答える