You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Acumatica如何获取自定义Selector值并自动填充Attention字段

问题描述

我需要将Selector选择器的取值传递到Attention字段,实现每次选择新的Selector值时,Attention字段自动同步更新为该选择器的取值。
Contact Selection
上图中的联系人Selector是自定义字段,我尝试通过其扩展类访问该字段但一直未运行成功。下方为该字段的数据访问配置界面:
Data Access screen
以下是该自定义字段的定义代码,可按需参考:

[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?)


解决建议

错误原因分析

  1. 尝试2的报错是因为ProjectEntry图形中根本不存在ItemSettings这个视图,属于视图名引用错误,完全没有必要额外访问Base下的视图,事件参数里已经可以拿到当前操作的PMContact行。
  2. 尝试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:54:02