2

我已经实现了一个可编辑的网格,并且我使用了一个字段更新器来更新模型值。保存到数据库不是问题,因为我可以直接将整个模型保存到数据库中。问题在于单击取消或转义,我想恢复到旧值,但我无法实现相同的目标。任何想法如何去做?

注意: 每当更改完成时,我都会更新模型

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();
  }
});
4

3 回答 3

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));
    }
});
于 2013-05-30T12:28:28.267 回答
1

看看Showcase 中的 Cell Sample,它将更改排队并允许您之后将它们“提交”到底层模型。取消更改将是清除队列为每个已编辑项目调用clearViewData每个单元格以使其忘记已编辑值的问题。

于 2012-04-23T11:28:18.313 回答
0

您需要一个密钥提供者和clearViewDataThomas 建议的呼叫。我在某处读到,如果您没有密钥提供程序,您可以使用该值作为密钥,但这对我不起作用。

  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");
  }
于 2012-12-12T18:38:06.250 回答