Java 替换整个列表时GWT DataGrid未正确覆盖行

Java 替换整个列表时GWT DataGrid未正确覆盖行,java,gwt,datagrid,Java,Gwt,Datagrid,更新2:回答了下面我自己的问题 更新:我已验证网格列中的getValue()方法是否返回了正确的值-数据库中的值,而不是本地编辑的值。换句话说,getValue返回的值不是DataGrid本身显示的值。是否有我没有更新/更新的内容?这怎么会发生 我有一个DataGrid,我正在使用setRowCount()和setRowData()方法更新它。网格中表示的对象是可变的,所有列都有相应的字段更新程序,它直接修改传递到数据网格的列表中的对象。当用户需要时,网格将重新填充新的数据库查询(以及与旧列

更新2:回答了下面我自己的问题


更新:我已验证网格列中的
getValue()
方法是否返回了正确的值-数据库中的值,而不是本地编辑的值。换句话说,
getValue
返回的值不是
DataGrid
本身显示的值。是否有我没有更新/更新的内容?这怎么会发生


我有一个
DataGrid
,我正在使用
setRowCount()
setRowData()
方法更新它。网格中表示的对象是可变的,所有列都有相应的
字段更新程序
,它直接修改传递到
数据网格
的列表中的对象。当用户需要时,网格将重新填充新的数据库查询(以及与旧列表完全不同的对象的新列表)

在我实现了对每行进行本地更改并在必要时提交这些更改之前,一切都很正常。当提交发生时,数据库将使用当前位于该行的对象中的值进行更新。如果修改了单元格但未启动提交,则会修改列表中的对象,但不会修改数据库

问题在于,出于某种原因,如果由
DataGrid
显示的当前列表包含本地未提交的值,则当刷新
DataGrid
时,它仍然包含未提交的本地值,而我希望这些值会还原为数据库值。设置为
DataGrid
的列表包含正确的数据库值,但由于某些原因,这些值被忽略。这些值仅在浏览器中刷新整个页面时更新为数据库值(当然,这会重新加载所有内容/清除内存等)

我正在使用的更新代码如下-我添加了一些可能不必要的步骤,但都没有用。无论我在输入列表上设置了什么,
DataGrid
都会显示本地值

private void update(List<TheObject> newRows) {
    // newRows contains the correct database-side committed values and none of the local, uncommitted values

    dataGrid.setRowCount(0, true);
    dataGrid.setRowData(java.util.Collections.<TheObject> emptyList());
    dataGrid.redraw();
    // at this point, dataGrid.getVisibleItems() returns an empty list

    dataGrid.setRowCount(newRows.size(), true);
    dataGrid.setRowData(newRows);
    dataGrid.redraw();
    // at this point, dataGrid.getVisibleItems() returns a list containing the database values and none of the local values, which is correct
}
private void更新(列出新行){
//新行包含正确的数据库端已提交值,而不包含任何本地未提交值
dataGrid.setRowCount(0,true);
setRowData(java.util.Collections.emptyList());
redraw();
//此时,dataGrid.getVisibleItems()返回一个空列表
dataGrid.setRowCount(newRows.size(),true);
dataGrid.setRowData(新行);
redraw();
//此时,dataGrid.getVisibleItems()返回一个包含数据库值但不包含任何本地值的列表,这是正确的
}
但是,一旦此方法完成,网格仍然显示未提交的本地值-尽管
getVisibleItems()
始终显示正确的数据库值,而不显示任何本地值。本质上,根据传递给
setRowData()
的列表,应该显示的内容与实际显示的内容之间存在明确的不匹配

还有其他几个重要/有趣的方面:

  • 新列表中包含的对象与旧列表中包含的对象实例完全不同
  • 如果在网格将行计数设置为零(导致空表)后,在
    update()
    方法期间引发未捕获异常,则下次成功调用该方法时,本地值将正确替换为数据库值
  • 基于以上内容,我尝试将网格清除后的所有代码放入
    schedulederferred()
    方法中。然而,这个问题仍然存在
  • 网格持有的对象共享相同的静态
    KeyProvider
    ,并且此提供程序发送到网格的新值将具有与清除网格之前已存在的值相同的键。这可能与此有关吗
我意识到一个常见的答案可能是“我有这个问题,然后我使用了一个ListDataProvider,它修复了它”,但由于一些原因,这将保证一个全新的问题,目前不可能实现


非常感谢任何帮助:)

问题似乎已经解决。为了获得正确的行为,我在每列的
FieldUpdater
中添加了对
dataGrid.redraw()
的调用。就这样

someColumn.setFieldUpdater(new FieldUpdater<TheObject, String>() {

    @Override
    public void update(int index, TheObject object, String value) {

        object.setSomeValue(value);
        dataGrid.redraw();
    }
});
someColumn.setFieldUpdater(新的FieldUpdater(){
@凌驾
公共无效更新(int索引、对象对象、字符串值){
object.setSomeValue(值);
redraw();
}
});
我不知道为什么这是必要的,但你说对了。对此有任何想法都将不胜感激,因为这让我对整个GWT有点不信任

感谢所有阅读此问题的人