フレックス - 行のラベルでdatagrid列を並べ替える
-
29-09-2019 - |
質問
MySQLデータベースから情報を表示するテーブルを作成しています。外国キーをあらゆる場所で使用してデータを相互参照しています。
基本的に、「System」という名前の列のあるDatagridがあります。システムはです int それはを表します ID 別のテーブルのオブジェクトの。私は使用しました LableFunction 2つを相互参照し、列の名前を変更します。しかし、ソートは機能しませんが、カスタムソート機能を作成する必要があることを理解しています。私は2つのテーブルを再び相互参照しようとしましたが、1200行を並べ替えるには〜30秒かかります。今、私は次に試してみるべきことについて無知です。
ソート関数内の列フィールドラベルにアクセスする方法はありますか?
public function order(a:Object,b:Object):int
{
var v1:String = a.sys;
var v2:String = b.sys;
if ( v1 < v2 ){
trace(-1);
return -1;
}else if ( v1 > v2 ){
trace(1);
return 1;
}else {
trace(0);
return 0;
}
}
解決
これを処理する1つの方法は、受け取ったオブジェクトを通過し、相互参照されたIDに基づいてそれぞれのプロパティとしてラベルを追加することです。次に、ラベル関数を使用する代わりに、データグリッド列に表示するラベルプロパティを指定できます。そうすれば、独自のソート関数を作成する必要があるのではなく、期待どおりにソートを取得できます。
他のヒント
Datagridsやその他のリストベースのクラスが機能する方法は、ItemRenderersを使用することです。レンダラーは、画面に表示されるデータに対してのみ作成されます。ほとんどの場合、DataProviderには画面に表示されるものよりも多くのデータがあります。
Datagridによって表示されたものに基づいてデータを並べ替えようとすると、おそらくあなたが望む結果が得られないでしょう。
ただし、SortFunctionのデータオブジェクトに同じラベル関数を呼び出すことができない理由はありません。
1つの方法は、DatagridのItemTolabel関数を使用することです。
var v1:String = dataGrid.itemToLabel(a);
var v2:String = dataGrid.itemToLabel(b);
2番目の方法は、LabElfunctionを明示的に呼び出すことです。
var v1:String = labelFunction(a);
var v2:String = = labelFunction(b);
私の経験では、ソートは非常に迅速であることがわかりましたが、レコードセットは、私が通常メモリにロードするものよりもわずかに大きくなります。