0

画面に 2 つのフレックス データグリッドがあります。ユーザーは、いずれかのデータグリッドから 1 つ以上の行を選択し、それらを他のデータグリッドに移動できます。申し込み時に下のテーブルは空いています。例えば:

Item    Color   Price
--------------------
item57  red    $5.55
item62  blue   $5.29
item808 green  $2.21

Row  Item    Color   Price
---------------------------

一番下のデータグリッド (のみ) の行に番号を付ける列があることに注意してください。

アプリケーションに入って、たとえば上から下のグリッドに 3 行移動すると、行番号は問題ありません (行 1、2、および 3 が表示されます)。例えば:

Item    Color   Price
--------------------

Row  Item    Color   Price
---------------------------
1    item57  red    $5.55
2    item62  blue   $5.29
3    item808 green  $2.21

次に、たとえば、一番下のグリッドの行 1 を一番上に戻すと...

Item    Color   Price
--------------------
item57  red    $5.55

Row  Item    Color   Price
---------------------------
1    item62  blue   $5.29
2    item808 green  $2.21

そして、再び下のグリッドに戻ります...

Item    Color   Price
--------------------


Row  Item    Color   Price
---------------------------
1    item62  blue   $5.29
2    item808 green  $2.21
1    item57  red    $5.55

行番号は、リストの最後にある一番下のグリッドに挿入されるため、3 を表示するはずですが、これを行うと、(古い) 行番号の値 1 が表示されます。

デバッグして dataprovider = _myData を確認するとrowNumber、問題の行 (上記の項目 57 の場合) の値が 3 に等しいことがわかります (本来あるべき)。ただし、下位のデータグリッドには 1 として表示されます。

dataprovider の値は、DataGrid に表示されるものとどのように異なるのでしょうか?

[デバッグしてgridLower列情報を確認することもできます。また、問題のデータの正しい値 3 も表示rowNumberされます。]

下部のデータグリッドは次のようになります (カスタム itemRenderer を使用していますが、簡単にするためにここでは削除されています)。

[Bindable]
private var _myData:ListCollectionView=new ListCollectionView(new ArrayList());
...
<s:DataGrid dataProvider="{_myData}">
    <s:columns>
        <fx:Array>
            <s:GridColumn id="gridLower" headerText="myHeader" dataField="rowNumber"/>  
            ...

上のテーブルの行を下のテーブルに追加する関数は次のとおりです。

private function addRow():void {    
    var selectedIndices:Object=gridUpper.grid.selectedIndices;
    for (var i:int=selectedIndices.length-1;i>=0;i--) {
        var item:Object=_upperTableData.removeItemAt(selectedIndices[i]);
        item.rowNumber=_myData.length+1;
        _myData.list.addItem(item);
    } 
    // I tried adding "_myData.refresh();" here and it had no effect
    // I tried adding "ListCollectionView(gridLower.dataProvider).refresh();" and it had no effect
    // I tried adding "grid2.dataProvider.refresh();" here but it had no effect
}

UPDATE 1:下のテーブルの列を再ソートすると、正しい値が表示されます。このリンクで報告されていることを観察しているようです: http://www.barneyb.com/barneyblog/2007/06/23/another-flex-weirdnessgotcha/ まだ解決策を見つけていません。addRow()上記の関数の試行を参照してください。私は正しい軌道に乗っていますか?

更新 2: 手動で並べ替えを行うと下のグリッドのデータが修正されますが、これをプログラムで行う方法が見つかりませんでした。挿入してみました:

_myData.sort=null;
var complete:Boolean=_myData.refresh();

上記の機能が終了する直前ですaddRow()が、問題は解決しませんでした。デバッグ時completeは true ですが、下のグリッドには古いデータが表示されます。

4

2 に答える 2

1

新しい回答:)これが役立つ場合は、古い回答を削除します。

私はまだ Spark DataGrid を使用していませんが、リストのように動作することを期待していました。

DataGrid のこのメソッドのソースのいくつかのコメントでこれを見つけました:

public function invalidateCell(rowIndex:int, columnIndex:int):void

他の値に -1 を渡すことで、行/列全体を無効にすることができます。以下のドキュメントからの引用では、dataProvider.itemUpdated() も使用できます。

指定されたセルが表示されている場合は、再表示されます。variableRowHeight=true の場合、対応する行の高さが変わる可能性があります。columnIndex が -1 の場合、行全体が無効になります。同様に、rowIndex が -1 の場合、列全体が無効になります。

このメソッドは、指定されたセルの表示方法に何らかの影響を与える可能性のある、rowIndex のデータ プロバイダー アイテムの側面に変更がある場合に呼び出す必要があります。このメソッドの呼び出しは、dataProvider.itemUpdated() メソッドの呼び出しに似ています。このメソッドは、指定されたアイテムを表示するすべての行を再表示する必要があることをグリッドに通知します。この方法を使用すると、変更の範囲が 1 つのセルに限定されるため、比較的効率的です。

これで、コレクション (ArrayCollection、ListCollectionView) の itemUpdated() メソッドを実際に使用できる場所がわかりました。

[編集]

グリッドに ID を与えます:

<s:DataGrid id="lowerDataGrid" dataProvider="{_myData}">

addRow()コレクションを更新した後、メソッドでこれを実行できるはずです。

lowerDataGrid.invalidateCell(item.rowNmber -1, 1); // assuming rowNumbers are 0 based
于 2012-05-08T22:09:26.897 に答える
0

私の場合、グリッドを要素として含むメイン クラスで、すべてのセルを強制的に更新したいときはいつでも:

    gridsDataProvider.addItemAt(new Object(), 0);
    gridsDataProvider.removeItemAt(0);

しかし、GridItemRenderer はデータの変更に対応する必要があります。そこで、updateDisplay メソッドを作成しました。

        private function updateDisplay() : void {
            if (transWindow != null) {
                if (data == transWindow.total) {
                    if (field != "vat" && field != "total") {
                        textInput.visible = false;
                    } else {
                        line.visible = true;
                        textInput.enabled = false;
                        textInput.setStyle("fontWeight", "bold");
                        textInput.setStyle("fontSize", 14);
                    }
                } else {
                    line.visible = false;
                    textInput.visible = true;
                    textInput.enabled = true;
                    textInput.setStyle("fontWeight", "normal");
                    textInput.setStyle("fontSize", 12);
                }
            }
        }

このメソッドは、creationComplete ハンドラと ...

        protected function init(event:FlexEvent):void
        {
            getTransWindow(event.target.automationOwner);
            updateDisplay();
        }

... GridItemRenderer のデータ セッターと同様に

        override public function set data(v:Object):void {
            super.data = v;
            if (v == null) {
                textInput.text = "";
                return;
            }
            var value : * = v[field];
            if (value == null || value == undefined) {
                textInput.text = "";
                return;
            }
            if (value is Number)
                textInput.text = Number(value).toFixed(2);
            else
                textInput.text = ""+value;
            updateDisplay();
        }

私のレンダラーの mxml 本体は非常に単純です。

<s:Line id="line" width="100%" visible="false" yFrom="1" yTo="1">
    <s:stroke>
        <s:SolidColorStroke color="0" weight="0"/>
    </s:stroke>
</s:Line>
<s:TextInput id="textInput" y="2" restrict="0123456789." width="100%" height="100%" minWidth="10" borderVisible="false" textAlign="right"/>

おっと、ご参考までに、getTransWindow メソッドは、グリッドを含むメインの呼び出しクラスを取得するための単なるメソッドです。

private function getTransWindow(par : *) : void {
            if (transWindow != null)
                return;
            transWindow = par;
            while (!(transWindow is TransactionWindow)) {
                transWindow = transWindow.parent;
            }
        }

これが誰かの時間を節約することを願っています

よろしくクリスト

于 2014-02-09T15:48:03.497 に答える