2012-04-23 13 views
2

私は編集可能なグリッドを実装しており、フィールド値を更新するためにフィールド値を使用しました。モデル全体を直接データベースに保存できるので、データベースに保存することは問題ではありません。キャンセルまたはエスケープをクリックすると問題が発生します。元の値に戻したいのですが、これを達成することはできません。どのようにそれについて行くすべてのアイデア?GWT Editable Grid:フィールドアップデータからの変更を元に戻すにはどうすればいいですか?

注:変更が行われているときはいつでも私がモデルに

1を更新しています)私は、[キャンセル]をクリックの上に別の非同期呼び出しを行う必要はありません。

2)私は本当にクローニングと保存メカニズムを避けたいです。

私は現在Cell Sample in the Showcaseを見てくださいGWT 2.4.0に

column.setFieldUpdater(new FieldUpdater<Abc, String>() { 
    @Override 
    public void update(Abc object, String value) { 
    object.set(value); 
    table.redraw(); 
    } 
}); 

答えて

1

を使用しています、それは変更をキューに入れ、あなたが、その後基礎となるモデルにそれらを「コミット」することができます。変更を取り消すには、編集された項目ごとに各セルのを呼び出してclearViewDataを呼び出して編集した値を忘れることになります。

+0

この例を調べました。彼らはContactInfoをデフォルトのBeanとして使用しており、コミット時にその値を変更しています。しかし、私は各フィールド更新のモデル値を設定しており、さらに私はgenricを扱っています Mygrid コンポジット拡張 この場合、使用するモデルを決定して変更を元に戻すことはできません –

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

私は同様の問題がありました。ユーザーが値を変更すると、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)); 
    } 
}); 
関連する問題