我在Item class屏幕中添加了一些自定义代码,以创建具有相同类的Inventory Item。当用户单击"创建项目"按钮时,会弹出一个面板,在提交之前输入项目名称。我需要该字段像"库存项目"屏幕上的原始库存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>
关于如何正确地做到这一点,有什么想法吗?感谢
当使用PXFilter
类型的MyPanel
数据视图启动时,最初的路径是正确的。InventoryItem
用作MyPanel
视图的主DAC时出现了第一个问题:
- 在
INItemClassMaint
BLC中,已经有一个InventoryItem
用作主DAC的数据视图(Items
),通过声明另一个具有相同主DAC的视图,可以强制两个视图共享相同的PXCache
实例,除非它们绑定到表示UI中完全相同记录的PXForm 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; } }
INItemClassMaintExt
类中要突出显示的关键项目:
- 使用自定义
CreateStockItemParams
DAC,该DAC未定义关键字段 -
FieldSelecting
和FieldVerifying事件的
INItemClassMaintExt.InventoryCD
字段处理程序,以复制库存项目屏幕中存货ID查找的行为(支持多个分段和分段级验证)