通过为提供网格控件数据的对象实现特定的方法,可以在数据源级别提供主/从关系。 在这种情况下,网格控件可以显示提供到细节视图中的细节数据。 本主题展示如何通过为数据源对象实现 IRelationList 接口,从而实现主/从关系。 此接口的方法允许动态加载细节数据。
要为数据源对象实现主/从关系,也可以实现 IRelationListEx 接口来代替。 此接口是 IRelationList 接口的扩展版本。 请参阅下面的内容来学习更多内容。
对于在运行时刻创建的数据以及 .NET 数据结构 (例如 DataView 对象),都可以实现 IRelationList 和 IRelationListEx 接口。 (参阅 DataView 对象)
IRelationList 和 IRelationListEx 接口
必须为主表数据源实现 IRelationList 或 IRelationListEx 接口。 它们的方法应该提供关于关系的信息,并提供细节数据。
IRelationList 接口的成员在下面列出:
- IRelationList.RelationCount 必须返回主控行的主/从关系的数目。 如果该属性返回 0,则禁用主/从模式;
- IRelationList.IsMasterRowEmpty 必须返回一个 Boolean 值,指明特定的主/从关系是否有细节数据;
- IRelationList.GetRelationName 必须提供主/从关系的名称。 所提供的名称用于为在网格控件中呈现的数据标识细节模式视图。 请参阅 指定呈现细节数据的视图,来学习更多内容。
- IRelationList.GetDetailList 必须返回特定主控行的特定主/从关系的数据。
IRelationListEx 接口扩展了 IRelationList 接口。 当使用 IRelationListEx 接口时,可以为不同的主控行提供不同数目的主/从关系,并定制关系的显示标题。 此接口的两个附加方法是:
- IRelationListEx.GetRelationCount 必须返回特定主控行的关系数目。
- IRelationListEx.GetRelationDisplayName 必须返回特定主控行中特定关系的显示标题。
实现 IRelationList 接口
我们考虑一个简单的实现 IRelationList 接口的示例,此接口在 GridUnboundMasterView 指南中的 Records 类中实现。
Customers、Products 和 Shippers 项的细节数据分别由自定义的类 ChildRecordsCustomers、ChildRecordsProducts 和 ChildRecordsShippers 表示。 这些类的实现非常简单,故在此处省略。
Records 类表示 Record 对象的数组,并作为网格控件的数据源。 它包含三个项 (Customers、Products 和 Shippers),每个项都与相应的细节数据相关联。
细节数据通过 IRelationList 的方法提供。
C# | 复制代码 |
---|---|
public class Records : ArrayList, DevExpress.Data.IRelationList { //Adds three items of the Record class public Records() { Add(new Record("Customers")); Add(new Record("Products")); Add(new Record("Shippers")); } #region IRelationList methods //Returns the name of the relationship depending upon the specified item //The name of the relationship matches the item's name //It is used to determine the pattern View for the relationship string IRelationList.GetRelationName(int index, int relationIndex) { if(index != GridControl.InvalidRowHandle) return ((Record)this[index]).Name; else return ""; } //Returns the number of master-detail relationships for the current data source //Every item is associated with a single relationship int IRelationList.RelationCount { get { return 1; } } //Returns detail data depending upon the current item IList IRelationList.GetDetailList(int index, int relationIndex) { switch(this[index].Name) { case "Customers": return new ChildRecordsCustomers(); case "Products": return new ChildRecordsProducts(); case "Shippers": return new ChildRecordsShippers(); } return null; } //Returns whether the specified master row is empty //All master rows provide detail data bool IRelationList.IsMasterRowEmpty(int index, int relationIndex) { return false; } #endregion public virtual new Record this[int index] { get {return (Record)(base[index]);} } } //Represents an item for the Records class public class Record { private string name; public string Name { get { return name; } set { name = value; } } public Record(string name) { this.name = name; } } |
Visual Basic | 复制代码 |
---|---|
Public Class Records Inherits ArrayList Implements DevExpress.Data.IRelationList 'Adds three items of the Record class Public Sub New() Add(New Record("Customers")) Add(New Record("Products")) Add(New Record("Shippers")) End Sub #Region "IRelationList methods" 'Returns the name of the relationship depending upon the specified item 'The name of the relationship matches the item's name 'It is used to determine the pattern View for the relationship Function GetRelationName(ByVal index As Integer, ByVal relationIndex As Integer) _ As String Implements IRelationList.GetRelationName If index <> DevExpress.XtraGrid.GridControl.InvalidRowHandle Then Return CType(Item(index), Record).Name Else Return "" End If End Function 'Returns the number of master-detail relationships for the current data source 'Every item is associated with a single relationship ReadOnly Property RelationCount() As Integer Implements IRelationList.RelationCount Get Return 1 End Get End Property 'Returns detail data depending upon the current item Function GetDetailList(ByVal index As Integer, ByVal relationIndex As Integer) _ As IList Implements IRelationList.GetDetailList Select Case (Item(index).Name) Case "Customers" Return New ChildRecordsCustomers Case "Products" Return New ChildRecordsProducts Case "Shippers" Return New ChildRecordsShippers End Select Return Nothing End Function 'Returns whether the specified master row is empty 'All master rows provide detail data Function IsMasterRowEmpty(ByVal index As Integer, ByVal relationIndex As Integer) _ As Boolean Implements IRelationList.IsMasterRowEmpty Return False End Function #EndRegion Default Public Overridable Shadows Property Item(ByVal index As Integer) As Record Get Return CType(MyBase.Item(index), Record) End Get Set(ByVal Value As Record) MyBase.Item(index) = Value End Set End Property End Class 'Represents an item for the Records class Public Class Record Private _name As String Public Property Name() As String Get Return _name End Get Set(ByVal Value As String) _name = Value End Set End Property Public Sub New(ByVal name As String) Me._name = name End Sub End Class |