如何在Acumatica中创建Master-Detail网格?

时间:2018-03-13 19:17:21

标签: acumatica acumatica-kb

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

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

如何在Aspx中声明我的2 PXGrids 来完成此任务?

1 个答案:

答案 0 :(得分: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
}

如上面的代码片段所示,详细视图通过当前 BQL运算符引用主视图。另外,请注意为类别 DAC定义的 RowSelected 事件处理程序,以便在主服务器中没有单个记录时禁用详细信息网格上的插入按钮网格。

下一步是在Aspx中配置主细节 PXGrids

  • 将主网格设置 SyncPosition 属性设置为 true ,然后定义 AutoCallBack 和< strong> OnChangeCommand 属性如下所示,每次在主网格中选择不同的记录或根本没有记录时,刷新细节网格:

    <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>
    
  • 对于详细信息网格,只需定义刷新 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>
    

为了更好的用户体验,建议在 PXSplitContainer 中放置主细节 PXGrids ,如下面的代码段所示:

<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网页内查看和操作:

enter image description here enter image description here enter image description here