C# 将库存项目查找添加到面板

C# 将库存项目查找添加到面板,c#,acumatica,C#,Acumatica,我向Item Class屏幕添加了一些自定义代码,以创建具有相同类的库存项目。当用户单击“创建项目”按钮时,会弹出一个面板,在提交之前输入项目名称。我需要该字段是一个类似于库存项目屏幕上的原始库存ID字段的查找。我已经在面板上找到了查找结果,但无论何时选择一个项目,它都会切换回列表中的第一个项目 public PXFilter<InventoryItem> MyPanel; // in INItemClassMaint extension public PXSelect<I

我向Item Class屏幕添加了一些自定义代码,以创建具有相同类的库存项目。当用户单击“创建项目”按钮时,会弹出一个面板,在提交之前输入项目名称。我需要该字段是一个类似于库存项目屏幕上的原始库存ID字段的查找。我已经在面板上找到了查找结果,但无论何时选择一个项目,它都会切换回列表中的第一个项目

 public PXFilter<InventoryItem> MyPanel; // in INItemClassMaint extension
 public PXSelect<InventoryItem, Where<InventoryItem.stkItem, Equal<boolTrue>, And<Match<Current<AccessInfo.userName>>>>> Item;

 // on in201000.aspx page

 <px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="MyPanel" AcceptButtonID="CstButton6" DesignView="Hidden" Caption="Create Item" CaptionVisible="True" LoadOnDemand="True" CreateOnDemand="False">
    <px:PXFormView runat="server" ID="CstFormView3" DataMember="Item" DataSourceID="ds" DefaultControlID="edInventoryCD">
        <Template>
            <px:PXLayoutRule runat="server" ID="CstPXLayoutRule4" StartColumn="True" />
            <px:PXSegmentMask runat="server" ID="CstPXSegmentMask10" DataField="InventoryCD" /></Template></px:PXFormView>
    <px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
        <px:PXButton runat="server" ID="CstButton6" Text="Create" DialogResult="OK">
            <AutoCallBack Command="Save" /></px:PXButton>
        </px:PXPanel></px:PXSmartPanel>
public PXFilter MyPanel;//在INItemClassMaint扩展中
公共选择项目;
//在in210000.aspx页面上

关于如何正确做到这一点,有什么想法吗?谢谢

当您开始使用
PXFilter
类型的
MyPanel
数据视图时,您最初的路径是正确的。第一个问题是
InventoryItem
用作
MyPanel
视图的主DAC:

  • INItemClassMaint
    BLC中,已经有一个
    InventoryItem
    用作主DAC(
    Items
    )的数据视图,通过声明另一个具有相同主DAC的视图,可以强制两个视图共享相同的
    PXCache
    实例,除非它们绑定到表示UI中完全相同的记录的PXForms,否则决不建议使用此选项
  • PXFilter
    类型的数据视图不能与至少有一个关键字段的DAC一起使用,否则每当用户更改一个关键字段值时,框架就会调用Cancel命令
  • 下面是在项目类别屏幕上添加自定义对话框的示例,用于创建当前项目类别的新库存项目:

    • Aspx中自定义PXSmartPanel的声明:

      <px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="CreateStockItemDialog" Caption="Create Item" AutoRepaint="True"
          AcceptButtonID="CstButton6" CaptionVisible="True" >
          <px:PXFormView runat="server" ID="CstFormView3" DataMember="CreateStockItemDialog" SkinID="Transparent">
              <Template>
                  <px:PXLayoutRule runat="server" StartColumn="True" />
                  <px:PXSegmentMask runat="server" ID="CstPXSegmentMask10" DataField="InventoryCD" CommitChanges="true" />
              </Template>
          </px:PXFormView>
              <px:PXLayoutRule runat="server" StartRow="True" />
              <px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
                  <px:PXButton runat="server" ID="CstButton6" Text="OK" DialogResult="OK" />
          </px:PXPanel>
      </px:PXSmartPanel>
      
      
      
    • INItemClassMaint BLC扩展的实现:

      public class INItemClassMaintExt : PXGraphExtension<INItemClassMaint>
      {
          [Serializable]
          public class CreateStockItemParams : IBqlTable
          {
              #region InventoryCD
              public abstract class inventoryCD : PX.Data.IBqlField
              {
              }
              [PXString]
              [PXUIField(DisplayName = "Inventory ID")]
              public virtual string InventoryCD { get; set; }
              #endregion
          }
      
          public PXFilter<CreateStockItemParams> CreateStockItemDialog;
      
          public PXDBAction<INItemClass> CreateStockItem;
          [PXButton]
          [PXUIField(DisplayName = "Create Stock Item")]
          protected void createStockItem()
          {
              var result = CreateStockItemDialog.AskExt((graph, viewname) =>
              {
                  CreateStockItemDialog.Cache.Clear();
              });
              if (result != WebDialogResult.OK) return;
      
              var itemParams = CreateStockItemDialog.Current;
              if (string.IsNullOrEmpty(itemParams.InventoryCD))
              {
                  CreateStockItemDialog.Cache.RaiseExceptionHandling<CreateStockItemParams.inventoryCD>(itemParams,
                      itemParams.InventoryCD, new PXSetPropertyException(ErrorMessages.FieldIsEmpty, 
                          PXUIFieldAttribute.GetDisplayName< CreateStockItemParams.inventoryCD>(CreateStockItemDialog.Cache)));
                  return;
              }
      
              InventoryItemMaint maint = PXGraph.CreateInstance<InventoryItemMaint>();
              var newItem = new InventoryItem();
              newItem.InventoryCD = itemParams.InventoryCD;
              newItem = maint.Item.Insert(newItem);
              newItem.ItemClassID = Base.itemclass.Current.ItemClassID;
              maint.Item.Update(newItem);
      
              throw new PXRedirectRequiredException(maint, "New Stock Item");
          }
      
          protected void CreateStockItemParams_InventoryCD_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
          {
              e.IsAltered = true;
              object ret = e.ReturnValue;
      
              PXDimensionAttribute restoreCombo = null;
              foreach (PXEventSubscriberAttribute attr in sender.Graph.Caches[typeof(InventoryItem)]
                  .GetAttributesReadonly<InventoryItem.inventoryCD>())
              {
                  if (attr is PXDimensionAttribute)
                  {
                      if (((PXDimensionAttribute)attr).ValidComboRequired)
                      {
                          ((PXDimensionAttribute)attr).ValidComboRequired = false;
                          restoreCombo = (PXDimensionAttribute)attr;
                          break;
                      }
                  }
              }
              sender.Graph.Caches[typeof(InventoryItem)].
                  RaiseFieldSelecting<InventoryItem.inventoryCD>(null, ref ret, true);
              if (restoreCombo != null)
              {
                  restoreCombo.ValidComboRequired = true;
              }
              e.ReturnState = ret;
          }
      
          protected void CreateStockItemParams_InventoryCD_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
          {
              object val = e.NewValue;
              sender.Graph.Caches[typeof(InventoryItem)].RaiseFieldVerifying<InventoryItem.inventoryCD>(null, ref val);
              var item = (InventoryItem)PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.SelectWindowed(Base, 0, 1, val);
              if (item != null)
              {
                  throw new PXSetPropertyException("Stock Item with Inventory ID {0} already exists.",
                      sender.Graph.Caches[typeof(InventoryItem)].GetValueExt<InventoryItem.inventoryCD>(item));
              }
              e.NewValue = val;
          }
      }
      
      public类INItemClassMaintExt:PXGraphExtension
      {
      [可序列化]
      公共类CreateStockItemParams:IBqlTable
      {
      #区域目录
      公共抽象类inventoryCD:PX.Data.IBqlField
      {
      }
      [字符串]
      [PXUIField(DisplayName=“库存ID”)]
      公共虚拟字符串InventoryCD{get;set;}
      #端区
      }
      公共PXFilter CreateStockItemDialog;
      公共PXDBAction CreateStockItem;
      [按钮]
      [PXUIField(DisplayName=“创建库存项目”)]
      受保护的无效createStockItem()
      {
      var result=CreateStockItemDialog.AskExt((图形,视图名称)=>
      {
      CreateStockItemDialog.Cache.Clear();
      });
      if(result!=WebDialogResult.OK)返回;
      var itemParams=CreateStockItemDialog.Current;
      if(string.IsNullOrEmpty(itemParams.InventoryCD))
      {
      CreateStockItemDialog.Cache.RaiseExceptionHandling(itemParams,
      itemParams.InventoryCD,新PXSetPropertyException(ErrorMessages.FieldIsEmpty,
      PXUIFieldAttribute.GetDisplayName(CreateStockItemDialog.Cache));
      返回;
      }
      InventoryItemMaint maint=PXGraph.CreateInstance();
      var newItem=newinventoryItem();
      newItem.InventoryCD=itemParams.InventoryCD;
      newItem=维护项目插入(newItem);
      newItem.ItemClassID=Base.itemclass.Current.ItemClassID;
      维护项目更新(新项目);
      抛出新的异常(维护,“新库存项目”);
      }
      受保护的无效CreateStockItemParams\u InventoryCD\u字段选择(PXCache sender,PXFieldSelectingEventArgs e)
      {
      e、 IsAltered=真;
      对象ret=e.ReturnValue;
      PXDimensionAttribute restoreCombo=null;
      在sender.Graph.Caches[typeof(InventoryItem)]
      .GetAttributesReadonly())
      {
      if(attr是PXDimensionAttribute)
      {
      如果(((PXDimensionAttribute)attr.validCompoRequired)
      {
      ((PXDimensionAttribute)attr.ValidComboRequired=false;
      restoreCombo=(PXDimensionAttribute)属性;
      打破
      }
      }
      }
      sender.Graph.Caches[typeof(InventoryItem)]。
      RaiseFieldSelecting(null,ref-ret,true);
      if(restoreCombo!=null)
      {
      restoreCombo.ValidComboRequired=true;
      }
      e、 ReturnState=ret;
      }
      受保护的无效CreateStockItemParams_InventoryCD_FieldVerification(PXCache发送方,PXFieldVerifyingEventArgs e)
      {
      对象val=e.NewValue;
      sender.Graph.Caches[typeof(InventoryItem)].RaiseFieldVerification(null,ref val);
      var item=(InventoryItem)PXSelect.selectedwindowed(Base,0,1,val);
      如果(项!=null)
      {
      抛出新的PXSetPropertyException(“库存ID为{0}的库存项已存在。”,
      sender.Graph.Caches[typeof(InventoryItem)].GetValueExt(item));
      }
      e、 NewValue=val;
      }
      }
      
    INItemClassMaintExt
    类中要突出显示的关键项:

  • 使用自定义
    CreateStockItemParams
    DAC,该DAC未定义关键字段
  • INItemClassMaintExt.InventoryCD
    fieldselection和FieldVerifying事件的字段处理程序,以从库存项目屏幕复制库存ID的行为(支持多段和段级验证)