1

私は現在、RPC 呼び出しを介して GAE/Objectify バックエンドにバインドされた Gwt CellTable を使用しています。

大丈夫です!:-)

次に、列を並べ替えたいので、http://code.google.com/intl/it-IT/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSortingを読みます

非同期リモートの並べ替えセクションは、私の AsyncDataProvider に並べ替える方法を非常によく示していますが、ユーザーが並べ替えたい列の名前を取得するにはどうすればよいですか?

次のコードを示します。ColumnSortList sortList = table.getColumnSortList();

しかし、そこから文字列名を取得するにはどうすればよいでしょうか? 列がバインドされているフィールドの名前である「姓」または「soldDate」を知りたいだけです。次に、それを rpc サービスに渡し、それを使用してサーバー側でデータを並べ替えます。query(...).order(<field_name>)

何か不足していますか?

UPD : ここの興味深いもの: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/77a0eaf8086218a6/effb8d3abe69270b#effb8d3abe69270b

4

4 に答える 4

5

テーブルにあるように、列名のリストを並べて保持できます。

List<String> columnNames = new ArrayList<String>();

table.addColumn(surnameColumn, "surname");
columnNames.add("surname");

// add the other columns

次に、ソート列名を取得する必要がある場合:

String sortColumnName;
ColumnSortList sortList = table.getColumnSortList();
if (sortList != null && sortList.size() != 0){
     Column <MyEntity, ?> sortColumn = (Column <MyEntity, ?>) 
                                           sortList.get(0).getColumn();
     Integer columnIndex = table.getColumnIndex(sortColumn);
     sortColumnName = columnNames.get(columnIndex);
}

// do your rpc call

* MyEntity は、セル テーブルに表示されるデータ オブジェクトです。

于 2011-09-01T15:44:59.123 に答える
0

このようなものをアプリケーション列オブジェクトとして使用しました。

public class ScrollTableColumn {

    // --------------------------------------------------------------- Field(s)

    private int            sequence;
    private Column         column;
    private Header         header;
    private int            size;
    private int            calculatedSize;
    private boolean        show;
    private PartialColumn  partialColumn;
    private ColumnNameEnum columnName;

}

上記の HashMap を次のように作成します。

Map<Column, ScrollTableColumn> columnMap 
    = new HashMap<Column, ScrollTableColumn>();

ScrollTableColumn と columnMap の両方で作成したすべての列を追加します。

最後に、必要な名前を次のように取得できます。

ColumnSortList sortList = dataTable.getColumnSortList();
Column<?, ?> column = sortList.get(0).getColumn();
ColumnNameEnum = columnMap.get(column);
String name = ColumnNameEnum.getName();
于 2012-06-15T19:05:52.240 に答える
0

適切な方法は、セルのレンダリングをオーバーライドし、コンストラクターを介して列構成を渡し、最も重要なこととして、列のフィールド名を格納する場所である DataStoreName を設定できる基本列クラスを拡張することです。最後に、onrangechanged ファイアーを再利用するのではなく、オーバーライドして columnsort ハンドラーに直接アクセスする必要があります。範囲の変更と列の並べ替えハンドラーでは、グリッドを更新する必要がある何らかのタイプのメソッドを呼び出す必要があります。私は正気のために updateGrid と呼んでいます。これにより、非同期リクエストで使用されるグリッド パラメータを特定の並べ替え列と方向に設定できます。列の並べ替えハンドラーを使用する主な理由は、並べ替え方向の情報を含む ColumnSort イベントにアクセスすることです。

ベース GWT 列を拡張する列クラス。日付または数値列も拡張できます。

public GridStringColumn(String fieldName, String text, String tooltip, boolean defaultShown, boolean sortable, boolean hidden) {
        super(new TextCell());
        setDataStoreName(fieldName);
        this.text_ = text;
        this.tooltip_ = tooltip;
        this.defaultShown_ = defaultShown;
        setSortable(sortable);
        this.hidden_ = hidden;
    }

ハンドラーを作成する

dataGrid.addColumnSortHandler(new DataGridSortEvent());

あなたのソートイベントクラス

protected class DataGridSortEvent implements ColumnSortEvent.Handler {

        @Override
        public void onColumnSort(ColumnSortEvent event) {
            ColumnSortList sortList = dataGrid_.getColumnSortList();
            if (sortList != null && sortList.size() > 0) {
                Column<T, ?> sortColumn = (Column<T, ?>) sortList.get(0).getColumn();
                LOG.info("col_sorta: " + event.isSortAscending());
                LOG.info("col_index: " + sortColumn.getDataStoreName());
                updateDataList();
            }
        }
    }

updateDataList は、サーバー側に実際の AJAX 要求を行うために使用するメソッドです。ログを記録するのではなく、この情報をデータグリッド クラスのプライベート メンバーに格納して、リクエストがパラメータ化できるようにする必要があります。

updateDataList メソッドを呼び出すのではなく、サーバーからデータのコピーをローカルに作成し、そのキャッシュされたコレクションの並べ替えられたコレクションを返すだけで、ローカル キャッシュでもこれを機能させることができます。

文字列名だけの別のリストを保存する必要がなくなりました。これはメモリの無駄であり、列の順序がユーザーの操作などによって変更された場合の同期性の問題は言うまでもありません。

于 2012-08-13T16:15:00.970 に答える