AR503000对账单打印界面Process All按钮扩展功能报错排查
AR503000界面PrintStatements方法重写报错解决方案
问题表现
对AR503000(Print Statement对账单打印)界面的Process All(全部处理)按钮做自定义扩展时,使用[PXOverride]特性重写PrintStatements方法后,打开页面即抛出运行时错误,报错效果如下:
打开Print Statement界面(AR503000)时的界面报错
原有错误实现代码:
public class ARStatementPrint_Extension : PXGraphExtension<ARStatementPrint> { #region Event Handlers public delegate void PrintStatementsDelegate(); [PXOverride] public void PrintStatements(PrintStatementsDelegate baseMethod) { PXTrace.WriteInformation("This did a thing"); baseMethod(); } }
报错根本原因
- 重写的方法、自定义委托的签名和基类
ARStatementPrint图中PrintStatements方法的实际签名完全不匹配。该方法是Processing类型动作的处理方法,基类原生定义为**返回IEnumerable类型、入参为PXAdapter**的虚方法,你定义的无参、void返回值的重写逻辑无法通过[PXOverride]的签名校验,页面初始化图实例时直接抛出异常。
正确实现代码
public class ARStatementPrint_Extension : PXGraphExtension<ARStatementPrint> { #region Event Handlers // 委托签名必须与基方法完全匹配:返回IEnumerable,入参为PXAdapter public delegate IEnumerable PrintStatementsDelegate(PXAdapter adapter); [PXOverride] public IEnumerable PrintStatements(PXAdapter adapter, PrintStatementsDelegate baseMethod) { // 基方法执行前的自定义逻辑写在此处 PXTrace.WriteInformation("对账单打印前自定义逻辑执行"); // 必须传入adapter参数,接收基方法返回结果,保证原有打印/批量处理逻辑正常运行 var processResult = baseMethod(adapter); // 基方法执行后的自定义逻辑写在此处 PXTrace.WriteInformation("对账单打印后自定义逻辑执行"); return processResult; } #endregion }
开发注意事项
- 使用
[PXOverride]重写基类方法时,自定义委托、重写方法的返回值类型、入参类型/顺序必须和基类虚方法完全一致,仅需要在重写方法的入参末尾追加同签名的委托参数即可。 - 重写Process/Process All这类批量处理按钮绑定的动作方法时,必须将
PXAdapter类型入参传入基方法,同时返回基方法的执行结果,否则会出现批量处理中断、选中记录不执行、处理结果不刷新等异常。
内容的提问来源于stack exchange,提问作者Stumped
相关产品推荐
相关产品推荐

