GWT可编辑网格:如何从字段更新程序恢复更改?

时间:2012-04-23 08:30:10

标签: gwt datagrid

我已经实现了一个可编辑的网格,我使用了字段更新程序来更新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();
  }
});

3 个答案:

答案 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");
  }