如何在 PM301000 屏幕上保存禁用两个字段的记录

How to save a record with two fields disabled on the PM301000 screen

大家下午好,

我需要你的帮助,我想在详细信息选项卡成本预算的 PM301000 项目屏幕上记录一个或多个记录。 记录一条或多条记录时,必须禁用两个“采购订单标记”和“供应商 ID”字段。当 Mark for PO 字段的条件等于 true 时。

我使用了 RowPersisting 事件,它禁用了它,但是当我修改或离开注册表时,这些字段又被启用了。

请帮帮我或者告诉我应该怎么做,我的代码如下。

提前致谢。

namespace PX.Objects.PM
{
    public class PMBudgetExt : PXCacheExtension<PX.Objects.PM.PMBudget>
    {
        #region UsrVendorID


        [PXDBInt]
        [PXUIField(DisplayName = "Vendor ID", Visibility = PXUIVisibility.Visible)]

        [PXDimensionSelectorAttribute("VENDOR", typeof(Search<VendorR.bAccountID, Where<VendorR.type, Equal<BAccountType.vendorType>,
                                        And<VendorR.status, Equal<BAccount.status.active>>>>), 
            typeof(VendorR.acctCD), new Type[] { typeof(VendorR.acctCD), typeof(VendorR.acctName) })]
        public virtual int? UsrVendorID { get; set; }
        public abstract class usrVendorID : PX.Data.BQL.BqlInt.Field<usrVendorID> { }
        #endregion

        #region UsrMarkforPO

        [PXDBBool()]
        [PXDefault(false)]
        [PXUIField(DisplayName = "Mark for PO")]  

        public virtual bool? UsrMarkforPO { get; set; }
        public abstract class usrMarkforPO : PX.Data.BQL.BqlBool.Field<usrMarkforPO> { }
        #endregion
    }
}

namespace PX.Objects.PM
{
    public class ProjectEntry_Extension : PXGraphExtension<ProjectEntry>
    {      
        #region Event Handlers       
        protected void PMCostBudget_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
        {
            PMCostBudget newRow = (PMCostBudget)e.Row;
            if (newRow == null) return;
            PMBudgetExt newRowE = PXCache<PMBudget>.GetExtension<PMBudgetExt>(newRow);

            if (Base.CostBudget.Cache.AllowUpdate == true)
            {
                if (newRowE.UsrMarkforPO == true)
                {
                    PXUIFieldAttribute.SetEnabled<PMBudgetExt.usrMarkforPO>(cache, newRow, false);
                    PXUIFieldAttribute.SetEnabled<PMBudgetExt.usrVendorID>(cache, newRow, false);                    
                }
            }
        }
        #endregion
    }
}

RowPersisting 事件仅在保存事件时执行。因此它不适合设置字段状态。每次选择要在屏幕上显示的记录时执行的 RowSelected 事件会得到更好的结果。您应该在每个回调上设置状态,无论它是启用还是禁用。此外,应该在您用于设置字段状态的相同 DAC 类型上声明事件,以便缓存对象匹配。

    public void PMBudget_RowSelected(PXCache sender, PXRowSelectedEventArgs e, PXRowSelected del)
    {
      if (del != null)
      {
         del(sender, e);
      }

      bool isFieldEnabled = [your_condition];
      PXUIFieldAttribute.SetEnabled<PMBudget.field>(sender, e.Row, isFieldEnabled);
    }