1

我有一个动态数据源,它绑定到一个 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 操作后响应动态结构数据源的变化。

4

0 回答 0