画面に 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 ですが、下のグリッドには古いデータが表示されます。