自定义 PXSelector 控件在用户在网格上添加另一行时自行清除
Custom PXSelector Control self Clears when user adds another row on Grid
我在 Acumatica 发票和备忘录 (ScreenID=AR301000) 中创建了一个 自定义 PXSelector 控件 字段。该控件位于 文档详细信息网格 中。选择器加载值很好,但问题是如果用户将另一行添加到 文档详细信息网格 ,在前一行中选择的值会自动清除???
下面是我的代码:
using PX.Data.ReferentialIntegrity.Attributes;
using PX.Data;
using PX.Objects.AR;
using PX.Objects.CM;
using PX.Objects.Common.Discount.Attributes;
using PX.Objects.Common.Discount;
using PX.Objects.Common;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.DR;
using PX.Objects.GL.DAC.Abstract;
using PX.Objects.GL;
using PX.Objects.IN;
using PX.Objects.PM;
using PX.Objects.TX;
using PX.Objects;
using System.Collections.Generic;
using System.Diagnostics;
using System;
namespace PX.Objects.AR
{
public class ARTranExt : PXCacheExtension<PX.Objects.AR.ARTran>
{
#region UsrResource
[PXDBInt]
[PXUIField(DisplayName="Resource")]
[PXSelector(
typeof(Search<CSAttributeDetail.valueID,Where<CSAttributeDetail.attributeID, Equal<AttributeExtender.resource>>>),
typeof(CSAttributeDetail.valueID),
typeof(CSAttributeDetail.description),
SubstituteKey = typeof(CSAttributeDetail.valueID)
)]
public virtual int? UsrResource { get; set; }
public abstract class usrResource : PX.Data.BQL.BqlInt.Field<usrResource> { }
#endregion
}
public static class AttributeExtender
{
public const string Resource = "RESOURCE";
public class resource : PX.Data.BQL.BqlString.Constant<resource>
{
public resource() : base(Resource) {; }
}
}
}
可能是什么问题?
CSAttributeDetail.ValueID 在数据库中定义为 nvarchar(10)。根据您的选择器,您正在尝试将 nvarchar(10) (字符串)值分配给整数字段。我试过了,如果你的属性的 ValueID 是数字,它就可以工作,但你没有指出你的 ValueID 的值是什么。由于我可以通过添加基于字符的代码而不是数字的属性详细信息来重现此行为,我怀疑您的属性的详细信息值是字母而不是数字。
确保您的属性详细信息的 ValueID 始终是整数值,或者(最好)将您的用户字段更改为 nvarchar(10)。
不相关,但值得注意...因为您的 PXSelector returns CSAttributeDetail.valueID 存储在字段中,您不需要定义相同字段的 SubstituteKey。
我在 Acumatica 发票和备忘录 (ScreenID=AR301000) 中创建了一个 自定义 PXSelector 控件 字段。该控件位于 文档详细信息网格 中。选择器加载值很好,但问题是如果用户将另一行添加到 文档详细信息网格 ,在前一行中选择的值会自动清除??? 下面是我的代码:
using PX.Data.ReferentialIntegrity.Attributes;
using PX.Data;
using PX.Objects.AR;
using PX.Objects.CM;
using PX.Objects.Common.Discount.Attributes;
using PX.Objects.Common.Discount;
using PX.Objects.Common;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.DR;
using PX.Objects.GL.DAC.Abstract;
using PX.Objects.GL;
using PX.Objects.IN;
using PX.Objects.PM;
using PX.Objects.TX;
using PX.Objects;
using System.Collections.Generic;
using System.Diagnostics;
using System;
namespace PX.Objects.AR
{
public class ARTranExt : PXCacheExtension<PX.Objects.AR.ARTran>
{
#region UsrResource
[PXDBInt]
[PXUIField(DisplayName="Resource")]
[PXSelector(
typeof(Search<CSAttributeDetail.valueID,Where<CSAttributeDetail.attributeID, Equal<AttributeExtender.resource>>>),
typeof(CSAttributeDetail.valueID),
typeof(CSAttributeDetail.description),
SubstituteKey = typeof(CSAttributeDetail.valueID)
)]
public virtual int? UsrResource { get; set; }
public abstract class usrResource : PX.Data.BQL.BqlInt.Field<usrResource> { }
#endregion
}
public static class AttributeExtender
{
public const string Resource = "RESOURCE";
public class resource : PX.Data.BQL.BqlString.Constant<resource>
{
public resource() : base(Resource) {; }
}
}
}
可能是什么问题?
CSAttributeDetail.ValueID 在数据库中定义为 nvarchar(10)。根据您的选择器,您正在尝试将 nvarchar(10) (字符串)值分配给整数字段。我试过了,如果你的属性的 ValueID 是数字,它就可以工作,但你没有指出你的 ValueID 的值是什么。由于我可以通过添加基于字符的代码而不是数字的属性详细信息来重现此行为,我怀疑您的属性的详细信息值是字母而不是数字。
确保您的属性详细信息的 ValueID 始终是整数值,或者(最好)将您的用户字段更改为 nvarchar(10)。
不相关,但值得注意...因为您的 PXSelector returns CSAttributeDetail.valueID 存储在字段中,您不需要定义相同字段的 SubstituteKey。