1

我目前正在使用 Gwt CellTable,通过 RPC 调用绑定到我的 GAE/Objectify 后端。

现在好了!:-)

然后我想对列进行排序,所以我阅读了http://code.google.com/intl/it-IT/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting

异步远程排序部分很好地展示了如何对我的 AsyncDataProvider 进行排序,但是......我如何检索用户想要排序的列的名称?

它显示了这段代码:ColumnSortList sortList = table.getColumnSortList();

但是我怎样才能从中获得字符串名称呢?我只是想知道“surname”或“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 回答
1

聚会有点晚了,但这里有一个基于当前文档的更直接的解决方案(请参阅“使用 AsyncDataProvider 进行列排序”部分)。

当我们添加列时,我们可以简单地设置dataStoreName

TextColumn<MyData> surname = new TextColumn<MyData>() {
    ...
}
surname.setSortable(true);
surname.setDataStoreName("surname");  // Set the column name
table.getColumnSortList().push(surname);
table.addColumn(surname, "Last Name");  // eg. A different name for the UI

然后我们可以dataStoreName稍后在排序时检索该列:

@Override
protected void onRangedChanged(HasData<MyData> display) {
    ...
    ColumnSortList.ColumnSortInfo info = table.getColumnSortList().get(0);
    String sortColumn = info.getColumn().getDataStoreName();  // Get the column name
    boolean sortIsAscending = info.isAscending();

    rpcService.requestMyData(
        sortColumn,
        sortIsAscending,
        new AsyncCallback<ArrayList<MyData>>() {...}
    );
    ...
}

使用这种方法,我们可以将列名直接传递给我们的 RPC 方法。它甚至允许我们使用与 UI/客户端使用的列名不同的名称(例如数据库列名)。

于 2018-06-20T20:42:51.353 回答
0

我已经使用这样的东西作为应用程序列对象。

公共类 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 回答