如何更新Extension Library中过滤字段使Inventory Lookup SmartPanel UI同步新值
问题原因
你当前的实现存在两个核心问题导致赋值后无法立刻同步UI:
- 赋值逻辑写在
FieldSelecting事件中,该事件仅在UI主动拉取字段展示值时才会触发,你主动通过代码赋值不会自动触发该事件执行,只有点击复选框触发页面回发后,逻辑才会执行。 - 在
FieldSelecting事件中调用SetValueExt属于错误用法,会导致事件循环触发的隐患,该事件的正确用法是直接给e.ReturnValue赋值,不应该直接修改行对象的字段值。
修正方案
把赋值逻辑迁移到SOSiteStatusFilter的RowSelected事件中,赋值后主动触发视图刷新即可,修正后的代码如下:
namespace MyProject { public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry> { public static bool IsActive() { return true; } protected void SOSiteStatusFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e, PXRowSelected baseMethod) { // 优先执行基类原有逻辑 if (baseMethod != null) baseMethod(sender, e); SOSiteStatusFilter filter = e.Row as SOSiteStatusFilter; if (filter == null) return; // 仅当字段为空时赋值,可根据业务需求调整触发条件 if (string.IsNullOrWhiteSpace(filter.Inventory)) { sender.SetValueExt<SOSiteStatusFilter.inventory>(filter, "798815"); sender.IsDirty = true; // 强制刷新库存查询面板对应的视图,同步更新UI Base.siteStatusLookup.View.RequestRefresh(); } } public virtual void SOSiteStatusFilter_Inventory_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e) { SOSiteStatusFilter filter = e.Row as SOSiteStatusFilter; if(filter != null) { Console.WriteLine("inventory filter field update complete"); } } } }
补充说明
- 你提到的
Propagate方法用于缓存层级间的修改同步,你的场景是未绑定字段的UI刷新,完全不需要调用该方法。 - 如果你需要在特定操作(而非每次打开面板)时赋值,直接扩展触发打开库存查询面板的Action,在弹出逻辑前执行赋值和视图刷新操作即可。
内容的提问来源于stack exchange,提问作者user1576945
相关产品推荐
相关产品推荐

