对应于主/从关系的数据被显示在细节视图中。 最终用户可以通过展开相应的主控行,访问细节视图。 这种细节视图被称为 克隆 。
细节克隆视图仅当主控行被展开时存在。 因此,在设计时刻,不能定制每个细节克隆视图,并且在大多数情况下这是不必要的。 而是可以定制细节“ 模式 ”视图,模式视图作为创建克隆视图的模板。对每个主/从关系,都必须提供模式视图,它的设置将用于创建相应的细节克隆视图。 当对应于特定关系的细节数据正要被显示时,网格控件获取相关联的模式视图,创建副本并使用它来呈现细节数据。 仅通过模式视图的副本 (克隆视图),把它呈现在屏幕上。
克隆视图
在细节克隆视图被打开之后,就可以使用 GridView.GetDetailView 方法访问它。 要通过代码打开细节视图,则使用 GridView.SetMasterRowExpandedEx 或 GridView.ExpandMasterRow 方法。 要获得更多关于展开行的信息,可以参阅 展开和折叠主控行 章节。
要为当前的细节克隆视图获取模式视图,则使用 BaseView.SourceView 属性。 BaseView.ParentView 属性允许获取克隆视图的主表视图。
同步细节视图
模式视图
要通过代码把特定的主/从关系与模式视图相关联,则可以使用 GridControl.LevelTree 属性。 此属性表示一个树状结构。 在 GridControl.LevelTree 中的每个节点都通过名称和相关联的模式视图来标识关系。 在本主题的 层级树 小节描述了如何使用该属性。
使用 GridView.MasterRowGetLevelDefaultView 事件,也可以提供模式视图来动态呈现细节数据。 请参阅 主/从关系: 使用事件 文档获知细节。
在设计时刻,可以使用 层设计器(Level Designer) 来为特定的主/从关系指派模式视图,并定制模式视图。 在设计时刻,如果网格控件被绑定到包含主/从关系的 DataTable,则可以通过单击“层设计器”的“Retrieve Details(取回细节)”按钮从数据源中获取关系,并显示在 层设计器(Level Designer) 中。通过 层设计器(Level Designer) 指派到特定关系的模式视图被自动反映在网格控件的 GridControl.LevelTree 属性。
下面的插图为示例网格控件说明了 层设计器(Level Designer)。 它展示了网格控件包含三个主/从关系 (SuppliersProducts、ProductsOrder_x0020_Details 和 SuppliersCategoryProducts),但是仅有一个关系 (SuppliersProducts) 与模式视图相关联。
层设计器 始终包含 (MainView) 层。 显示在 (MainView) 右侧的矩形框用于指定呈现绑定数据源中顶层记录集的视图。
在该层下面指定主/从关系和相关联的模式视图。 左边的矩形框包含主/从关系的名称。 右边的矩形框显示用于呈现此关系的模式视图名称。 在上图中, gridView1 是“模式”视图。
要把模式视图指派到关系,则单击相应的 Click here to change view(单击此处改变视图) 链接。 打开的菜单允许选择一个已有的视图或创建一个新视图:
在设计时刻,要定制模式视图 (以及 MainView),则可以在 层设计器(Level Designer) 单击相应的视图框。 这样在网格控件显示此视图,并在 属性 窗口中显示它的设置。
模式视图不会被显示在屏幕上。 它们不包含数据,它们的 BaseView.RowCount 属性返回 0。 因此,不能为模式视图调用需要 行句柄 作为参数的方法 (ColumnView.SetRowCellValue、GridView.SetMasterRowExpanded 等)。 只需要为实际的视图 (主视图或细节克隆视图) 调用这些方法。
层级树
在运行时刻,可以使用 GridControl.LevelTree 属性为主/从关系指派模式视图。 此属性表示一个树状结构。 它的节点 (除去根节点以外) 表示特定的主/从关系。 节点的 GridLevelNode.RelationName 属性标识关系的名称, GridLevelNode.LevelTemplate 属性引用与关系相关联的模式视图。
直接通过 GridControl.LevelTree 属性引用树的根结点。 此节点标识网格控件的主视图,因此根节点的 LevelTemplate 属性始终引用与 GridControl.MainView 属性相同的值。
GridControl.LevelTree 的结构应反映绑定数据源中主/从关系的层次结构。 因此,要为特定的关系提供模式视图,则应该把节点添加到树中与数据源中关系相同的嵌套层级。 此外,节点的 GridLevelNode.RelationName 属性应该设置为关系的名称,以便于在为模式视图搜索节点时,网格控件可以定位到所需的节点。
由 层设计器(Level Designer) 和 GridControl.LevelTree 提供的信息是同步的,也即使用 层设计器(Level Designer) 把模式视图指派到关系时,就是把条目添加到 GridControl.LevelTree。 类似地,从 层设计器(Level Designer) 中移除层,就是从 GridControl.LevelTree 中移除相应的节点。 在下面的插图中, GridControl.LevelTree 树包含四个字节 (根节点和三个子节点)。
上图中 GridControl.LevelTree 中节点的层次结构在下面展示:
如果个别节点的 LevelTemplate 属性值被设置为 null,则将根据父节点的模式视图创建呈现相应关系的模式视图。 新视图有一样的类型,并从父节点的模式视图中复制除去列之外的所有设置。 例如,“ProductsOrder_0x0020_Details”关系没有任何指派的模式视图。 将根据 gridView1 视图 (此视图已指派到父节点) 创建用于呈现此关系的模式视图。
未通过 GridControl.LevelTree 引用的关系的模式视图以相似的方式被确定。 网格为所需关系计算呈现父关系的节点,并使用它的相关联视图作为所需关系的模式视图。 注意,未通过 GridControl.LevelTree 引用的关系仅当 GridControl.ShowOnlyPredefinedDetails 属性值被设置为 false (默认值) 时,才被显示在网格中。
GridControl.ShowOnlyPredefinedDetails 属性允许控制哪些主/从关系可以被显示在网格中。 在默认情况下,此属性值被设置为 false,XtraGrid 获取数据源中的所有主/从关系,并显示全部。 如果 GridControl.ShowOnlyPredefinedDetails 属性值设置为 true,则网格控件只显示通过 GridControl.LevelTree 引用的关系。 其他关系不被显示。
注意,如果视图没有被指派到 GridControl.LevelTree 中的特定节点 (节点的 LevelTemplate 属性值设置为 null),则相应的关系仍然被网格显示。 要防止此关系被显示,则需要删除此节点,也移除视图。
要在设计时刻删除节点,则在“层设计器(Level Designer)”中单击所需的关系,并选择“Delete level(删除层)”菜单项。
示例
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Card; GridControl grid = gridControl1; // The pattern View for representing the "SuppliersProducts" relation. GridView gridView1 = new GridView(grid); // The pattern View for representing the "ProductsOrder_x0020_Details" relation. GridView gridView2 = new GridView(grid); // The pattern View for representing the "SuppliersCategoryProducts" relation. CardView cardView1 = new CardView(grid); GridLevelNode node1 = grid.LevelTree.Nodes.Add("SuppliersProducts", gridView1); GridLevelNode node11 = node1.Nodes.Add("ProductsOrder_x0020_Details", gridView2); GridLevelNode node2 = grid.LevelTree.Nodes.Add("SuppliersCategoryProducts", cardView1); // Customize the pattern Views. // ... |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Views.Card Dim grid As GridControl = GridControl1 ' The pattern View for representing the "SuppliersProducts" relation. Dim gridView1 As GridView = New GridView(grid) ' The pattern View for representing the "ProductsOrder_x0020_Details" relation. Dim gridView2 As GridView = New GridView(grid) ' The pattern View for representing the "SuppliersCategoryProducts" relation. Dim cardView1 As CardView = New CardView(grid) Dim node1 As GridLevelNode = grid.LevelTree.Nodes.Add("SuppliersProducts", gridView1) Dim node11 As GridLevelNode = node1.Nodes.Add("ProductsOrder_x0020_Details", gridView2) Dim node2 As GridLevelNode = grid.LevelTree.Nodes.Add("SuppliersCategoryProducts", cardView1) ' Customize the pattern Views. '... |
关系名称
关系名称被用于从 GridControl.LevelTree 中获取默认的模式视图,此模式视图将为所创建的细节克隆视图提供设置。 如果 GridControl.LevelTree 不包含指定名称的条目,并且 GridControl.ShowOnlyPredefinedDetails 属性值被设置为 false,则当前细节数据的主表视图将被用作模式视图。
在某些情况下,可能需要显式提供模式视图 (不根据关系名称)。 在这种情况下,可以接管 GridView.MasterRowGetLevelDefaultView 事件。 通过此事件指派的模式视图将覆盖默认的模式视图。示例
下列代码演示了如何使用 GridView.MasterRowGetRelationName 事件,来为第一个主控行的第一个细节数据提供自定义模式视图。 对于其他细节数据,使用默认的模式视图。
在事件处理程序中,假设第一个主控行的第一个细节数据的关系名称是“CustomRelation”。 网格在 GridControl.LevelTree 哈希表中查找相应的条目,并获取用于创建克隆视图的模式视图。C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; //... private void frmMain_Load(object sender, System.EventArgs e) { // Create and customize a pattern View. GridView customPatternView = new GridView(gridControl1); customPatternView.Columns.AddField("CategoryID").VisibleIndex = 0; customPatternView.Columns.AddField("Discontinued").VisibleIndex = 1; customPatternView.OptionsView.ShowGroupPanel = false; // Associate the pattern View with the "CustomRelation" name. gridControl1.LevelTree.Nodes.Add("CustomRelation", customPatternView); } // A MasterRowGetRelationName event handler for the master View. private void advBandedGridView1_MasterRowGetRelationName(object sender, MasterRowGetRelationNameEventArgs e) { if(e.RowHandle == 0 && e.RelationIndex == 0) e.RelationName = "CustomRelation"; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid '... Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Load ' Create and customize a pattern View. Dim customPatternView As GridView = New GridView(gridControl1) customPatternView.Columns.AddField("CategoryID").VisibleIndex = 0 customPatternView.Columns.AddField("Discontinued").VisibleIndex = 1 customPatternView.OptionsView.ShowGroupPanel = False ' Associate the pattern View with the "CustomRelation" name. gridControl1.LevelTree.Nodes.Add("CustomRelation", customPatternView) End Sub ' A MasterRowGetRelationName event handler for the master View. Private Sub advBandedGridView1_MasterRowGetRelationName(ByVal sender As Object, _ ByVal e As MasterRowGetRelationNameEventArgs) _ Handles advBandedGridView1.MasterRowGetRelationName If e.RowHandle = 0 And e.RelationIndex = 0 Then e.RelationName = "CustomRelation" End Sub |
要获得关于为绑定数据和非绑定数据实现主/从关系的信息,请参阅 主/从模式概述 主题。