如何有条件地将 PXTabItem 隐藏在 Acumatica 屏幕内?
How to conditionally hide PXTabItem inside an Acumatica screen?
我想隐藏“销售订单行佣金”选项卡,但我只想隐藏特定角色的选项卡。这可能吗?
选项 #1:使用 PXTabItem VisibleExp 属性
这种方法非常适合相当简单的声明性条件,它利用来自特定容器的输入控制值(PXForm 最常用于这种情况)。
例如,要隐藏 TR 类型订单的“销售订单佣金”选项卡,您应该编写 VisibleExp如下:
<px:PXTabItem Text="Commissions"
VisibleExp="DataControls["edOrderType"].Value!=TR"
BindingContext="form"
RepaintOnDemand="false">
上面代码片段中使用的 3 个 PXTabItem 属性的快速概览:
- BindingContext: 承载输入控件的容器控件的 ID,用于为 PXTabItem
计算可见 属性
- VisibleExp: PXTabItem
计算可见性的表达式属性
- RepaintOnDemand:控制PXTab控件的初始化。当设置为 True(默认值)时,PXTabItem 将仅在用户选择选项卡时初始化,否则,它将在每次回发时初始化。
选项 #2:在代码中隐藏放置在 PXTabItem 中的所有控件
毫无疑问,与 PXTabItem VisibleExp 属性 相比,这种方法在灵活性方面向前迈进了一步。它允许您在业务逻辑中编写更复杂的条件,而不依赖于网页。
要隐藏“销售订单佣金”选项卡,您应该订阅 SOOrder 的 RowSelected 处理程序,如下所示:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
SOOrder order = (SOOrder)e.Row;
if (order == null) return;
bool financeRoleMember = System.Web.Security.Roles.IsUserInRole("FINANCE");
Base.SalesPerTran.AllowSelect = financeRoleMember;
PXUIFieldAttribute.SetVisible<SOOrder.salesPersonID>(Base.Document.Cache, null, financeRoleMember);
}
}
将 AllowSelect 属性 设置为 false,SalesPerTran 数据视图将自动隐藏每个 PXGrid ,其 DataMember 属性 设置为 SalesPerTran。由于销售订单佣金选项卡还包含默认销售员查找,我们需要额外设置 Visible 属性 为 false 用于 PXUIFieldAttribute 修饰 SOOrder SalesPersonID 字段。 PXTabItem 在不包含可见控件时自动隐藏。
请注意,类似于 PXTabItem VisibleExp 属性,为了使此方法正常运行,您必须始终设置 RepaintOnDemand 到 false 对于您有条件隐藏的 PXTabItem。对于这个特定的例子,我们可以跳过这一步,因为 RepaintOnDemand 在原始中被设置为 false SO301000.aspx 由 Acumatica 分发的文件。
我想隐藏“销售订单行佣金”选项卡,但我只想隐藏特定角色的选项卡。这可能吗?
选项 #1:使用 PXTabItem VisibleExp 属性
这种方法非常适合相当简单的声明性条件,它利用来自特定容器的输入控制值(PXForm 最常用于这种情况)。
例如,要隐藏 TR 类型订单的“销售订单佣金”选项卡,您应该编写 VisibleExp如下:
<px:PXTabItem Text="Commissions"
VisibleExp="DataControls["edOrderType"].Value!=TR"
BindingContext="form"
RepaintOnDemand="false">
上面代码片段中使用的 3 个 PXTabItem 属性的快速概览:
- BindingContext: 承载输入控件的容器控件的 ID,用于为 PXTabItem 计算可见 属性
- VisibleExp: PXTabItem 计算可见性的表达式属性
- RepaintOnDemand:控制PXTab控件的初始化。当设置为 True(默认值)时,PXTabItem 将仅在用户选择选项卡时初始化,否则,它将在每次回发时初始化。
选项 #2:在代码中隐藏放置在 PXTabItem 中的所有控件
毫无疑问,与 PXTabItem VisibleExp 属性 相比,这种方法在灵活性方面向前迈进了一步。它允许您在业务逻辑中编写更复杂的条件,而不依赖于网页。
要隐藏“销售订单佣金”选项卡,您应该订阅 SOOrder 的 RowSelected 处理程序,如下所示:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
SOOrder order = (SOOrder)e.Row;
if (order == null) return;
bool financeRoleMember = System.Web.Security.Roles.IsUserInRole("FINANCE");
Base.SalesPerTran.AllowSelect = financeRoleMember;
PXUIFieldAttribute.SetVisible<SOOrder.salesPersonID>(Base.Document.Cache, null, financeRoleMember);
}
}
将 AllowSelect 属性 设置为 false,SalesPerTran 数据视图将自动隐藏每个 PXGrid ,其 DataMember 属性 设置为 SalesPerTran。由于销售订单佣金选项卡还包含默认销售员查找,我们需要额外设置 Visible 属性 为 false 用于 PXUIFieldAttribute 修饰 SOOrder SalesPersonID 字段。 PXTabItem 在不包含可见控件时自动隐藏。
请注意,类似于 PXTabItem VisibleExp 属性,为了使此方法正常运行,您必须始终设置 RepaintOnDemand 到 false 对于您有条件隐藏的 PXTabItem。对于这个特定的例子,我们可以跳过这一步,因为 RepaintOnDemand 在原始中被设置为 false SO301000.aspx 由 Acumatica 分发的文件。