Acumatica:非绑定DAC视图刷新UI未更新及单选复选框异常咨询
解决Acumatica中UI不刷新的两个常见场景
场景1:非绑定DAC筛选器字段更新后UI无变化
当你用非绑定DAC做筛选器,修改字段值后调用RequestRefresh()却看不到UI更新,核心问题是缓存没正确标记筛选器记录的变更。Acumatica的UI依赖缓存的变更通知来刷新,仅仅改字段值还不够,得明确告诉缓存这条记录已经更新。
试试这个步骤:
- 获取当前筛选器的记录实例
- 修改字段值后,调用
cache.Update(filterRow)标记记录为已更新 - 再调用视图的
RequestRefresh()
示例代码:
// 假设你的非绑定筛选器DAC是MyFilter,视图是FilterView MyFilter filter = FilterView.Current; if (filter != null) { // 修改筛选器字段值 filter.MyFilterField = "新的筛选值"; // 标记缓存中的记录已更新 FilterView.Cache.Update(filter); // 请求UI刷新 FilterView.RequestRefresh(); }
如果还是不行,可在字段更新事件末尾调用cache.RaiseFieldChanged(filter, nameof(MyFilter.MyFilterField)),强制触发字段变更通知,让UI感知到值的变化。
场景2:网格单选复选框UI未同步后台状态
你的代码里用了cache.Updated遍历行,但这个集合只包含用户交互修改过的行——那些初始就选中但没被用户碰过的行不会在这里面,所以后台改它们的Selected值后,UI完全不知道有变化。
调整代码的关键点:
- 遍历视图的所有行(用
View.Select()),而不是仅更新过的行 - 使用
cache.SetValueExt()代替cache.SetValue(),这个方法会触发字段变更的完整逻辑,包括通知UI - 修改后调用
cache.Update(item),确保缓存标记该行已更新
修改后的代码:
protected virtual void DCCrCaseAssignedBenefits_Selected_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { DCCrCaseAssignedBenefits row = (DCCrCaseAssignedBenefits)e.Row; if (row != null && !(bool)e.OldValue && (bool)row.Selected) { // 遍历视图中的所有行,确保覆盖所有可能选中的项 foreach (DCCrCaseAssignedBenefits item in CaseAssignedBenefits.View.Select()) { if (item.Selected == true && item != row) { // SetValueExt会触发字段变更通知,让UI感知到值的变化 cache.SetValueExt<DCCrCaseAssignedBenefits.selected>(item, false); // 标记行已更新 cache.Update(item); } } // 刷新视图同步UI CaseAssignedBenefits.View.RequestRefresh(); // 极端情况可以试试直接调用Refresh() // CaseAssignedBenefits.View.Refresh(); } }
这样修改后,后台修改的每一行都会被UI感知到,单选状态就能正确同步了。
内容的提问来源于stack exchange,提问作者Jean Claude Abela
相关产品推荐
相关产品推荐

