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

如何将CS205000属性页签下拉值复制到销售订单表头自定义字段?

问题描述

我正尝试将Attributes页签(CS205000)中已定义属性的下拉框值复制到销售订单表头的自定义字段中。以下是我的实现代码,但该字段仍为普通文本框,未加载下拉选项。请问该如何调整代码,或是直接在销售订单自定义字段的DAC中使用BQL实现需求更简便?

namespace PX.Objects.SO
{
  public class SOOrderEntry_Extension : PXGraphExtension<PX.Objects.SO.SOOrderEntry>
  {
    protected void SOOrder_UsrTypeOfOrder_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e)
    {
      
      List<string> allowedValues = new List<string>();
      List<string> allowedLabels = new List<string>();
      SOOrderEntry graph = (SOOrderEntry)sender.Graph;
      var query = PXSelect<
        CSAttributeDetail,
        Where<
          CSAttributeDetail.attributeID,
          Equal<Required<CSAttributeDetail.attributeID>>
        >
      >.Select(graph, "TOO");

      foreach (CSAttributeDetail attrDetail in query)
      {
        allowedValues.Add(attrDetail.ValueID);
        allowedLabels.Add(attrDetail.Description);
      }

      e.ReturnState = PXStringState.CreateInstance(
        e.ReturnState,
        50,
        true,
        typeof(SOOrderExt.usrTypeOfOrder).Name,
        false,
        -1,
        string.Empty,
        allowedValues.ToArray(),
        allowedLabels.ToArray(),
        false,
        null
      );
    }
  }
}

属性页签截图说明:截图显示CS205000页面中ID为"TOO"的属性已配置多个下拉选项值


解决方案

方案一:修复FieldSelecting事件代码

现有代码存在几处问题,调整后可正常加载下拉选项:

  • 替换错误的sender.Graph调用,直接使用Base获取当前图实例
  • 修正PXStringState的参数,使用字段的显示名而非类型名称
  • 兼容属性描述为空的情况

调整后的代码:

namespace PX.Objects.SO
{
  public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
  {
    protected void SOOrder_UsrTypeOfOrder_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e)
    {
      var allowedValues = new List<string>();
      var allowedLabels = new List<string>();

      // 查询指定属性的下拉选项值
      var attrDetails = PXSelect<CSAttributeDetail,
          Where<CSAttributeDetail.attributeID, Equal<Required<CSAttributeDetail.attributeID>>>>
          .Select(Base, "TOO");

      foreach (CSAttributeDetail detail in attrDetails)
      {
        allowedValues.Add(detail.ValueID);
        allowedLabels.Add(detail.Description ?? detail.ValueID); // 描述为空时使用值ID
      }

      // 构建下拉状态
      e.ReturnState = new PXStringState(
          e.ReturnState,
          50,
          true,
          cache.GetFieldDisplayName<SOOrderExt.usrTypeOfOrder>(),
          allowedValues.ToArray(),
          allowedLabels.ToArray(),
          false
      );
    }
  }
}

方案二:在DAC中直接用BQL关联(更简便)

如果是固定绑定某个属性的下拉值,直接在DAC层通过PXSelector属性配置,无需编写事件代码,更简洁易维护:

在自定义DAC SOOrderExt中修改字段定义:

public class SOOrderExt : PXCacheExtension<SOOrder>
{
    #region UsrTypeOfOrder
    [PXString(50)]
    [PXUIField(DisplayName = "订单类型")]
    [PXSelector(
        typeof(Search<CSAttributeDetail.valueID, 
            Where<CSAttributeDetail.attributeID, Equal<Required<CSAttributeDetail.attributeID>>>>),
        typeof(CSAttributeDetail.valueID),
        typeof(CSAttributeDetail.description),
        SubstituteKey = typeof(CSAttributeDetail.valueID),
        DescriptionField = typeof(CSAttributeDetail.description),
        Filterable = true
    )]
    public virtual string UsrTypeOfOrder { get; set; }
    public abstract class usrTypeOfOrder : PX.Data.BQL.BqlString.Field<usrTypeOfOrder> { }
    #endregion
}

配置完成后,确保页面上该字段的控件类型设置为DropDown或Selector(默认Selector支持下拉+搜索功能)。

注意事项

  • 确认属性ID"TOO"在CS205000中已正确配置,且属性类型为"列表(List)"
  • 若需要根据其他字段动态切换下拉选项,方案一更灵活;固定属性绑定则方案二更优

内容的提问来源于stack exchange,提问作者Tharidhi P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:05:15