手动设置页面后 GWT DataGrid getRowElement 抛出 IndexOutOfBoundsException

GWT DataGrid getRowElement throwing IndexOutOfBoundsException after manually setting the page

这个问题 almost 但与 GWT CellTable getRowElement throwing IndexOutOfBoundsException 不完全相同,但是那里接受的答案对我不起作用。

我正在尝试让 DataGrid 显示与当前视图不同的行和单元格。有时这可能在同一页上,但大多数情况下不是。如果该行在当前页面上——第一页或手动分页到的页面——然后使用 getRowElement(rowIdx - pageStart) 获取该行,按照上面提到的答案。

但是,如果行不在当前页面上,我找不到获取行元素的方法。

我已经尝试计算适当的页面并使用 SimplePager.setPage() 设置页面,然后尝试使用实际行索引或基于页面开始的索引(以及尝试之前的页面和之后的页面,只是为了更好的衡量。)所有失败并出现 IndexOutOfBoundsExceptions。我尝试在设置页面后强制触发 RangeChangedEvent,但这没有任何区别(除了两次获取该范围的数据。)

我也试过不设置页面并尝试获取行元素,但是尝试获取实际索引失败了,因为它不在当前页面上,否则您会使用什么其他索引?

我在 Eclipse + Chrome.

的 Tomcat 容器和 SuperDevMode 中使用 GWT 2.8.1 和 运行

我错过了什么?

谢谢, 莱纳斯

示例日志输出如下:

Set page from 0 to 7
scrollRow:366, scrollCol:4
currentPage:7, start: 350, size: 50
Range start: 350, length:50
getRow:366
java.lang.IndexOutOfBoundsException: Row index: 366, Row size: 2088
getRow:16
java.lang.IndexOutOfBoundsException: Row index: 16, Row size: 2088
getRow:316, // try previous page
java.lang.IndexOutOfBoundsException: Row index: 316, Row size: 2088
getRow:416, // try next page
java.lang.IndexOutOfBoundsException: Row index: 416, Row size: 2088
page:7, rowIdx:366, showRow:366, colIdx: 4 : java.lang.IndexOutOfBoundsException: Row index: 416, Row size: 2088

为了提供上下文,生成此代码的代码是

    if ( cPage != showPage ) {
        GWT.log("Set page from " + cPage + " to " + showPage);
        gridPager.setPage(showPage);
    } 
    GWT.log("scrollRow:" + scrollToRow + ", scrollCol:"+ scrollToCol);
    GWT.log("currentPage:"+ gridPager.getPage() + ", start: " + gridPager.getPageStart() + ", size: "+ gridPager.getPageSize());
    Range range = dataGrid.getVisibleRange();
    int start = range.getStart();
    GWT.log("Range start: "+ range.getStart() + ", length:" + range.getLength());
    TableRowElement row;
    try { 
        int getRow = rowIdx;
        GWT.log("getRow:"+getRow);
        row = dataGrid.getRowElement(getRow);
    } catch (IndexOutOfBoundsException iob0 ) {
        GWT.log(String.valueOf(iob0));
        try { 
            int getRow = rowIdx-start;
            GWT.log("getRow:"+getRow);
            row = dataGrid.getRowElement(getRow);
        } catch (IndexOutOfBoundsException iob1 ) {

    <snip>

    TableCellElement cell = row.getCells().getItem(colIdx);
    cell.scrollIntoView();

万一有人发现自己在这里:

GWT 用户组的 Thomas Broyer 让我直言不讳:

即使 dataGrid 说它有行,数据分页器实际上并没有提取行。

https://groups.google.com/forum/#!topic/google-web-toolkit/7J8H8yhV_CM

我必须设置一个延续以允许进行提取,然后检索该行以便我可以滚动到它。