根据Acumatica中另一个字段的可编辑状态使自定义字段可编辑

根据Acumatica中另一个字段的可编辑状态使自定义字段可编辑,acumatica,Acumatica,我试图根据现有字段的可编辑状态启用和禁用一个新的自定义字段。我不知道其他字段启用与否的确切规则。我试图在不同的事件(例如RowSelecting、RowSelected)中检测另一个字段的启用状态,但其enabled属性似乎始终为true,即使该字段显示在网格中,双击也无法编辑。有什么想法吗?我确定字段启用状态的方法是使用以下代码 protected bool? IsFieldEnabled(PXCache cache, object row, string fieldName)

我试图根据现有字段的可编辑状态启用和禁用一个新的自定义字段。我不知道其他字段启用与否的确切规则。我试图在不同的事件(例如RowSelecting、RowSelected)中检测另一个字段的启用状态,但其enabled属性似乎始终为true,即使该字段显示在网格中,双击也无法编辑。有什么想法吗?我确定字段启用状态的方法是使用以下代码

    protected bool? IsFieldEnabled(PXCache cache, object row, string fieldName)
    {
        var attr = cache.GetAttributesOfType<PXUIFieldAttribute>(row, fieldName).FirstOrDefault();
        bool? isEnabled = null;

        if (attr != null)
        {
            isEnabled = ((PXUIFieldAttribute)attr).Enabled;
        }

        return isEnabled;
    }
protectedbool?IsFieldEnabled(PXCache缓存、对象行、字符串字段名)
{
var attr=cache.GetAttributesOfType(行,字段名).FirstOrDefault();
bool?isEnabled=null;
如果(attr!=null)
{
isEnabled=((PXUIFieldAttribute)attr).Enabled;
}
返回被禁止;
}

仅供参考,我试图模拟的字段启用状态是SOShipLine和SOShipLineSplit的LotusSerialNBR,它出现在装运详细信息选项卡和分配对话框中

啊哈,我终于能够通过在字段选择处理程序中处理自定义字段来影响其可编辑状态。当我在FieldSelecting中检查另一个字段的启用状态并设置新字段的启用状态时,它现在会模仿我最初想要的状态;以及初始页面加载。下面是所有感兴趣的人的代码

    protected void SOShipLine_UsrMACID_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e, PXFieldSelecting InvokeBaseHandler)
    {
        if (InvokeBaseHandler != null)
        {
            InvokeBaseHandler(cache, e);
        }

        var row = (SOShipLine)e.Row;
        bool? isSerialNumberEditable = IsFieldEditable(cache, row, "LotSerialNbr");

        if (isSerialNumberEditable != null)
        {
            PXUIFieldAttribute.SetEnabled<SOShipLineExtension.usrMACID>(cache, row, isSerialNumberEditable.Value);
        }
    }

    protected bool? IsFieldEditable(PXCache cache, object row, string fieldName)
    {
        var attr = cache.GetAttributesOfType<PXUIFieldAttribute>(row, fieldName).FirstOrDefault();
        bool? isEnabled = null;

        if (attr != null)
        {
            isEnabled = cache.AllowUpdate && ((PXUIFieldAttribute)attr).Enabled;
        }

        return isEnabled;
    }
protectedvoid-SOShipLine\u-UsrMACID\u-fieldselection(PXCache缓存、PXFieldSelectingEventArgs e、pxfieldselectinginvokebasehandler)
{
if(InvokeBaseHandler!=null)
{
InvokeBaseHandler(缓存,e);
}
var row=(SOShipLine)e.row;
bool?IsSerialNumber可编辑=IsFieldEditable(缓存,行,“LotSerialNbr”);
如果(IsSerialNumber可编辑!=null)
{
PXUIFieldAttribute.SetEnabled(缓存、行、ISSerialNumber可编辑的.Value);
}
}
受保护的布尔?IsFieldEditable(PXCache缓存、对象行、字符串字段名)
{
var attr=cache.GetAttributesOfType(行,字段名).FirstOrDefault();
bool?isEnabled=null;
如果(attr!=null)
{
isEnabled=cache.AllowUpdate&((PXUIFieldAttribute)attr).Enabled;
}
返回被禁止;
}

啊哈,我终于能够通过在字段选择处理程序中处理自定义字段来影响其可编辑状态。当我在FieldSelecting中检查另一个字段的启用状态并设置新字段的启用状态时,它现在会模仿我最初想要的状态;以及初始页面加载。下面是所有感兴趣的人的代码

    protected void SOShipLine_UsrMACID_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e, PXFieldSelecting InvokeBaseHandler)
    {
        if (InvokeBaseHandler != null)
        {
            InvokeBaseHandler(cache, e);
        }

        var row = (SOShipLine)e.Row;
        bool? isSerialNumberEditable = IsFieldEditable(cache, row, "LotSerialNbr");

        if (isSerialNumberEditable != null)
        {
            PXUIFieldAttribute.SetEnabled<SOShipLineExtension.usrMACID>(cache, row, isSerialNumberEditable.Value);
        }
    }

    protected bool? IsFieldEditable(PXCache cache, object row, string fieldName)
    {
        var attr = cache.GetAttributesOfType<PXUIFieldAttribute>(row, fieldName).FirstOrDefault();
        bool? isEnabled = null;

        if (attr != null)
        {
            isEnabled = cache.AllowUpdate && ((PXUIFieldAttribute)attr).Enabled;
        }

        return isEnabled;
    }
protectedvoid-SOShipLine\u-UsrMACID\u-fieldselection(PXCache缓存、PXFieldSelectingEventArgs e、pxfieldselectinginvokebasehandler)
{
if(InvokeBaseHandler!=null)
{
InvokeBaseHandler(缓存,e);
}
var row=(SOShipLine)e.row;
bool?IsSerialNumber可编辑=IsFieldEditable(缓存,行,“LotSerialNbr”);
如果(IsSerialNumber可编辑!=null)
{
PXUIFieldAttribute.SetEnabled(缓存、行、ISSerialNumber可编辑的.Value);
}
}
受保护的布尔?IsFieldEditable(PXCache缓存、对象行、字符串字段名)
{
var attr=cache.GetAttributesOfType(行,字段名).FirstOrDefault();
bool?isEnabled=null;
如果(attr!=null)
{
isEnabled=cache.AllowUpdate&((PXUIFieldAttribute)attr).Enabled;
}
返回被禁止;
}

FYI,我试图模拟的字段启用状态是LotusSerialNBR for SOShipLine和SOShipLineSplit,出现在装运详细信息选项卡和分配对话框中。这类内容可以有效地添加到问题中。尝试“编辑”链接:-)若要编辑,字段必须是可编辑的,并且行还必须允许更新(ViewName.AllowUpdate)。当您的字段显示为可编辑时,整行是否已禁用(行中没有字段可以更改)?RowSelected事件也应该可以工作,但是如果您正在进行图形扩展,那么可能需要在基本RowSelected之后运行逻辑?行是可更新的,而另一个字段有时是可编辑的,我正在尝试模拟。RowSelected事件位于图形扩展中,是的,我试图确定字段是否已启用。我将尝试在您提到的基本行Selected之后检查它。我向我的RowSelected处理程序添加了基本处理程序的调用,但这似乎没有帮助。这一次我注意到,对于页面的初始加载,现有字段为Enabled=true,但随后再次加载相同的页面Enabled=false。那么禁用可能发生在选定行之后?因此,第二次激发扩展行Selected时,它会将自定义字段Enabled=false设置为匹配;但是,页面上的新字段的行为仍然相同,并且可以编辑,就好像它没有做任何事情一样。也许在所选行中设置它太晚了?仅供参考,我试图模拟的字段启用状态是SOShipLine和SOShipLineSplit的LotSerialNbr,出现在装运详细信息选项卡和分配对话框中。这类内容可以有效地添加到问题中。尝试“编辑”链接:-)若要编辑,字段必须是可编辑的,并且行还必须允许更新(ViewName.AllowUpdate)。当您的字段显示为可编辑时,整行是否已禁用(行中没有字段可以更改)?RowSelected事件也应该可以工作,但是如果您正在进行图形扩展,那么可能需要在基本RowSelected之后运行逻辑?行是可更新的,而另一个字段有时是可编辑的,我正在尝试模拟。RowSelected事件位于图形扩展中,是的,我试图确定字段是否已启用。我将尝试在您提到的基本行Selected之后检查它。我向我的RowSelected处理程序添加了基本处理程序的调用,但这似乎没有帮助。伊迪