我已經在 acumatica 中編程一年了,但我仍然不太明白某些事情是如何作業的。比如下面代碼中的圖形是如何作業的,正在添加邏輯,但是,如果在基本方法之前添加此邏輯,我不明白如何將資訊傳遞到下一頁。我已經閱讀了檔案,但我仍然不明白,你知道在哪里可以找到更好的資訊嗎?
public delegate IEnumerable createSalesOrder(PXAdapter adapter);
[PXOverride]
public virtual IEnumerable CreateSalesOrder(PXAdapter adapter, createSalesOrder baseMethod)
{
PXTrace.WriteInformation("try ");
PXGraph.InstanceCreated.AddHandler<SOOrderEntry>((graph) =>
{
graph.RowInserted.AddHandler<SOOrder>((sender, e) =>
{
SOOrder order = (SOOrder)e.Row;
SOOrderExt orderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(order);
orderExt.UsrCustomOne = "Howdy"; //assign anything you want here*/
});
});
return baseMethod(adapter);
}
很明顯,事件處理程式正在被添加到圖的實體中,但它如何將該資訊專門傳遞給在基方法中創建的下一個物件,或者它如何將此邏輯添加到新的 SOORDER
uj5u.com熱心網友回復:
PXGraph.InstanceCreated是一個靜態屬性;您正在創建圖形之前設定事件處理程式。
當您呼叫基本方法(使用return baseMethod(adapter))時,它將創建SOOrderEntry圖形的新實體。在新實體的初始化程序中,圖形將查找任何InstanceCreated事件處理程式并呼叫代碼,在您的情況下,它將RowInserted向新圖形添加一個事件處理程式。您的InstanceCreated處理程式將在回呼期間存活。
當涉及多個圖形時(從機會創建訂單、從訂單創建發貨等),這是自定義邏輯的最簡潔方法。
uj5u.com熱心網友回復:
您的示例是在呼叫基本方法之前添加事件處理程式。在執行程序中,Acumatica 使用定義的擴展創建基本元素的組合。由于您已經覆寫了一個基本方法,您的方法是通過委托呼叫的,然后您必須告訴 C# 是否/何時執行基本代碼。如果您需要稍后執行代碼,您可以在此代碼的開頭呼叫 baseMethod.Invoke(adapter),但在這種情況下,您明確告訴 C# 執行您的代碼,然后運行基本方法。
除非您的方法包含在非常舊的培訓材料或非常新的培訓材料中,否則您添加事件處理程式的方式對我來說有點陌生。我在標準代碼中看到過類似的東西,但似乎并不常見。我記得的唯一一個例子是,有人建議我在我的代碼中為不同的標準圖注入一個事件處理程式,該處理程式僅在使用我的圖時才需要做一些事情,而不是在標準螢屏執行圖代碼時。我不確定事件處理程式本身是否在您的方法結束時自動洗掉,或者是否在每次執行該方法時實體化它,因為我不使用您的方法。
無論如何,在您的示例中發生的事情是在呼叫基方法之前添加事件處理程式,因為您告訴它在呼叫方法時創建事件處理程式,并且委托使您的覆寫首先執行。基方法在最后被呼叫,但這只是因為你說這樣做。如果您沒有特別告訴 C# 執行基本方法,委托將使您的代碼執行并且永遠不會運行基本代碼。簡而言之,它屬于委托/覆寫的機制。
我被訓練添加這樣的事件處理程式的方式......
using PX.Data;
using PX.Objects.SO;
namespace Blog
{
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public static bool IsActive() =>
Common.FeatureInstalled<Common.CMMSFeaturesSet.main>();
protected virtual void _(Events.RowInserted<SOOrder> e, PXRowInserted baseEvent)
{
SOOrder order = (SOOrder)e.Row;
SOOrderExt orderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(order);
orderExt.UsrCustomOne = "Howdy"; //assign anything you want here*/
if (baseEvent != null) baseEvent.Invoke(e.Cache, e.Args);
}
}
}
通過直接在圖形擴展中定義它,它使用圖形擴展進行初始化,以確保在插入行時觸發事件。我懷疑您的代碼要么僅在執行該方法時觸發,要么在每次呼叫該方法時創建多個事件實體。同樣,我只是不太熟悉如何以您的方式添加事件處理程式的范圍。
假設您添加事件處理程式的方法將其范圍限定為添加它的方法,除非通過特定方法創建銷售訂單,否則它不會執行。如果它在添加后對圖形是持久的,那么在插入時添加 SOOrder 的任何其他方法都將無法呼叫您的事件處理程式,直到您的方法被呼叫以添加事件處理程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366414.html
標籤:C# 网站 锐化 acumatica-kb
