2011-01-19 31 views
7

Tôi gặp sự cố với ràng buộc nguồn dữ liệu trong ListGrid với smartGWT. Tôi có GWT-RPC-DataSource và tôi đã thiết lập nó như là nguồn dữ liệu của tôiSMARTGWT DataSource (GWT-RPC-DATASource) LISTGRID

grid.setDataSource(ds); 

Trên một nút bấm Tôi có một số thay đổi trong nguồn dữ liệu của tôi và tôi đang tạo ra nguồn dữ liệu mới và rebinding với lưới smartgwt của. nhưng nó không thành công. Tôi đã thử chức năng grid.redraw() để vẽ lại lưới.

Dưới đây là lớp học của tôi cho GWTRPCDATASOURCE

public abstract class GwtRpcDataSource extends DataSource { 

    /** 
    * Creates new data source which communicates with server by GWT RPC. It is 
    * normal server side SmartClient data source with data protocol set to 
    * <code>DSProtocol.CLIENTCUSTOM</code> ("clientCustom" - natively supported 
    * by SmartClient but should be added to smartGWT) and with data format 
    * <code>DSDataFormat.CUSTOM</code>. 
    */ 
    public GwtRpcDataSource() { 
     setDataProtocol(DSProtocol.CLIENTCUSTOM); 
     setDataFormat(DSDataFormat.CUSTOM); 
     setClientOnly(false); 
    } 

    /** 
    * Executes request to server. 
    * 
    * @param request 
    *   <code>DSRequest</code> being processed. 
    * @return <code>Object</code> data from original request. 
    */ 
    @Override 
    protected Object transformRequest(DSRequest request) { 
     String requestId = request.getRequestId(); 
     DSResponse response = new DSResponse(); 
     response.setAttribute("clientContext", 
       request.getAttributeAsObject("clientContext")); 
     // Asume success 
     response.setStatus(0); 
     switch (request.getOperationType()) { 
     case FETCH: 
      executeFetch(requestId, request, response); 
      break; 
     case ADD: 
      executeAdd(requestId, request, response); 
      break; 
     case UPDATE: 
      executeUpdate(requestId, request, response); 
      break; 
     case REMOVE: 
      executeRemove(requestId, request, response); 
      break; 
     default: 
      // Operation not implemented. 
      break; 
     } 
     return request.getData(); 
    } 

    /** 
    * Executed on <code>FETCH</code> operation. 
    * <code>processResponse (requestId, response)</code> should be called when 
    * operation completes (either successful or failure). 
    * 
    * @param requestId 
    *   <code>String</code> extracted from 
    *   <code>DSRequest.getRequestId()</code>. 
    * @param request 
    *   <code>DSRequest</code> being processed. 
    * @param response 
    *   <code>DSResponse</code>. <code>setData (list)</code> should be 
    *   called on successful execution of this method. 
    *   <code>setStatus (&lt;0)</code> should be called on failure. 
    */ 
    protected abstract void executeFetch(String requestId, DSRequest request, 
      DSResponse response); 

    /** 
    * Executed on <code>ADD</code> operation. 
    * <code>processResponse (requestId, response)</code> should be called when 
    * operation completes (either successful or failure). 
    * 
    * @param requestId 
    *   <code>String</code> extracted from 
    *   <code>DSRequest.getRequestId()</code>. 
    * @param request 
    *   <code>DSRequest</code> being processed. 
    *   <code>request.getData()</code> contains record should be 
    *   added. 
    * @param response 
    *   <code>DSResponse</code>. <code>setData (list)</code> should be 
    *   called on successful execution of this method. Array should 
    *   contain single element representing added row. 
    *   <code>setStatus (&lt;0)</code> should be called on failure. 
    */ 
    protected abstract void executeAdd(String requestId, DSRequest request, 
      DSResponse response); 

    /** 
    * Executed on <code>UPDATE</code> operation. 
    * <code>processResponse (requestId, response)</code> should be called when 
    * operation completes (either successful or failure). 
    * 
    * @param requestId 
    *   <code>String</code> extracted from 
    *   <code>DSRequest.getRequestId()</code>. 
    * @param request 
    *   <code>DSRequest</code> being processed. 
    *   <code>request.getData()</code> contains record should be 
    *   updated. 
    * @param response 
    *   <code>DSResponse</code>. <code>setData (list)</code> should be 
    *   called on successful execution of this method. Array should 
    *   contain single element representing updated row. 
    *   <code>setStatus (&lt;0)</code> should be called on failure. 
    */ 
    protected abstract void executeUpdate(String requestId, DSRequest request, 
      DSResponse response); 

    /** 
    * Executed on <code>REMOVE</code> operation. 
    * <code>processResponse (requestId, response)</code> should be called when 
    * operation completes (either successful or failure). 
    * 
    * @param requestId 
    *   <code>String</code> extracted from 
    *   <code>DSRequest.getRequestId()</code>. 
    * @param request 
    *   <code>DSRequest</code> being processed. 
    *   <code>request.getData()</code> contains record should be 
    *   removed. 
    * @param response 
    *   <code>DSResponse</code>. <code>setData (list)</code> should be 
    *   called on successful execution of this method. Array should 
    *   contain single element representing removed row. 
    *   <code>setStatus (&lt;0)</code> should be called on failure. 
    */ 
    protected abstract void executeRemove(String requestId, DSRequest request, 
      DSResponse response); 

    private ListGridRecord getEditedRecord(DSRequest request) { 
     // Retrieving values before edit 
     JavaScriptObject oldValues = request 
       .getAttributeAsJavaScriptObject("oldValues"); 
     // Creating new record for combining old values with changes 
     ListGridRecord newRecord = new ListGridRecord(); 
     // Copying properties from old record 
     JSOHelper.apply(oldValues, newRecord.getJsObj()); 
     // Retrieving changed values 
     JavaScriptObject data = request.getData(); 
     // Apply changes 
     JSOHelper.apply(data, newRecord.getJsObj()); 
     return newRecord; 
    } 

} 

tôi đã thực hiện lớp trừu tượng này đến lớp nguồn dữ liệu của riêng tôi đặt tên NTDatasource.

public class NTDataSource extends GwtRpcDataSource { 

    public static int total = 991; 
    Record[] records; 
    public NTDataSource() {    
    } 

    public void setData(List<NTListGridField> lstFields, Record[] records) { 
//  setTestData(records); 
     for (NTListGridField lstField : lstFields) { 
      if (lstField.getType() == ListGridFieldType.DATE) { 
       DataSourceDateField dateField = new DataSourceDateField(
         lstField.getName()); 
       dateField.setHidden(lstField.getAttributeAsBoolean("visible")); 
       if (lstField.getName().equals("id")) { 
        dateField.setHidden(true); 
       } 

       addField(dateField); 

      } else { 
       DataSourceTextField textField = new DataSourceTextField(
         lstField.getName()); 
       textField.setHidden(lstField.getAttributeAsBoolean("visible")); 
       if (lstField.getName().equals("id")) { 
        textField.setHidden(true); 
        textField.setPrimaryKey(true); 
       } 
       addField(textField); 
      } 
     } 
     total = records.length; 
     this.records = records; 
    } 

    @Override 
    protected void executeFetch(String requestId, DSRequest request, 
      DSResponse response) { 
     // assume we have 1000 items. 
     response.setTotalRows(total); 
     int end = request.getEndRow(); 
     if (end > total) { 
      end = total; 
     }  
     Record returnRecords[] = new Record[end 
       - request.getStartRow()]; 
     for (int i = request.getStartRow(); i < end; i++) { 
      ListGridRecord r = new ListGridRecord();  
      r = (ListGridRecord) records[i]; 
      returnRecords[i - request.getStartRow()] = r; 
     } 
     GWT.log(" called from " + request.getStartRow() + " to " 
       + request.getEndRow() + " result " + returnRecords.length, null); 
     response.setData(returnRecords); 
     processResponse(requestId, response); 
    } 

    @Override 
    protected void executeAdd(String requestId, DSRequest request, 
      DSResponse response) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void executeUpdate(String requestId, DSRequest request, 
      DSResponse response) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void executeRemove(String requestId, DSRequest request, 
      DSResponse response) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

điều này trông rất tuyệt, bạn đã xây dựng gwtRpcDataSource từ một số hướng dẫn hay gì đó chưa? – javaNoober

Trả lời

7

Tôi đã tự mình giải quyết câu hỏi này.

câu trả lời là tôi cần sử dụng phương thức grid.fetchData() và liên kết nguồn dữ liệu thêm một lần nữa để sử dụng nó .... !! Tôi hy vọng nó có thể giúp đỡ người khác.

0

Hãy thử grid.invalidateCache() .Đây gọi sẽ xóa dữ liệu hiện tại trong lưới và thực hiện các phương pháp NTDataSource.executeFetch.

Các vấn đề liên quan