Acumatica从跳转页面刷新关联网格的问题求助
解决Acumatica跳转页面后网格不自动刷新的问题
我碰到过一模一样的场景——从父页面跳转至查询页面时,表头的筛选条件明明已经加载完成,但关联的网格数据却非要手动点刷新才出来。这本质上是因为后台跳转设置表头Current记录后,Acumatica不会自动触发关联子视图的数据加载,和ASPX的联动配置也有一定关系,下面是具体的解决思路和代码调整方案:
一、在跳转逻辑里手动触发网格视图刷新
跳转时虽然设置了表头的Current记录,但Acumatica不会自动联动刷新子视图,必须显式调用视图的Select()或Refresh()方法来触发数据加载。修改你的跳转动作代码:
public PXAction<POOrder> Reconcile; [PXUIField(DisplayName = "Reconcile", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)] [PXButton(CommitChanges = true, OnClosingPopup = PXSpecialButtonType.Cancel)] public virtual void reconcile() { POLine pOLineRow = Transactions.Current; if (pOLineRow == null) { return; } if (pOLineRow.OrderNbr != null) { PEPOOrderReconciliationMaint pEPOOrderReconciliationgraph = PXGraph.CreateInstance<PEPOOrderReconciliationMaint>(); // 查找并设置表头当前记录 pEPOOrderReconciliationgraph.POOrderReconcileRecord.Current = pEPOOrderReconciliationgraph.POOrderReconcileRecord.Search<POLine.orderType, POLine.orderNbr, POLine.lineNbr>( pOLineRow.OrderType, pOLineRow.OrderNbr, pOLineRow.LineNbr); if (pEPOOrderReconciliationgraph.POOrderReconcileRecord.Current != null) { // 关键步骤:手动刷新网格对应的视图,触发数据加载 pEPOOrderReconciliationgraph.POReceiptLineRecord.Select(); throw new PXRedirectRequiredException(pEPOOrderReconciliationgraph, false, "PORECONCILIATION") { Mode = PXBaseRedirectException.WindowMode.NewWindow }; } } }
二、优化ASPX的网格联动配置
检查你的网格控件是否开启了自动刷新,以及是否和表头视图正确联动。调整PXGrid的属性:
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" Style="z-index: 100; margin-top: 0px;" Width="100%" Height="150px" SkinID="Details" TabIndex="21000" KeepPosition="True" SyncPosition="True" AdjustPageSize="Manual" AutoRefresh="True"> <!-- 开启自动刷新,配合后台触发 --> <Levels> <px:PXGridLevel DataKeyNames="OrderType,OrderNbr,LineNbr" DataMember="POReceiptLineRecord"> <!-- 你的RowTemplate内容 --> </px:PXGridLevel> </Levels> </px:PXGrid>
另外你表头的CommitChanges="True"设置是正确的,确保前台操作时能触发联动,但后台跳转场景下还是需要手动触发视图刷新。
三、确认子视图的筛选逻辑正确性
确保POReceiptLineRecord视图的PXSelect语句,是基于表头POOrderReconcileRecord.Current的字段做筛选的,比如:
public PXSelect<PEPOReceiptLine, Where<PEPOReceiptLine.orderType, Equal<Current<POLine.orderType>>, And<PEPOReceiptLine.orderNbr, Equal<Current<POLine.orderNbr>>, And<PEPOReceiptLine.lineNbr, Equal<Current<POLine.lineNbr>>>>>> POReceiptLineRecord;
只有子视图的筛选条件绑定到表头的Current记录,后台设置表头Current后调用Select(),才能正确加载关联数据。
为什么直接打开页面正常?
直接打开页面输入POLine信息时,前台控件的CommitChanges="True"会触发页面回调,Acumatica会自动联动刷新子视图;但后台跳转是直接修改Graph的Current记录,没有触发前台回调事件,所以必须手动触发视图刷新。
内容的提问来源于stack exchange,提问作者Luis Rojas
相关产品推荐
相关产品推荐

