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.