动态隐藏用户界面中的选项卡

时间:2016-05-04 14:06:06

标签: acumatica

我有一个带PXTab控件的页面,想要动态显示或隐藏页面上的各个标签页。如何在运行时控制选项卡的可见性?

1 个答案:

答案 0 :(得分:7)

您可以通过以下两种方式之一来完成:

  1. 在ASPX页面中的PXTabItem上设置VisibleExp属性
  2. 通过 启用/禁用视图的AllowSelect属性作为 该选项卡上显示的网格的DataMember
  3. 方法1 - VisibleExp 在此方法中,您可以直接在屏幕的ASPX代码中编写选项卡应该可见的条件。

    <px:PXTabItem Text="Tax Agency Settings" BindingContext="tab" 
        VisibleExp="DataControls[&quot;chkTaxAgency&quot;].Value = 1">
    

    请注意,绑定上下文很重要,因为它指定了您要在VisibleExp中访问哪个元素的DataControl。 DataControls也是用户界面字段值的集合,因此您需要指定控件的ID(而不是数据访问类字段)。

    但是,这种方法在很多方面都非常有限:

    • 条件检查仅限于UI中可用的控件, 所以不可能在内部状态下调节可见性 系统的。
    • 有时候这种方法需要你加入 ASPX中的“假”数据控件只会被签入 VisibleExp,但用户实际上看不到。
    • 似乎不支持包括AND / OR在内的复杂条件。
    • 丑陋的&quot;实体而不是表达式中的正常引号 - 不是 特别易读。

    最重要的是,如果您需要禁用特定文档类型的选项卡,则无法将常量硬编码到VisibleExp中。您将明确地编写类似的内容:VisibleExp =“DataControls [”edDocumentType“]。Value!= CHK”

    硬编码通常被认为是一种非常糟糕的开发实践。它对代码可维护性构成了重大威胁:可能上述代码将在未来破坏某些东西。例如,如果您决定将CHK的文档代码重命名为CHQ。

    除此之外,当您突然发现需要隐藏选项卡不仅用于检查而且还用于其他文档类型时,此解决方案不容易推广。这是由于缺少上面提到的复杂条件表达式。

    方法2 - 允许选择 这种方法的想法是 - 如果你隐藏了标签项中的所有控件,那么Acumatica会自动隐藏没有可见控件的标签。

    让我们举个例子:假设您需要隐藏一个名为Applications的选项卡,具体取决于在SO303000(发票)中选择的文档类型:

    我们感兴趣的标签有一个网格控件,其数据成员设置为Adjustments:

    <px:PXTabItem Text="Applications" RepaintOnDemand="false">
        <Template>
            <px:PXGrid ID="detgrid" DataSourceID="ds" SkinID="Details"> 
                <Levels>
                    <px:PXGridLevel DataMember="Adjustments">
                    ............
                    </px:PXGridLevel>
                </Levels>
            </px:PXGrid> 
        </Template>
    </px:PXTabItem>
    

    并非此标签项只有一个控件 - PXGrid。 另请注意此处所需的财产 - RepaintOnDemand="false"。此属性指示项目变为可见后控件刷新选项卡项目内容(和选择数据)。不幸的是,将其设置为false会导致某些性能损失。特别是,调整视图'选择将更频繁地调用。

    目前,Tab是“聪明的”,因为它理解当它的子控件(PXGridLevel)无法对其数据成员执行选择时;在这种情况下,选项卡会隐藏自己的UI。这就是您可以通过设置与调整对应的缓存的AllowSelect属性来控制选项卡的可见性的原因:

    Adjustments.Cache.AllowSelect = 
        doc.DocType != ARDocType.CashSale 
        && doc.DocType != ARDocType.CashReturn;
    

    上面的代码写在图表的ARInvoice_RowSelected处理程序中,其中ARInvoice是主要的DAC和页面主记录的类型。因此,每次选择ARInvoice时,标签项都将变为可见或不可见,具体取决于文档类型。

    这种方法也有其自身的局限性:

    • 你应该永远记住,禁用它是不够的 AllowSelect,您还应该在需要时启用它。所以你需要 每次调用事件时都要评估此属性。
    • 如果不设置PXTabItem的RepaintOnDemand,此方法似乎不起作用 属性为false(见上文)。

    来源:http://asiablog.acumatica.com/2016/05/hiding-tab-from-user-interface.html