如何在Bills and Adjustments界面明细网格强制启用自定义字段
问题原因定位与解决思路
- 调整事件执行优先级,避免被基础逻辑覆盖
标准的APInvoice原图的APTran_RowSelected事件会在账单进入已审核/已过账等锁定状态时将所有明细字段设为禁用,如果你定制的事件执行顺序早于原图逻辑,你的设置会被后续执行的原图代码覆盖。你可以给事件方法添加最低优先级标记,确保你的代码最后执行:[PXPriority(PXPriority.Lowest)] protected virtual void APTran_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { var aptran = e.Row as APTran; if (aptran != null) { PXUIFieldAttribute.SetEnabled<APTranExt.usrGrantID>(cache, aptran, true); PXUIFieldAttribute.SetEnabled<APTranExt.usrReimbursementPeriod>(cache, aptran, true); } } - 检查页面与字段特性的硬编码限制
- 打开对应ASPX页面,检查这两个自定义字段的控件属性,确认没有手动设置
Enabled="False"或ReadOnly="True",页面控件属性的优先级高于后端代码设置 - 检查自定义字段的
CacheAttached定义,确认没有添加[PXReadOnly]、[PXUIEnabled]这类带条件控制可用性的特性,如果有相关特性,要么调整其判断条件,要么删除后用RowSelected的代码控制
- 打开对应ASPX页面,检查这两个自定义字段的控件属性,确认没有手动设置
- 替换泛型方法为字符串重载排查映射问题
部分情况下扩展字段的泛型映射可能出现异常,可以先用字符串版本的重载测试是否生效,排除字段名拼写、扩展类映射错误的问题:PXUIFieldAttribute.SetEnabled(cache, aptran, "UsrGrantID", true); PXUIFieldAttribute.SetEnabled(cache, aptran, "UsrReimbursementPeriod", true); - 处理缓存级别的禁用限制
如果账单锁定状态下系统直接将APTran缓存的AllowUpdate属性设为了False,那么单字段的SetEnabled配置不会生效。这种情况下你可以先临时放开缓存更新权限,再按需控制其他字段的可用性:[PXPriority(PXPriority.Lowest)] protected virtual void APTran_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { var aptran = e.Row as APTran; if (aptran == null) return; // 先放开缓存更新权限 cache.AllowUpdate = true; // 启用自定义字段 PXUIFieldAttribute.SetEnabled<APTranExt.usrGrantID>(cache, aptran, true); PXUIFieldAttribute.SetEnabled<APTranExt.usrReimbursementPeriod>(cache, aptran, true); // 可选:如果需要限制原生字段继续禁用,可以遍历原生字段设置Enabled为false } - 排查其他定制逻辑的冲突
如果系统中存在其他二次开发扩展也订阅了APTran_RowSelected事件,同样可能在你的代码执行后覆盖字段启用设置。你可以在你的代码结尾处加断点,查看字段的Enabled属性是否按预期修改,再跟踪后续执行的代码定位冲突逻辑。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

