手动设置页面后GWT DataGrid getRowElement引发IndexOutOfBoundsException

手动设置页面后GWT DataGrid getRowElement引发IndexOutOfBoundsException,gwt,Gwt,这个问题几乎是相同的,但不是完全相同,但是被接受的答案对我来说并不适用 我试图让DataGrid显示与当前视图不同的行和单元格。有时,这可能是同一页,大多数情况下不是。如果该行位于当前页面上(第一页或手动分页到的页面),则使用getRowElement(rowIdx-pageStart)获取该行是有效的,如上面提到的答案所示 但是,如果该行不在当前页面上,则无法获取row元素 我尝试过计算适当的页面,并使用SimplePage.setPage()设置页面,然后尝试使用实际的行索引或基于页面开始的

这个问题几乎是相同的,但不是完全相同,但是被接受的答案对我来说并不适用

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

但是,如果该行不在当前页面上,则无法获取row元素

我尝试过计算适当的页面,并使用SimplePage.setPage()设置页面,然后尝试使用实际的行索引或基于页面开始的索引获取行元素(以及尝试之前的页面和之后的页面,只是为了更好的衡量)。所有这些都会因IndexOutofBoundsException而失败。我曾尝试在设置页面后强制触发RangeChangeEvent,但这没有什么区别(除了两次获取该范围的数据)

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

我正在使用GWT2.8.1,并在Tomcat容器和Eclipse+Chrome中的SuperDevMode中运行

我错过了什么

谢谢, 莱纳斯

下面是日志输出示例:

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();
if(cPage!=showPage){
GWT.log(“将页面从“+cPage+”设置为“+showPage”);
gridPager.setPage(显示页面);
} 
log(“scrollRow:+scrollToRow+”,scrollCol:+scrollToCol);
log(“当前页面:“+gridPager.getPage()+”,开始:“+gridPager.getPageStart()+”,大小:“+gridPager.getPageSize()”);
Range Range=dataGrid.getVisibleRange();
int start=range.getStart();
log(“范围开始:“+Range.getStart()+”,长度:“+Range.getLength());
TableRowElement行;
试试{
int getRow=rowIdx;
GWT.log(“getRow:+getRow”);
row=dataGrid.getRowElement(getRow);
}捕获(IndexOutOfBoundsException iob0){
GWT.log(String.valueOf(iob0));
试试{
int getRow=rowIdx start;
GWT.log(“getRow:+getRow”);
row=dataGrid.getRowElement(getRow);
}捕获(IndexOutOfBoundsException iob1){
TableCellElement cell=row.getCells().getItem(colIdx);
cell.scrollIntoView();

如果有人发现自己在这里:

GWT用户组的Thomas Broyer让我明白了:

尽管dataGrid说它有行,但数据寻呼机实际上并没有获取行

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