2014-05-12 3 views
0

유료 라이센스 버전이 아닌 smartgwt를 사용하고 있으며 세 항목이있는 listgrid가 있습니다. 키, 값, 재설정.레코드를 삭제하고 즉시 다시 가져옵니다

리셋 필드는 값 변경을 재설정해야하는 버튼이며 여기서 내가 고심하는 곳입니다. 나는 reseted 할 클릭 된 행을 내 ListGrid되는 것이 간단

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

으로 그리드를 구현하고 기록하기 위해 노력했다.

이 항목 만 제거합니다. 다시로드하면 다시로드됩니다 (올바른 값으로도 제거 요청을 받으면 내 서버가 수행하므로 다시로드됩니다.)하지만 바로 그 뒤에 있습니다. 나는 버튼을 클릭하고 조금 클릭 한 후에는 클릭하지 않는다.

fetchData와 redraw 요청을 결합하여이를 수행한다고 가정했습니다.

편집 : 좋아, 좀 더 코드, 내 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

그것은 내가 원하는대로 양쪽 끝에서 작동;) 클라이언트가 주위에 비트를 클릭 할 때까지 클라이언트가 변경 사항을 보지 못합니다. 문제가 있습니다. – 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()을 사용하면이 구성 요소에서 현재 선택된 레코드를 제거 할 수 있습니다. 데이터 바인딩 된 표인 경우 레코드가 DataSource에서 직접 제거됩니다.

관련 문제