如何在Acumatica中通过代码为Grid设置上一行字段的默认值?
嘿,刚好我之前做过类似的需求,给你分享两种实现Acumatica Grid默认值继承上一行的方案,一种是无需编码的配置方式,另一种是自定义代码实现,你可以根据场景灵活选择:
方案一:通过Acumatica界面配置实现(零代码)
如果你的需求只是简单的字段默认值继承,直接通过DAC字段属性配置就能搞定:
- 打开对应DAC的字段属性设置(在Customization Project Editor里找到目标DAC)
- 找到需要继承上一行值的字段,在它的
DefaultValue属性中填入LastValue关键字 - 保存并发布自定义项目后,新增Grid行时该字段就会自动取上一行的对应值
注意:这种方式只适用于基础的继承场景,要是有复杂的业务判断逻辑,还是得用代码实现
方案二:自定义代码实现(适配复杂场景)
如果需要更灵活的控制(比如只在特定条件下继承、同时处理多个字段的复杂赋值),可以在Graph中通过事件处理来实现:
方式1:在RowInserting事件中批量赋值
这种方式会在用户插入新行时触发,一次性给多个字段赋值:
protected virtual void SalesOrderDetail_RowInserting(PXCache cache, PXRowInsertingEventArgs e) { // 获取Grid对应的DataView数据 var detailRows = Base.Transactions.Select(); if (detailRows.Count > 0) { // 获取Grid中的最后一行(也就是上一行)数据 var lastDetailRow = detailRows[detailRows.Count - 1] as SalesOrderDetail; if (lastDetailRow != null) { var newDetailRow = e.Row as SalesOrderDetail; // 将上一行的指定字段值赋值给新行 newDetailRow.InventoryID = lastDetailRow.InventoryID; newDetailRow.UOM = lastDetailRow.UOM; newDetailRow.Qty = lastDetailRow.Qty; // 可以根据业务需求添加更多字段赋值 } } }
替换提示:把
SalesOrderDetail换成你实际的DAC类名,Transactions换成Graph中对应Grid的DataView名称,InventoryID、UOM等换成你需要继承的字段名
方式2:在FieldDefaulting事件中单独处理字段
如果只需要给单个字段设置默认值,用FieldDefaulting事件更精准:
protected virtual void SalesOrderDetail_InventoryID_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e) { var detailRows = Base.Transactions.Select(); if (detailRows.Count > 0) { var lastDetailRow = detailRows[detailRows.Count - 1] as SalesOrderDetail; if (lastDetailRow != null) { // 给当前字段设置上一行的值 e.NewValue = lastDetailRow.InventoryID; } } }
同样要替换对应的DAC类名、DataView名称和字段名
额外注意事项
- 如果Grid有筛选条件,
Select()方法会返回筛选后的行;要是需要获取所有未筛选的行,可能需要直接访问缓存数据(比如cache.Cached) - 可以在代码中添加业务判断逻辑,比如只有当上一行满足某个条件时才赋值
- 测试时要注意Grid的批量插入场景,确保逻辑正常运行
内容的提问来源于stack exchange,提问作者jjacob
相关产品推荐
相关产品推荐

