SysOperation UiBuilder双Lookup功能报错问题求助
解决SysOperation中重复注册方法重写的报错问题
报错原因
当前代码每次切换Sa_Type枚举值时,都会调用registerOverrideMethod给combo控件的lookup方法绑定新实现,但SysOperation框架不允许对同一个控件的同一个方法多次注册重写,这就触发了RegisterOverrideMethod was called twice for the same object for method 'lookup'错误。
解决方案
不需要每次切换类型都重新注册lookup方法,只需要注册一次通用的lookup方法,在该方法内部根据当前Sa_Type的取值动态判断加载客户还是供应商数据。既能避免重复注册的问题,逻辑也更简洁。
修改后的代码示例
public class AdjustmentUiBuilder extends SysOperationAutomaticUIBuilder { DialogField type; DialogField combo; public void build() { super(); type = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(AdjustmentSysContract, parmType)); combo = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(AdjustmentSysContract, parmCombo)); } public void postRun() { super(); // 仅注册一次通用lookup方法 combo.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(AdjustmentUiBuilder, lookupCustOrVendAccount), this); type.registerOverrideMethod(methodStr(FormComboBoxControl, modified), methodStr(AdjustmentUiBuilder, moduleCustVend_modified), this); } private void lookupCustOrVendAccount(FormStringControl _formStringControl) { Query query = new Query(); QueryBuildDataSource qbds; SysTableLookup sysTableLookup; TableId tableId; FieldId accountFieldId; // 根据当前类型动态选择数据源表和字段 if(type.value() == Sa_Type::Customer) { tableId = tableNum(CustTable); accountFieldId = fieldNum(CustTable, AccountNum); } else { tableId = tableNum(VendTable); accountFieldId = fieldNum(VendTable, AccountNum); } sysTableLookup = SysTableLookup::newParameters(tableId, _formStringControl); qbds = query.addDataSource(tableId); sysTableLookup.addLookupfield(accountFieldId, true); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } private boolean moduleCustVend_modified(FormComboBoxControl _control) { // 切换类型后清空combo值,避免数据不匹配 combo.value(''); return _control.modified(); } }
补充说明
- 移除了原
modifyDialogFields方法,不再反复注册lookup方法 - 在
postRun中仅注册一次通用的lookupCustOrVendAccount方法,内部根据类型动态切换数据源 - 切换类型时清空combo现有值,防止出现“选了供应商后切客户,combo仍保留供应商账号”的不一致情况
内容的提问来源于stack exchange,提问作者R Monkey
相关产品推荐
相关产品推荐

