3

我正在开发一个自定义页面,通过以分层顺序显示表数据来可视化父记录和子记录之间的关系。

我的 BLC 中有 2 个数据视图,我想将其用作两个PXGrid的数据源,以主/详细格式显示数据。在主网格中选择记录时,所有相关的子条目都应显示在详细信息网格中。

我应该如何在 Aspx 中声明我的 2 个PXGrid来完成这项任务?

4

1 回答 1

5

例如,如果某个 BLC 包含一个类别数据视图和一个相关产品数据视图,您可以指定类别视图作为主网格的数据源,并将产品视图指定为详细信息网格的数据源。在主网格中选择一个类别后,与该类别关联的所有产品都将显示在产品数据视图的详细信息网格中。

public class ProductCategories : PXGraph<ProductCategories>
{
    #region Actions
    public PXSave<Category> Save;
    public PXCancel<Category> Cancel;
    #endregion

    #region Data Members
    public PXSelect<Category> Categories;

    public PXSelect<CategoryProduct,
        Where<CategoryProduct.categoryID, 
            Equal<Current<Category.categoryID>>>> CategoryProducts;
    #endregion

    #region Event Handlers
    protected virtual void Category_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        this.CategoryProducts.Cache.AllowInsert = e.Row != null;
    }
    #endregion
}

如上面的代码片段所示,详细视图通过Current BQL 运算符与主视图一起引用。此外,请注意为类别DAC定义的RowSelected事件处理程序,如果主网格中没有单个记录,则禁用详细信息网格上的插入按钮。

下一步是在 Aspx 中配置主从PXGrid

  • 对于主网格,将SyncPosition属性设置为true,然后如下定义AutoCallBackOnChangeCommand属性,以在每次在主网格中选择不同的记录或根本不选择记录时相应地刷新详细信息网格:

    <px:PXGrid ID="masterGrid" runat="server" DataSourceID="ds" SkinID="Details"
        SyncPosition="True" Caption="Categories" CaptionVisible="True" Width="100%">
        <AutoCallBack Command="Refresh" Target="detailGrid" />
        <OnChangeCommand Command="Refresh" Target="detailGrid" />
        ...
    </px:PXGrid>
    
  • 对于细节网格,只需要定义一个Refresh CallbackCommand 来强制主网格选择数据以及细节网格。通过这样做,框架将引发先前定义的Category_RowSelected事件处理程序,并在主网格中没有记录的情况下禁用详细信息网格上的插入按钮:

    <px:PXGrid ID="detailGrid" runat="server" DataSourceID="ds" SkinID="Details"
        Caption="Products" CaptionVisible="True" Width="100%">
        <CallbackCommands>
            <Refresh SelectControlsIDs="masterGrid" />
        </CallbackCommands>
        ...
    </px:PXGrid>
    

为了更好的用户体验,建议将主从PXGrid放置在PXSplitContainer中,如下面的代码片段所示:

<px:PXSplitContainer runat="server" ID="sp" PositionInPercent="true" SplitterPosition="50"
    SkinID="Horizontal" Orientation="Horizontal" Panel1MinSize="250" Panel2MinSize="250">
    <AutoSize Enabled="true" Container="Window" />
    <Template1>
        <px:PXGrid ID="masterGrid" runat="server" DataSourceID="ds" SkinID="Details"
            SyncPosition="True" Caption="Categories" CaptionVisible="True" Width="100%">
            <AutoCallBack Command="Refresh" Target="detailGrid" />
            <OnChangeCommand Command="Refresh" Target="detailGrid" />
            <Levels>
                <px:PXGridLevel DataMember="Categories">
                    <Columns>
                        ...
                    </Columns>
                </px:PXGridLevel>
            </Levels>
            <AutoSize Enabled="True" />
        </px:PXGrid>
    </Template1>
    <Template2>
        <px:PXGrid ID="detailGrid" runat="server" DataSourceID="ds" SkinID="Details"
            Caption="Products" CaptionVisible="True" Width="100%">
            <CallbackCommands>
                <Refresh SelectControlsIDs="masterGrid" />
            </CallbackCommands>
            <Levels>
                <px:PXGridLevel DataMember="CategoryProducts">
                    <Columns>
                        ...
                    </Columns>
                </px:PXGridLevel>
            </Levels>
            <AutoSize Enabled="True" />
        </px:PXGrid>
    </Template2>
</px:PXSplitContainer>

以下是PXGrids在 Acumatica 网页中的外观和操作方式:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2018-03-13T19:17:20.703 回答