我已经实现了一个可编辑的网格,我使用了字段更新程序来更新Model值。保存到数据库不是问题,因为我可以直接将整个模型保存到数据库。问题是单击取消或转义,我想恢复旧值,但我无法实现相同。任何想法如何去做?
注意: 每当更改完成后我都会更新模型
1)我不想在点击取消时进行另一次异步调用。
2)我真的想避免克隆和存储机制。
我目前正在使用GWT 2.4.0
column.setFieldUpdater(new FieldUpdater<Abc, String>() {
@Override
public void update(Abc object, String value) {
object.set(value);
table.redraw();
}
});
答案 0 :(得分:3)
我有类似的问题。当用户更改了值时,会将asyncCallback发送到服务器。如果成功更新数据提供程序,如果失败,请使用旧值更新数据提供程序。 这看起来很简单......但......表没有用旧值更新。此外,即使它是成功的,文本框保持正确的值,但没有按预期从服务器格式化(它是一个双倍,我希望看到小数)。所以这又是不正确的。
似乎可编辑单元格未从AsyncDataProvider更新。
解决方案非常简单。 只需在FieldUpdater的每次更新时调用 clearViewData !这样,我们确保单元格显示数据提供者的数据,而不是用户输入的数据。输入数据安全地存储在数据提供者中。
希望它有所帮助。
column.setFieldUpdater(new FieldUpdater<SQLRow, String>() {
@Override
public void update(int index, SQLRow sqlRow, String value) {
updaterCaller.call(index, fi, sqlRow, value);//Your async method...do mind my params
((EditTextCell)columnFinal.getCell()).clearViewData(sqlTable.getKeyProvider().getKey(sqlRow));
}
});
答案 1 :(得分:1)
查看Cell Sample in the Showcase,它会对更改进行排队,然后允许您将它们“提交”到底层模型。取消更改将是清除队列和在每个单元格上为每个已编辑的项目调用clearViewData
,以使其忘记编辑的值。
答案 2 :(得分:0)
你需要一个密钥提供者和托马斯建议的电话clearViewData
。
我在某处读到,如果你没有密钥提供者,你可以使用该值作为密钥,但这对我不起作用。
private static final int MAX_AGE = 150;
private static class Contact {
public String name;
public String address;
public int age;
}
private static final ProvidesKey<Contact> KEY_PROVIDER = new ProvidesKey<Contact>() {
@Override
public Object getKey(Contact row) {
return row.name; // assuming names are unique
}
};
public void onModuleLoad() {
table = new CellTable<Contact>(KEY_PROVIDER);
....
final TextInputCell ageCell = new TextInputCell();
Column<Contact, String> ageColumn = new Column<Contact, String>(ageCell) {
@Override
public String getValue(Contact row) {
return String.valueOf(row.age);
}
};
ageColumn.setFieldUpdater(new FieldUpdater<Contact, String>() {
@Override
public void update(int index, Contact row, String value) {
try {
int intVal = Integer.parseInt(value.trim());
if (intVal < 0 || intVal > MAX_AGE) {
throw new NumberFormatException();
}
row.age = intVal;
} catch (NumberFormatException e) {
ageCell.clearViewData(KEY_PROVIDER.getKey(row));
}
table.redraw();
}
});
...
table.addColumn(ageColumn, "Age");
}