如何将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
相关产品推荐
相关产品推荐

