Acumatica如何获取自定义Selector值并自动填充Attention字段
问题描述
我需要将Selector选择器的取值传递到Attention字段,实现每次选择新的Selector值时,Attention字段自动同步更新为该选择器的取值。
上图中的联系人Selector是自定义字段,我尝试通过其扩展类访问该字段但一直未运行成功。下方为该字段的数据访问配置界面:
以下是该自定义字段的定义代码,可按需参考:
[PXDBString(50)] [PXUIField(DisplayName="Contact")] [PXSelector(typeof(Search2<Contact.displayName, LeftJoin<BAccount, On<BAccount.bAccountID, Equal<Contact.bAccountID>>>, Where<Contact.contactType, Equal<ContactTypesAttribute.person>>>))] [PXRestrictor(typeof( Where<Current<PMContact.customerID>, Like<Contact.bAccountID>>), "")]
我先后两次尝试获取扩展字段,分别在RowSelected、RowUpdated、FieldUpdated多个事件中插入对应代码,均未生效,看起来是我获取扩展的方式存在问题,但我不清楚还有什么调整方向。
尝试1
protected void PMContact_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { var row = (PMContact)e.Row; if (row == null) return; PMContactExt rowExt = row.GetExtension<PMContactExt>(); if (rowExt != null) { row.Attention = rowExt.UsrContactSelect; } }
尝试2
protected void PMContact_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { var row = (PMContact)e.Row; if (row == null) return; PMContact items = (PMContact)Base.ItemSettings.Current; var itemExt = PXCache<PMContact>.GetExtension<PMContactExt>(items); row.Attention = itemExt.UsrContactSelect; }
第二次尝试运行时抛出ItemSettings相关报错,报错内容如下:
\App_Code\Caches\ProjectEntry.cs(43): error CS1061: 'ProjectEntry' does not contain a definition for 'ItemSettings' and no accessible extension method 'ItemSettings' accepting a first argument of type 'ProjectEntry' could be found (are you missing a using directive or an assembly reference?)
解决建议
错误原因分析
- 尝试2的报错是因为
ProjectEntry图形中根本不存在ItemSettings这个视图,属于视图名引用错误,完全没有必要额外访问Base下的视图,事件参数里已经可以拿到当前操作的PMContact行。 - 尝试1的逻辑方向正确,但存在两个问题:
- 用错了触发事件:
RowSelected是界面渲染行时触发,实时同步选择器值应该绑定自定义选择器字段的FieldUpdated事件,选择完成后立刻触发同步,响应更及时也不会有多余的性能消耗 - 直接给
row.Attention赋值不符合Acumatica缓存操作规范,不会主动触发界面更新和缓存状态变更,经常出现修改不生效的情况
- 用错了触发事件:
正确实现代码
直接给自定义联系人选择器字段绑定FieldUpdated事件即可:
protected void PMContact_UsrContactSelect_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = (PMContact)e.Row; if (row == null) return; PMContactExt rowExt = row.GetExtension<PMContactExt>(); if (rowExt == null) return; // 使用缓存的SetValueExt方法赋值,自动触发界面刷新和缓存更新 cache.SetValueExt<PMContact.attention>(row, rowExt.UsrContactSelect); }
其他排查点
如果上述代码仍不生效,可以按顺序检查:
- 确认自定义字段的名称确实是
UsrContactSelect,字段名拼写错误是最常见的问题 - 确认事件代码写在
ProjectEntry的图形扩展类中,不要放错位置 - 如果需要存量数据也同步更新,可以额外加一个
PMContact_RowUpdated事件,复用上面的赋值逻辑即可
内容的提问来源于stack exchange,提问作者Andrew Aiello
相关产品推荐
相关产品推荐

