SMARTGWT DataSource (GWT-RPC-DATASource) LISTGRID

2019-04-25 15:54发布

问题:

I have a problem with datasource binding in ListGrid with smartGWT. I have GWT-RPC-DataSource and i have set it as my datasource

grid.setDataSource(ds);

On one button click I have some changes in my datasource and I am generating new datasource and rebinding with smartgwt's grid. but it fails. I have tried grid.redraw() function to redraw the grid.

Below is my class for 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;
    }

}

I have implemented this abstract class to my own datasource class named 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

    }
}

回答1:

I have solve this question myself.

the answer is i need to use grid.fetchData() method and bind datasource one more time to use it.... !! I hope it might help someone else.



回答2:

Try grid.invalidateCache() .This call will clear the current data in the grid and executes the NTDataSource.executeFetch method.



标签: gwt smartgwt