X++开发:更新字段后刷新过往工人表单显示方法的问题
问题场景
过往工人表单的网格包含两个显示方法字段:系统默认的离职原因、自定义的雇佣状态。操作流程中,在雇佣历史表单修改这两个字段值后,回到过往工人界面时,网格内的显示值无法自动更新——仅刷新表单无效,必须刷新整个浏览器才会生效。已尝试在显示方法中调用Hcmworker_ds.observe()、Hcmemployment_Ds.observe(),以及formcaller.research(true),均未解决问题。
解决方案
针对Dynamics 365 F&O的显示方法缓存机制,可通过以下几种方式解决跨表单数据更新后的显示刷新问题:
1. 在雇佣历史表单的保存事件中主动通知父表单刷新并清除缓存
在雇佣历史表单(如HcmEmploymentHistory)的saveRecord方法中添加代码,数据保存后直接触发父表单的数据源刷新并清除显示方法缓存:
public void saveRecord() { super(); FormDataSource workerDS; Args args = this.args(); if (args && args.caller()) { workerDS = args.caller().dataSource(HcmWorker_ds.name()); if (workerDS) { // 强制重新查询父数据源 workerDS.research(true); // 清除显示方法缓存,确保重新计算值 workerDS.clearDisplayMethodCache(); } } }
核心是clearDisplayMethodCache()方法,它会直接清空数据源关联的所有显示方法缓存,比单纯的research()更能确保显示值重新计算。
2. 给自定义显示方法添加ClientCache(false)属性
如果是自定义的显示方法,在方法定义上添加该属性,强制客户端每次渲染都重新计算值,不使用缓存:
[ClientCache(false)] display HcmEmploymentStatus myEmploymentStatus(HcmWorker _worker) { HcmEmployment employment = HcmEmployment::findByWorker(_worker.RecId, true); return employment ? employment.EmploymentStatus : ''; }
注意:该方式会增加客户端计算负载,适合数据量较小的场景。
3. 在过往工人表单的active事件中补充刷新逻辑
在过往工人表单的active方法中添加刷新代码,确保每次切换回该表单时自动更新数据:
public void active() { super(); HcmWorker_ds.research(true); HcmWorker_ds.clearDisplayMethodCache(); }
内容的提问来源于stack exchange,提问作者Menna Ahmed
相关产品推荐
相关产品推荐

