如何检查是否按下了删除,因为删除项目时出现 MoveNext 错误

How to Check if Delete was Pressed as there is a MoveNext Error while deleting item

有没有办法检查是否在 Acumatica 屏幕中按下了删除操作?这是因为我有一个用于重新加载 StockItems 屏幕的代码,每当我删除一个项目时,它都会给我一个 movenext 错误,但该项目正在被成功删除。以下是我的重新加载代码:

[PXOverride]
  public void Persist(Action persist)
  {
   persist();// this will call base Persist();
   InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
   InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
   if (inv != null && inv.InventoryID.HasValue)
   {
      grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
      throw new PXRedirectRequiredException(grp, "Reloading Item");
   }
  }

作为我建议您添加到 DAC 字段 IsDeleted 的方法之一,如下所示:

[PXBool]
[PXDefault(false)]
public bool? IsDeleted { get; set; }

然后附加到 RowDeleting()。例如像这样:

protected virtual void ShipmentLine_RowDeleting(PXCache sender, PXRowDeletingEventArgs e)
{
    ShipmentLine line = (ShipmentLine)e.Row;
    line.IsDeleted = true;
}

最后将您的代码修改为以下场景:

[PXOverride]
public void Persist(Action persist)
{
  ShipmentLine  line = ViewShipmentLine.Current;
  if(line.IsDeleted)
  {
      //do some logic which you consider as nesessary
  }
  persist();// this will call base Persist();
  InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
  InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD,Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
  if (inv != null && inv.InventoryID.HasValue)
        {
              grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
  throw new PXRedirectRequiredException(grp, "Reloading Item");
        }
  }

希望对您有所帮助。

你可以按照Yura建议的方法,或者你可以用我认为的其他方法来实现..

你可以在调用base persist之前检查记录的缓存状态,如果缓存状态说它被删除,不要做你的重定向。

代码可能如下所示[未测试]

[PXOverride]
  public void Persist(Action persist)
  {
    bool isDeletion = false;
    InventoryItem  CurrentItem = this.Base.Item.Cache.Current as InventoryItem ;
    if(this.Base.Item.Cache.GetStatus(CurrentItem) == PXEntryStatus.Deleted) // Helps to check whether the operation is deletion
       isDeletion = true;
   persist();// this will call base Persist();
    if(!isDeletion)
    {
      InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
      InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
      if (inv != null && inv.InventoryID.HasValue)
      {
      grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
      throw new PXRedirectRequiredException(grp, "Reloading Item");
      }
    }
  }

编辑:

我发现上面的代码不能作为 InventoryItem

this.Base.Item.Current // is returning null

这是你的 movenext 错误的基本问题,所以我建议你按如下方式更新你的代码

[PXOverride]
        public void Persist(Action persist)
        {            
            persist();// this will call base Persist();
            InventoryItem CurrentItem = this.Base.Item.Current as InventoryItem;
            if (CurrentItem != null)
            {
                InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
                InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, CurrentItem.InventoryCD.Trim());
                if (inv != null && inv.InventoryID.HasValue)
                {
                    grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
                    throw new PXRedirectRequiredException(grp, "Reloading Item");
                }
            }
        }