1

DataSource で SmartGWT ListGrid を使用しています。CellFormatter を使用して、ファイルサイズの数値データを混合テキスト/データ (つまり、10737418240 ではなく「10 GB」) として表示することに成功しています。フィルタリングを設定しました。

私がやりたいことは、基になるデータではなく、CellFormatter 出力でユーザーがフィルター処理できるようにすることです。IOW、ユーザーがフィルター ボックスに「GB」と入力すると、サイズが GB 範囲内のすべてのファイルが取得されます。DataSource はローカルにキャッシュされるため、サーバーに戻ってデータを取得することに問題はありません。

編集: CellFormatter を使用している理由は、並べ替えを正しくしたいからです。IOW を昇順で並べ替えると、200 KB が 10 GB の後ではなく 10 GB の前に来ます (テキストの並べ替えでは逆になります)。並べ替えはフィルタリングよりも重要なので、並べ替えとフィルタリングの両方でデータの同じ表現をターゲットにする必要がある場合は、フィルタリングの作業をあきらめます。

どんな助けでも大歓迎です。ありがとう、グレッグ

4

1 に答える 1

2

これを行うには 2 つのオプションがあります。まず、データソースから既に変更された値を返すため、10737418240 の代わりに「10 GB」の文字列値を返す必要があります。

私には 2 番目のアプローチの方が適しているようです。SimpleType 機能を使用する必要があります。あなたのための例があります:

public class PopulationType extends SimpleType {

    public PopulationType() {
        super("population", FieldType.TEXT);
        // format values in the grid
        this.setSimpleTypeValueExtractor(new SimpleTypeValueExtractor() {
            @Override
            public Object getAtomicValue(Object value) {
                if (value instanceof Integer && ((Integer) value) > 1000000) {
                    return ((Integer) value) / 1000000 + " Mln";
                }
                return "" + value;
            }
        });
    }
}

public void onModuleLoad() {
    final ListGrid countryGrid = new ListGrid();  
    countryGrid.setWidth100();
    countryGrid.setHeight100();
    countryGrid.setAutoFetchData(true);
    countryGrid.setShowFilterEditor(true);
    countryGrid.setShowAllRecords(true);
    WorldXmlDS ds = WorldXmlDS.getInstance();
    ds.getField("population").setType(new PopulationType());
    countryGrid.setDataSource(ds);
    countryGrid.draw();
}

SimpleType インスタンスをフォーマットするフィールドに設定し、SimpleTypeValueExtractor を設定して、表示、フィルタリング、並べ替えに使用される getAtomicValue をオーバーライドします。

オーバーライドできるメソッドは他にもあります。たとえば、グリッドの値を編集する必要がある場合は、SimpleTypeValueUpdater も設定する必要があります。

于 2014-08-13T09:08:48.080 に答える