SmartGWT: Как заставить ListGrid реагировать на изменения структуры источника данных после добавления, обновления, удаления операций?
У меня есть динамический источник данных, и он связан с 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.