ComponentOne TreeView for WinForms
Binding TreeView to Hierarchical Data
Data Binding > Binding TreeView to Hierarchical Data

An important feature of TreeView is its ability to bind to hierarchical data and display it as relationship between parent and child nodes.

The C1TreeView class provides the DataSource property to specify the data source for the TreeView control. The class also provides the DataMember property to specify the name of a specific record within the data source.

Here is a sample code that binds the TreeView control to a hierarchical data source that is created by using different classes.

The following code snippet creates a class Product.

' create a class
Public Class Product
    Public Property ID() As Guid
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property
    Private m_ID As Guid
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
    Public Property Price() As Double
        Get
            Return m_Price
        End Get
        Set
            m_Price = Value
        End Set
    End Property
    Private m_Price As Double

    Public Sub New(name__1 As String, price__2 As Double)
        ID = Guid.NewGuid()
        Name = name__1
        Price = price__2
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class
// create a class
public class Product
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }

    public Product(string name, double price)
    {
        ID = Guid.NewGuid();
        Name = name;
        Price = price;
    }
    public override string ToString()
    {
        return Name;
    }
}

 Here is a code snippet creating a class ProductsGroup.

' create a class
Public Class ProductsGroup

    Public Property ID() As Guid
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property
    Private m_ID As Guid
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
    Public Property Products() As BindingList(Of Product)
        Get
            Return m_Products
        End Get
        Set
            m_Products = Value
        End Set
    End Property
    Private m_Products As BindingList(Of Product)
    Public ReadOnly Property CountOfProducts() As Integer
        Get
            Return Products.Count
        End Get
    End Property

    Public Sub New(name__1 As String)
        ID = Guid.NewGuid()
        Name = name__1
        Products = New BindingList(Of Product)()
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class
// create a class
public class ProductsGroup
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public BindingList<Product> Products { get; set; }
    public int CountOfProducts
    {
        get { return Products.Count; }
    }

    public ProductsGroup(string name)
    {
        ID = Guid.NewGuid();
        Name = name;
        Products = new BindingList<Product>();
    }

    public override string ToString()
    {
        return Name;
    }
}

 Below is the code creating a class Store.

' create a class
Public Class Store

    Public Property ID() As Guid
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property
    Private m_ID As Guid
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
    Public Property ProductsGroups() As BindingList(Of ProductsGroup)
        Get
            Return m_ProductsGroups
        End Get
        Set
            m_ProductsGroups = Value
        End Set
    End Property
    Private m_ProductsGroups As BindingList(Of ProductsGroup)
    Public ReadOnly Property CountOfProducts() As Integer
        Get
            Dim count As Integer = 0
            For Each pg As Object In ProductsGroups
                count += pg.CountOfProducts
            Next
            Return count
        End Get
    End Property

    Public Sub New(name__1 As String)
        ID = Guid.NewGuid()
        Name = name__1
        ProductsGroups = New BindingList(Of ProductsGroup)()
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class
// create a class
public class Store
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public BindingList<ProductsGroup> ProductsGroups { get; set; }
    public int CountOfProducts
    {
        get
        {
            int count = 0;
            foreach (var pg in ProductsGroups)
                count += pg.CountOfProducts;
            return count;
        }
    }

    public Store(string name)
    {
        ID = Guid.NewGuid();
        Name = name;
        ProductsGroups = new BindingList<ProductsGroup>();
    }

    public override string ToString()
    {
        return Name;
    }
}

 The following code snippet creates a class StoreCollection.

' create a class
Public Class StoreCollection
    Inherits BindingList(Of Store)
    Public Shared Function GetData() As StoreCollection
        Dim stores = New StoreCollection()

        stores.Add(New Store("Pear Inc."))
        stores(0).ProductsGroups.Add(New ProductsGroup("Mobile phones"))
        stores(0).ProductsGroups(0).Products.Add(New Product("fPhone 34", 999.99))
        stores(0).ProductsGroups(0).Products.Add(New Product("fPhone 34Z", 9999.99))
        stores(0).ProductsGroups(0).Products.Add(New Product("fPhone 34XX", 100000))
        stores(0).ProductsGroups.Add(New ProductsGroup("Notebooks"))
        stores(0).ProductsGroups(1).Products.Add(New Product("DuckBook S", 9999.99))
        stores(0).ProductsGroups(1).Products.Add(New Product("DuckBook Ultra", 14000))
        stores(0).ProductsGroups(1).Products.Add(New Product("DuckBook Pro", 20000))
        stores(0).ProductsGroups.Add(New ProductsGroup("Computers"))
        stores(0).ProductsGroups(2).Products.Add(New Product("DuckPC 3", 10000.99))
        stores(0).ProductsGroups(2).Products.Add(New Product("DuckPro X", 15000))
        stores(0).ProductsGroups(2).Products.Add(New Product("DuckPro Ultra", 19000))

        stores.Add(New Store("Space Inc."))
        stores(1).ProductsGroups.Add(New ProductsGroup("Mobile phones"))
        stores(1).ProductsGroups(0).Products.Add(New Product("Rocket 1A", 900))
        stores(1).ProductsGroups(0).Products.Add(New Product("Rocket 2X", 3999))
        stores(1).ProductsGroups(0).Products.Add(New Product("Rocket 3E", 20000))
        stores(1).ProductsGroups.Add(New ProductsGroup("Notebooks"))
        stores(1).ProductsGroups(1).Products.Add(New Product("Shuttle 1A", 9999.99))
        stores(1).ProductsGroups(1).Products.Add(New Product("Shuttle 1X", 14000))
        stores(1).ProductsGroups(1).Products.Add(New Product("Shuttle Pro", 20000))
        stores(1).ProductsGroups.Add(New ProductsGroup("Computers"))
        stores(1).ProductsGroups(2).Products.Add(New Product("IssPC 2D", 10000.99))
        stores(1).ProductsGroups(2).Products.Add(New Product("IssPro 2X", 15000))
        stores(1).ProductsGroups(2).Products.Add(New Product("IssPro Pro", 19000))

        stores.Add(New Store("Fruit Inc."))
        stores(2).ProductsGroups.Add(New ProductsGroup("Mobile phones"))
        stores(2).ProductsGroups(0).Products.Add(New Product("Pineapple 1", 2900))
        stores(2).ProductsGroups(0).Products.Add(New Product("Mango 1", 3099))
        stores(2).ProductsGroups(0).Products.Add(New Product("Orange 1", 5000))
        stores(2).ProductsGroups.Add(New ProductsGroup("Notebooks"))
        stores(2).ProductsGroups(1).Products.Add(New Product("Mandarin X", 9999.99))
        stores(2).ProductsGroups(1).Products.Add(New Product("Lemon X", 14000))
        stores(2).ProductsGroups(1).Products.Add(New Product("Lemon Pro", 20000))
        stores(2).ProductsGroups.Add(New ProductsGroup("Computers"))
        stores(2).ProductsGroups(2).Products.Add(New Product("Plum X", 10000.99))
        stores(2).ProductsGroups(2).Products.Add(New Product("Plum Z", 15000))
        stores(2).ProductsGroups(2).Products.Add(New Product("Plum Pro", 19000))

        Return stores
    End Function
End Class
// create a class
public class StoreCollection : BindingList<Store>
{
    public static StoreCollection GetData()
    {
        var stores = new StoreCollection();

        stores.Add(new Store("Pear Inc."));
        stores[0].ProductsGroups.Add(new ProductsGroup("Mobile phones"));
        stores[0].ProductsGroups[0].Products.Add(new Product("fPhone 34", 999.99));
        stores[0].ProductsGroups[0].Products.Add(new Product("fPhone 34Z", 9999.99));
        stores[0].ProductsGroups[0].Products.Add(new Product("fPhone 34XX", 100000));
        stores[0].ProductsGroups.Add(new ProductsGroup("Notebooks"));
        stores[0].ProductsGroups[1].Products.Add(new Product("DuckBook S", 9999.99));
        stores[0].ProductsGroups[1].Products.Add(new Product("DuckBook Ultra", 14000));
        stores[0].ProductsGroups[1].Products.Add(new Product("DuckBook Pro", 20000));
        stores[0].ProductsGroups.Add(new ProductsGroup("Computers"));
        stores[0].ProductsGroups[2].Products.Add(new Product("DuckPC 3", 10000.99));
        stores[0].ProductsGroups[2].Products.Add(new Product("DuckPro X", 15000));
        stores[0].ProductsGroups[2].Products.Add(new Product("DuckPro Ultra", 19000));

        stores.Add(new Store("Space Inc."));
        stores[1].ProductsGroups.Add(new ProductsGroup("Mobile phones"));
        stores[1].ProductsGroups[0].Products.Add(new Product("Rocket 1A", 900));
        stores[1].ProductsGroups[0].Products.Add(new Product("Rocket 2X", 3999));
        stores[1].ProductsGroups[0].Products.Add(new Product("Rocket 3E", 20000));
        stores[1].ProductsGroups.Add(new ProductsGroup("Notebooks"));
        stores[1].ProductsGroups[1].Products.Add(new Product("Shuttle 1A", 9999.99));
        stores[1].ProductsGroups[1].Products.Add(new Product("Shuttle 1X", 14000));
        stores[1].ProductsGroups[1].Products.Add(new Product("Shuttle Pro", 20000));
        stores[1].ProductsGroups.Add(new ProductsGroup("Computers"));
        stores[1].ProductsGroups[2].Products.Add(new Product("IssPC 2D", 10000.99));
        stores[1].ProductsGroups[2].Products.Add(new Product("IssPro 2X", 15000));
        stores[1].ProductsGroups[2].Products.Add(new Product("IssPro Pro", 19000));

        stores.Add(new Store("Fruit Inc."));
        stores[2].ProductsGroups.Add(new ProductsGroup("Mobile phones"));
        stores[2].ProductsGroups[0].Products.Add(new Product("Pineapple 1", 2900));
        stores[2].ProductsGroups[0].Products.Add(new Product("Mango 1", 3099));
        stores[2].ProductsGroups[0].Products.Add(new Product("Orange 1", 5000));
        stores[2].ProductsGroups.Add(new ProductsGroup("Notebooks"));
        stores[2].ProductsGroups[1].Products.Add(new Product("Mandarin X", 9999.99));
        stores[2].ProductsGroups[1].Products.Add(new Product("Lemon X", 14000));
        stores[2].ProductsGroups[1].Products.Add(new Product("Lemon Pro", 20000));
        stores[2].ProductsGroups.Add(new ProductsGroup("Computers"));
        stores[2].ProductsGroups[2].Products.Add(new Product("Plum X", 10000.99));
        stores[2].ProductsGroups[2].Products.Add(new Product("Plum Z", 15000));
        stores[2].ProductsGroups[2].Products.Add(new Product("Plum Pro", 19000));

        return stores;
    }
}

 The below-mentioned code snippet binds the TreeView control to these classes.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    C1TreeView1.Columns.Clear()
    C1TreeView1.DataSource = Nothing
    C1TreeView1.DataMember = "\ProductsGroups\Products"
    Dim column = New C1.Win.TreeView.C1TreeColumn()
    column.HeaderText = "Name"
    C1TreeView1.Columns.Add(column)
    column = New C1.Win.TreeView.C1TreeColumn()
    column.DisplayFieldName = "CountOfProducts\CountOfProducts\"
    column.HeaderText = "Products in store"
    C1TreeView1.Columns.Add(column)
    column = New C1.Win.TreeView.C1TreeColumn()
    column.DisplayFieldName = "\\Price"
    column.HeaderText = "Price"
    C1TreeView1.Columns.Add(column)
    C1TreeView1.DataSource = StoreCollection.GetData()
End Sub
public Form1()
{
    InitializeComponent();

    c1TreeView1.Columns.Clear();
    c1TreeView1.DataSource = null;
    c1TreeView1.DataMember = "\\ProductsGroups\\Products";
    var column = new C1.Win.TreeView.C1TreeColumn();
    column.HeaderText = "Name";
    c1TreeView1.Columns.Add(column);
    column = new C1.Win.TreeView.C1TreeColumn();
    column.DisplayFieldName = "CountOfProducts\\CountOfProducts\\";
    column.HeaderText = "Products in store";
    c1TreeView1.Columns.Add(column);
    column = new C1.Win.TreeView.C1TreeColumn();
    column.DisplayFieldName = "\\\\Price";
    column.HeaderText = "Price";
    c1TreeView1.Columns.Add(column);
    c1TreeView1.DataSource = StoreCollection.GetData();
}

 Run the code to observe the following output.