【问题标题】:GWT Editable Grid : How to revert back changes from field updater?GWT 可编辑网格:如何从字段更新程序恢复更改?
【发布时间】:2012-04-23 08:30:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: gwt datagrid


    【解决方案1】:

    我遇到了类似的问题。当用户更改值时,向服务器发送一个 asyncCallback。如果成功更新数据提供者,如果失败,使用旧值更新数据提供者。 这似乎很容易......但是......该表没有用旧值更新。此外,即使成功,文本框仍保持正确的值,但未按照服务器的预期格式化(它是双精度值,我希望看到小数)。所以又错了。

    似乎没有从 AsyncDataProvider 更新可编辑单元格。

    解决方案非常简单。 每次更新 FieldUpdater 时只需调用 clearViewData !!!这样,我们确保单元格显示来自数据提供者的数据,而不是用户输入的数据。入口数据安全地存储在 dataprovider 中。

    希望对你有帮助。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我浏览了那个例子。他们使用 ContactInfo 作为默认 bean,并在提交时更改其值。但是我在每个字段更新时设置模型值,并且我正在处理泛型,Mygrid 扩展复合在这种情况下,我们无法决定使用哪个模型并恢复更改
      【解决方案3】:

      正如 Thomas 建议的那样,您需要一个密钥提供程序和电话 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");
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        相关资源
        最近更新 更多