我正在从Acumatica 2018 R2升级到2019 R1的过程中。在我的许多自定义设置中,我都有通过单击按钮或事件处理程序触发的代码,这些代码可以设置/更改自定义字段的值。这在2018 R2中按预期工作。但是,在2019 R1中,自定义字段上的值未更新。这是一个简单的例子。
public class SOOrderEntry_SOOpenPOsGILink_Extension : PXGraphExtension<SOOrderEntry>
{
protected virtual void SOLine_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
SOLine row = (SOLine)e.Row;
if (row != null)
{
bool isEmpty = true;
SOLineExt ext = row.GetExtension<SOLineExt>();
// logic determining value of isEmpty
ext.UsrEnableOpenPOs = isEmpty;
}
}
}
[UsrEnableOpenPOs
定义为以下内容。
public class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine>
{
#region UsrEnableOpenPOs
[PXBool]
[PXUIField(DisplayName="EnableOpenPOs", Enabled = false, Visible=false)]
[PXUnboundDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
public virtual bool? UsrEnableOpenPOs { get; set; }
public abstract class usrEnableOpenPOs : PX.Data.BQL.BqlBool.Field<usrEnableOpenPOs> { }
#endregion
}
在此示例中,当在SO订单输入屏幕上选择SOLine时,SOLineExt.UsrEnableOpenPOs
的值应设置为isEmpty
的值。此代码在2018 R2中有效,并且可以正确更新UsrEnableOpenPOs
。但是,在2019 R1中,代码已正确触发并运行,但屏幕上的值未更新。
正如我所提到的,我们有很多实例正在遇到此问题。在某些情况下,代码是通过单击按钮触发的,而在其他情况下,是通过不同的事件(如RowSelected,RowInserting,FieldUpdated和RowUpdated)触发的。
我将对为什么此代码不再起作用以及如何解决此问题提供一些见解。
应始终尝试在缓存与行实例中设置值。
ex:
sender.SetValueExt<SOLineExt.usrEnableOpenPOs>(row, isEmptry);
未绑定字段应在RowSelecting或FieldSelecting事件中设置。 RowSelected事件应用于UI更改,例如禁用,可见等字段。