Acumatica:修改已编译为DLL的自定义Usr字段下拉选项方法咨询
修改编译后Usr字段的下拉列表选项方案
嘿,我完全懂你碰到的这个麻烦——自定义的Usr字段被编译成DLL了,手里没原始代码没法改,屏幕层级重写PXStringList又没起效。别慌,这里有个靠谱的解决办法,用CacheAttached属性就能在运行时动态修改这个字段的下拉选项,完全不用碰原始DLL。
核心思路
Acumatica的PXCacheAttached属性允许你在现有DAC字段上重写或追加属性,不管这个字段是在系统自带DAC里,还是已经编译成DLL的自定义字段里。它会在缓存初始化时生效,直接覆盖原始字段的StringList设置。
具体步骤
打开你的自定义项目:在Acumatica的Customization Editor里,找到目标屏幕对应的自定义项目。
添加代码文件:在左侧菜单的
Files下,点击New>Code File,创建一个新的CS文件(比如CustomUsrFieldMods.cs)。写入CacheAttached代码:根据你的实际DAC和字段,替换下面的示例代码:
using PX.Data; using PX.Objects.SO; // 替换成你的DAC所在的命名空间 public class SOOrderUsrFieldExtension : PXGraphExtension<SOOrderEntry> // 替换成目标屏幕的Graph类 { // 针对UsrStatus字段重写下拉列表 [PXCacheAttached(typeof(SOOrder.usrStatus))] // 注意字段抽象类的命名(通常是小写开头的usrXXX) [PXStringList( new string[] { "NEW", "INPR", "COMP" }, // 实际存储值 new string[] { "新建", "处理中", "已完成" } // 界面显示文本 )] [PXUIField(DisplayName = "自定义状态")] public static void _cacheAttached_UsrStatus(PXCache cache) { // 这里可以加额外逻辑,比如根据当前用户权限过滤选项 // 示例:if (!PXAccess.HasPermission(PXAccessLevel.Admin)) { ... } } }- 注意:要确保自定义项目引用了包含该Usr字段的DLL(在项目的
References里添加对应DLL),并且字段的抽象类名称正确(原始DLL里的字段抽象类一般是usrXXX,和实体属性UsrXXX对应)。
- 注意:要确保自定义项目引用了包含该Usr字段的DLL(在项目的
发布自定义项目:保存代码后发布项目,刷新屏幕就能看到下拉选项已经更新了。
进阶:动态生成下拉选项
如果你的下拉选项需要从其他表读取或者动态生成,可以用cache.SetList方法在CacheAttached里动态赋值:
[PXCacheAttached(typeof(SOOrder.usrStatus))] [PXString] [PXUIField(DisplayName = "动态状态")] public static void _cacheAttached_UsrStatus(PXCache cache) { // 从自定义表读取激活的状态选项 var statusList = PXSelect<MyStatusTable, Where<MyStatusTable.active, Equal<True>>> .Select(cache.Graph) .RowCast<MyStatusTable>() .Select(row => new string[] { row.StatusCD, row.StatusName }) .ToList(); // 将动态生成的列表绑定到字段 cache.SetList<SOOrder.usrStatus>(statusList); }
为什么之前的屏幕重写没生效?
大概率是因为没用到PXCacheAttached属性——直接在Graph扩展里定义字段,是不会覆盖原始DLL里的字段属性的。必须通过PXCacheAttached绑定到原始字段上,才能替换它的StringList设置。
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

