7 Stimmen

SMARTGWT DataSource (GWT-RPC-DATASource) LISTGRID

Ich habe ein Problem mit Datenquellenbindung in ListGrid mit smartGWT. Ich habe GWT-RPC-DataSource und ich habe es als meine Datenquelle festgelegt

grid.setDataSource(ds);

Auf eine Schaltfläche klicken, ich habe einige Änderungen in meiner Datenquelle und ich generieren neue Datenquelle und rebinding mit smartgwt Gitter. aber es schlägt fehl. Ich habe versucht grid.redraw() Funktion, um das Gitter neu zu zeichnen.

Nachfolgend ist meine Klasse für GWTRPCDATASOURCE aufgeführt

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;
    }

}

Ich habe diese abstrakte Klasse in meine eigene Datenquellenklasse namens NTDatasource implementiert.

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

    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X