Hierarchical Data. Getting Started
It is possible to implement the IHierarchyNode interface manually or via ready-to-use implementation for DC - Xafari.BC.DC.HierarchyNode (or, as an alternative option, any descendant of Xafari.BC.DC.HierarchyNode).
Follow the instructions below for manual implementation:
Add the required platform-agnostic modules Xafari.BC and Xafari.Editors to the project.
Add the required platform-dependent modules Xafari.Editors.Win and Xafari.BC.Win for the Win app, and Xafari.Editors.Web and Xafari.BC.Web for the Web app.
Add a new DevExpress XAF Domain Object to the Module Project, name it ExampleIHierarcyNode, and replace the autogenerated content with this code snippet:
- c#
- VB
[DefaultClassOptions]
public class ExampleIHierarchyNode : BaseObject, IHierarchyNode
{
public ExampleIHierarchyNode(Session session)
: base(session)
{
}
private string _name;
[HierarchyNodeNameProperty]
public string Name
{
get
{
return _name;
}
set
{
SetPropertyValue("Name", ref _name, value);
}
}
private string _hierarchyFullName;
[Size(SizeAttribute.Unlimited)]
[ModelDefault("RowCount", "0")]
[ModelDefault("AllowEdit", "false")]
[HierarchyFullNameProperty]
public string HierarchyFullName
{
get
{
return _hierarchyFullName;
}
set
{
SetPropertyValue("HierarchyFullName", ref _hierarchyFullName, value);
}
}
private string _hierarchyFullPath;
[Size(SizeAttribute.Unlimited)]
[ModelDefault("RowCount", "0")]
[ModelDefault("AllowEdit", "false")]
[HierarchyFullPathProperty]
public string HierarchyFullPath
{
get
{
return _hierarchyFullPath;
}
set
{
SetPropertyValue("HierarchyFullPath", ref _hierarchyFullPath, value);
}
}
private ExampleIHierarchyNode _parent;
[Association("Parent - Children")]
[ParentProperty]
public ExampleIHierarchyNode Parent
{
get
{
return _parent;
}
set
{
SetPropertyValue("Parent1", ref _parent, value);
}
}
[Association("Parent - Children")]
[ChildrenProperty]
public XPCollection<ExampleIHierarchyNode> Children
{
get
{
return GetCollection<ExampleIHierarchyNode>("Children");
}
}
protected override void OnSaving()
{
base.OnSaving();
var typeInfo = XafTypesInfo.Instance.FindTypeInfo(this.GetType());
var helper = new ITypeInfoHelper(typeInfo);
foreach (var hierarchy in helper.BC().HierarchyNodeTypeInfo.Hierarchies)
HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchy.HierarchyName).UpdateFullNameAndFullPath(this);
}
protected override void OnDeleting()
{
base.OnDeleting();
HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>().DeleteObject(this);
}
public string GetHierarchyNodeName(string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
return HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).GetNodeName(this);
}
public string GetHierarchyNodeFullName(string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
return HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).GetNodeFullName(this);
}
public void SetHierarchyNodeFullName(string value, string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).SetNodeFullName(this, value);
}
public string GetHierarchyNodeFullPath(string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
return HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).GetNodeFullPath(this);
}
public void SetHierarchyNodeFullPath(string value, string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).SetNodeFullPath(this, value);
}
public IHierarchyNode GetHierarchyParent(string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
return HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).GetParent(this);
}
public void SetHierarchyParent(IHierarchyNode parent, string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).SetParent(this, parent);
}
public IList GetHierarchyChildren(string hierarchyName = HierarchyManager.DefaultHierarchyName)
{
return HierarchyManager.Instance.GetHierarchyInfo<ExampleIHierarchyNode>(hierarchyName).GetChildren(this);
}
}
<DefaultClassOptions> _
Public Class ExampleIHierarchyNode
Inherits BaseObject
Implements IHierarchyNode
Public Sub New(ByVal session As Session)
MyBase.New(session)
End Sub
Private __name As String
<HierarchyNodeNameProperty> _
Public Property Name As String
Get
Return __name
End Get
Set
SetPropertyValue("Name", __name, value)
End Set
End Property
Private __hierarchyFullName As String
<Size(SizeAttribute.Unlimited)> _
<ModelDefault("RowCount", "0")> _
<ModelDefault("AllowEdit", "false")> _
<HierarchyFullNameProperty> _
Public Property HierarchyFullName As String
Get
Return __hierarchyFullName
End Get
Set
SetPropertyValue("HierarchyFullName", __hierarchyFullName, value)
End Set
End Property
Private __hierarchyFullPath As String
<Size(SizeAttribute.Unlimited)> _
<ModelDefault("RowCount", "0")> _
<ModelDefault("AllowEdit", "false")> _
<HierarchyFullPathProperty> _
Public Property HierarchyFullPath As String
Get
Return __hierarchyFullPath
End Get
Set
SetPropertyValue("HierarchyFullPath", __hierarchyFullPath, value)
End Set
End Property
Private __parent As ExampleIHierarchyNode
<Association("Parent - Children")> _
<ParentProperty> _
Public Property Parent As ExampleIHierarchyNode
Get
Return __parent
End Get
Set
SetPropertyValue("Parent1", __parent, value)
End Set
End Property
<Association("Parent - Children")> _
<ChildrenProperty> _
Public ReadOnly Property Children As XPCollection(Of ExampleIHierarchyNode)
Get
Return GetCollection(Of ExampleIHierarchyNode)("Children")
End Get
End Property
Protected Overrides Sub OnSaving()
MyBase.OnSaving()
Dim typeInfo = XafTypesInfo.Instance.FindTypeInfo(Me.[GetType]())
Dim helper = New ITypeInfoHelper(typeInfo)
For Each hierarchy In helper.BC().HierarchyNodeTypeInfo.Hierarchies
HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchy.HierarchyName).UpdateFullNameAndFullPath(Me)
Next
End Sub
Protected Overrides Sub OnDeleting()
MyBase.OnDeleting()
HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)().DeleteObject(Me)
End Sub
Public Function GetHierarchyNodeName(Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName) As String
Return HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).GetNodeName(Me)
End Function
Public Function GetHierarchyNodeFullName(Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName) As String
Return HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).GetNodeFullName(Me)
End Function
Public Sub SetHierarchyNodeFullName(ByVal value As String, Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName)
HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).SetNodeFullName(Me, value)
End Sub
Public Function GetHierarchyNodeFullPath(Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName) As String
Return HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).GetNodeFullPath(Me)
End Function
Public Sub SetHierarchyNodeFullPath(ByVal value As String, Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName)
HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).SetNodeFullPath(Me, value)
End Sub
Public Function GetHierarchyParent(Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName) As IHierarchyNode
Return HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).GetParent(Me)
End Function
Public Sub SetHierarchyParent(ByVal parent As IHierarchyNode, Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName)
HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).SetParent(Me, parent)
End Sub
Public Function GetHierarchyChildren(Optional ByVal hierarchyName As String = HierarchyManager.DefaultHierarchyName) As IList
Return HierarchyManager.Instance.GetHierarchyInfo(Of ExampleIHierarchyNode)(hierarchyName).GetChildren(Me)
End Function
End Class
To see more samples of hierarchical data, download the HierarchyNode solution or refer to Northwind, Northwind.DC, and Feature Center demo apps.