我有一个动态DataSource,它绑定到ListGrid。通过动态了解其列,具体取决于数据库中的数据。
因此,在插入,更新或删除ListGrid中的行之后,数据源结构可能会发生变化。然后我需要重新加载数据源以验证是否应该更改其结构(列)。因此,ListGrid必须响应这些最终的变化。
例如,当一个新行被添加到数据库表并因此列在ListGrid中时,可能会显示一个新列以显示该行的整个数据。如果删除此行,则必须删除该新列。
问题是插入或删除后,即使我调用负责重新加载数据源并销毁和重新创建网格的方法,列也保持不变。请看下面的代码:
加载数据源的方法:
private void generateNumberRangesDataSourceDynamycally() {
String appID = AppServiceConstants.APP_ID;
String className = AppServiceConstants.SCAFACADE_SERVICE_NAME;
String methodName = AppServiceConstants.METHOD_GETNUMBERRANGES;
DMI.call(appID, className, methodName, new PAIRPCCallback() {
@Override
public void executeRPCCall(RPCResponse response, Object rawData, RPCRequest request) {
if (response.getStatus() == RPCResponse.STATUS_FAILURE) {
SC.warn( scatext.error_numberrange_datasource_generation() );
}
}
}, loadNumberRangesDataSource());
}
启动DMI以动态加载数据源的触发方法:
private Object[] loadNumberRangesDataSource() {
DataSource.load(LUNummernkreiseContent.DYNAMICDS_ID, dataSourceCallbackFunction(), true);
return new Object[] { AppController.getRequestToken() };
}
动态数据源加载的回调函数:
private Function dataSourceCallbackFunction() {
final Function function = new Function() {
@Override
public void execute() {
display.getLayout().getGrid().destroy(); // destroying the HTML reference to the component;
display.getLayout().setGrid( null ); // nullifying the java object
dsDynamic = DataSource.get( LUNummernkreiseContent.DYNAMICDS_ID );
if (dsDynamic != null) {
setupGrid();
refreshGrid();
}
}
};
return function;
}
以下方法负责设置网格并获取当前数据:
protected void refreshGrid() {
display.getLayout().getGrid().fetchData( criteria );
}
protected void setupGrid() {
display.getLayout().getGrid().setDataSource( dsDynamic );
final HeaderSpan headerSpan = new HeaderSpan(scatext.screen_lunummernkreis_grid_luHeaderSpan(),
new String[] {LUNummernkreiseContent.START_FIELD, LUNummernkreiseContent.END_FIELD});
display.getLayout().getGrid().setHeaderSpans( headerSpan );
display.getLayout().getGrid().getField( LUNummernkreiseContent.START_FIELD ).setTitle( scatext.screen_lunummernkreis_window_spinnerFrom() );
display.getLayout().getGrid().getField( LUNummernkreiseContent.END_FIELD ).setTitle( scatext.screen_lunummernkreis_window_spinnerTo() );
display.getLayout().getGrid().getField( LUNummernkreiseContent.DELIVERYTYPE_FIELD ).setTitle( scatext.screen_lunummernkreis_window_comboType() );
display.getLayout().getGrid().getField( LUNummernkreiseContent.COUNTRYNAME_FIELD ).setTitle( scatext.screen_lunummernkreis_window_comboCountry() );
display.getLayout().getGrid().getField( LUNummernkreiseContent.COUNTRYCODE_FIELD ).setTitle( scatext.screen_lunummernkreis_grid_columnCountryCode() );
}
有什么想法吗?强调要点:在执行CRUD操作后,我需要网格响应动态结构数据源更改。