我在使用smartGWT的ListGrid中进行数据源绑定时遇到问题.我有GWT-RPC-DataSource,我已将其设置为我的数据源 grid.setDataSource(ds); 在一个按钮上单击我的数据源中有一些更改,我正在生成新的数据
grid.setDataSource(ds);
在一个按钮上单击我的数据源中有一些更改,我正在生成新的数据源并使用smartgwt的网格重新绑定.但它失败了.我已经尝试了grid.redraw()函数来重绘网格.
以下是我的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 (<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 (<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 (<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 (<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; } }
我已经将这个抽象类实现到我自己的名为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 } }我自己解决了这个问题.
答案是我需要使用grid.fetchData()方法并再次绑定数据源才能使用它…. !!我希望它可以帮助别人.