更新 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()
方法中。但是,问题仍然存在。 - 网格持有的对象共享相同的 static
KeyProvider
,并且此提供程序发送到网格的新值将与清除网格之前已经存在的值具有相同的键。这可能与它有关吗?
我意识到一个常见的答案可能是“我遇到了这个问题,然后我使用了 ListDataProvider 并修复了它”,但出于需要提出一个全新问题的原因,目前这是不可能的。
非常感谢任何帮助:)