2014-05-12 82 views
0

我正在使用smartgwt(不是付费的许可证版本),并且我有一个包含三个条目的listgrid。 键,值,重置。删除记录,然后立即取回

重置字段是一个按钮,应该重置对该值的任何更改,这里是我奋斗的地方。 我试图实现它那样简单

@Override 
public void onClick(ClickEvent event) 
{ 
    DataSource ds = this.grid.getDataSource(); 
    ds.removeData(record); 
    ds.fetchData(); 
    this.grid.redraw(); 
} 

电网是我ListGrid并记录已单击先复位行。

但是这只能删除条目,如果我重新加载(即使使用正确的值,因为这是我的服务器如果获取删除请求时会执行的操作),它仍会在那里,但我希望它在那之后立即出现我点击按钮,而不是点击了一下后。

我认为fetchData和重绘请求结合起来可以实现这个功能。

编辑:好一些更多的代码,这显示了我的ListGrid和RevertButton的构造函数,它应该删除并再次添加记录。

private static final String REVERT_NAME = "revertField"; 

    public MyListGrid(final String name) 
    { 
     this.setDataSource(PropertyListDS.getInstance(name); 

     ListGridField keyField = new ListGridField(ConfigurationDataSourceFields.PROPERTY_NAME, "Property"); 
     ListGridField valueField = new ListGridField(ConfigurationDataSourceFields.PROPERTY_VALUE, "Value"); 
     ListGridField revertField = new ListGridField(REVERT_NAME, "Revert to Default"); 

     valueField.setCanEdit(true); 

     this.setShowRecordComponents(true);   
     this.setShowRecordComponentsByCell(true); 

     this.setAutoFetchData(true); 

     this.setFields(keyField, valueField, revertField); 
    } 

    @Override 
    protected Canvas createRecordComponent(final ListGridRecord record, Integer colNum) 
    { 
     String fieldName = this.getFieldName(colNum); 
     Canvas canvas = null; 
     if (REVERT_NAME.equals(fieldName)) 
     { 
      canvas = new RevertButton(this, record); 
     } 
     return canvas; 
    } 

    private class RevertButton extends IButton implements ClickHandler 
    { 
     private final MyListGrid grid; 
     private final ListGridRecord record; 

     public RevertButton(final MyListGrid grid, final ListGridRecord record) 
     { 
      super(); 
      this.setTitle("Revert to Default"); 
      this.grid = grid; 
      this.record = record; 
      this.addClickHandler(this); 
     } 

     @Override 
     public void onClick(ClickEvent event) 
     { 
      DataSource ds = this.grid.getDataSource(); 
      ds.removeData(record); 
      ds.fetchData(); 
      this.grid.redraw(); 
     } 
    } 
+0

根据我的理解,从客户端作品中删除,但在服务器端没有更改? –

+0

它工作在两端,只是不是我想要的;)客户端没有看到变化,直到他在ui中点击了一下就是问题所在。 – Nozdrum

+0

所以你的意思是你有时间差距?潜伏 ? –

回答

2

用这种方式使用DSCallback

DataSource#removeData()是对服务器的异步调用。重新绘制网格,或者在从服务器获得该记录已在DSCallback中删除的响应后再次获取数据。

DataSource dataSource = grid.getDataSource(); 
dataSource.removeData(record,new DSCallback() { 

    @Override 
    public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest){ 
     Record[] records=dsResponse.getData();//deleted records 

     grid.fetchData();//fetch data again 
    } 
}); 

请在这个线程看看Removing local record from listGrid without committing

再次获取数据之前ListGrid#saveAllEdits()尝试。

您可以使用ListGrid#removeSelectedData()尝试从该组件中删除当前选定的记录。如果这是一个数据绑定网格,记录将直接从数据源中删除。