2012-04-23 38 views
2

我已經實現了一個可編輯網格,並且我使用了字段更新器來更新模型值。保存到數據庫不是問題,因爲我可以直接將整個模型保存到數據庫。問題是點擊取消或退出,我想恢復到舊值,但我無法實現相同。任何想法如何去做呢?GWT可編輯網格:如何從字段更新程序恢復更改?

注:每當更改完成我更新的模式

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

回答

1

看一看的Cell Sample in the Showcase後,它會將變化,並允許您將其「提交」到底層模型之後。取消更改將清除隊列爲每個編輯的項目在每個單元格上調用clearViewData以使其忘記編輯的值。

+0

我翻翻了那個例子。他們使用ContactInfo作爲默認的bean並在提交時更改其值。但我正在設置每個現場更新的模型值,並進一步處理genrics, Mygrid 擴展複合 在這種情況下,我們不能決定使用哪個模型並恢復更改 – 2012-04-24 03:59:16

0

您需要一個關鍵的提供商,並按照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"); 
    } 
2

我有類似的問題。當用戶改變這個值時,一個asyncCallback被髮送到服務器。如果成功更新數據提供者,如果失敗,則使用舊值更新數據提供者。 這似乎很容易......但是......表格沒有更新舊值。此外,即使它是成功的,文本框保持正確的值,但沒有按照預期從服務器格式化(這是一個雙倍,我希望看到小數)。所以這又是不正確的。

似乎可編輯的單元格沒有從AsyncDataProvider中更新。

解決方案非常簡單。 只需撥打clearviewData就可以對FieldUpdater每次更新 !!!這樣,我們確保單元顯示數據提供者的數據,而不是用戶輸入的內容。條目數據安全地存儲在數據提供器中。

希望它有幫助。

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)); 
    } 
}); 
相關問題