SMARTGWT origen de datos (GWT-RPC-DATASource) LISTGRID

Tengo un problema con el origen de datos de enlace en ListGrid con smartGWT. He GWT-RPC-DataSource y la puse como mi datasource

grid.setDataSource(ds);

Sobre un botón, haga clic en tengo algunos cambios en mi datasource y estoy generando nuevo origen de datos y volver a enlazar con smartgwt de la cuadrícula. pero se produce un error. He intentado de la cuadrícula.redraw() función para volver a dibujar la cuadrícula.

A continuación es de mi clase para 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;
    }

}

He implementado esta clase abstracta a mi propia clase de origen de datos nombre 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

    }
}
esto se ve muy bien, ¿has construido el gwtRpcDataSource de algún tutorial o algo?

OriginalEl autor Ashfak Balooch | 2011-01-19

2 Kommentare

  1. 7

    He resolver esta pregunta a mí mismo.

    la respuesta es que necesito usar la cuadrícula.fetchData() método y se unen origen de datos una vez más para usarlo…. !! Espero que pueda ayudar a alguien.

    OriginalEl autor Ashfak Balooch

  2. 0

    Intentar de la cuadrícula.invalidateCache() .Esta llamada va a borrar los datos actuales de la red y ejecuta el NTDataSource.executeFetch método.

    OriginalEl autor DonX

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea