更换整个列表时,GWT DataGrid无法正确覆盖行

时间:2013-04-30 16:28:04

标签: java gwt datagrid

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


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


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

一切正常,直到我实现了进行本地每行更改的能力,然后在必要时提交它们。发生提交时,将使用当前位于该行的对象中的值更新数据库。如果修改了单元格但未启动提交,则会修改列表中保留的对象,但不会对数据库进行任何修改。

问题在于,由于某种原因,如果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
}

然而,一旦此方法完成,网格仍会显示未提交的本地值 - 尽管getVisibleItems()始终显示正确的数据库值而没有任何本地值。基本上,根据传递给setRowData()的列表显示的内容与实际显示的内容之间存在明确的错过匹配。

还有其他一些重要/有趣的观点:

  • 新列表中包含的对象与旧列表中包含的对象完全不同。
  • 如果在之后的update()方法期间抛出未捕获的异常,则网格将行计数设置为零(导致空表),当下一次成功调用该方法时,本地值被数据库值正确替换。
  • 基于以上所述,我尝试将网格清除后的所有代码放入scheduleDeferred()方法。但是,问题仍然存在。
  • 网格所拥有的对象共享相同的静态KeyProvider,并且此提供商发送给网格的新值与网格之前已存在的值具有相同的键被清除了。这可能与它有关吗?

我意识到一个常见的答案可能是“我遇到了这个问题,然后我使用了ListDataProvider并修复了它”,但是由于原因可以保证一个全新的问题,目前这是不可能的。

任何帮助非常感谢:)

1 个答案:

答案 0 :(得分:0)

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

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

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

        object.setSomeValue(value);
        dataGrid.redraw();
    }
});

我不知道为什么这是必要的,但你去了。对此的任何想法仍然会受到赞赏,因为它让我对整个GWT事情有点不信任......

感谢所有阅读此问题的人。