articles

Home / DeveloperSection / Articles / Populate a TreeView Dynamically

Populate a TreeView Dynamically

Shankar M 11399 03-Mar-2013

In this article we will try to learn how to populate a TreeView Dynamically in C# Windows Application

Introduction

     TreeView control provides a way to display information in hierarchical structure using nodes.

Root Node (Parent Node)

     The top level node in a TreeView is called as Root nodes.

Child nodes

     The root node (also known as Parent nodes) can have nodes that can be viewed when they are expanded these nodes are called Child nodes. The user can expand the root node by clicking the plus sign (+) button.

Table Definitions

 

Parent Nodes 

CREATE TABLE [dbo].[MNUPARENT](

                [MAINMNU] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
                [STATUS] [varchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
                [MENUPARVAL] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_MNUPARENT] PRIMARY KEY CLUSTERED
(
                [MENUPARVAL] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
 Insert Sample Hierarchical Data
SET IDENTITY_INSERT MNUPARENT ON

GO
 
INSERT INTO MNUPARENT(MAINMNU, STATUS, MENUPARVAL) VALUES('Finanace','Y',1)
INSERT INTO MNUPARENT(MAINMNU, STATUS, MENUPARVAL) VALUES('Inventory','Y',2)
 
GO
SET IDENTITY_INSERT MNUPARENT OFF
GO

 Child Nodes 

CREATE TABLE [dbo].[MNUSUBMENU](

                [MENUPARVAL] [int] NOT NULL,
                [FRM_CODE] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
                [FRM_NAME] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
                [MNUSUBMENU] [int] NOT NULL,
                [STATUS] [varchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PRIMARY KEY CLUSTERED
(
                [MNUSUBMENU] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

  Sample Insert Statements 


INSERT INTO MNUSUBMENU(MENUPARVAL,FRM_NAME,MNUSUBMENU,STATUS) VALUES(1,'Child Finance',10,'Y')
INSERT INTO MNUSUBMENU(MENUPARVAL,FRM_NAME,MNUSUBMENU,STATUS) VALUES(1,'Accounting',20,'Y')
INSERT INTO MNUSUBMENU(MENUPARVAL,FRM_NAME,MNUSUBMENU,STATUS) VALUES(20,'Audit',30,'Y')
INSERT INTO MNUSUBMENU(MENUPARVAL,FRM_NAME,MNUSUBMENU,STATUS) VALUES(30,'Acc. Standards',40,'Y')

 

Alternatively, you can have a single table to maintain this data of Parent and Child nodes

 

Now let us start a new Project and Populate the TreeView

1.       Create a new Project and name it LoadTreeView

 

Populate a TreeView Dynamically

 

2.       Set the Forms Name Property to FrmTreeView and its Text Property to Populate TreeView.

3.       Add a tree view control to the form and set its dock property to Left

4.       To configure the connection Settings to the Data Source add  Application configuration File

From Project -> Add New Item

Populate a TreeView Dynamically

5.       Paste the code below in the App.config File

<?xml version="1.0" encoding="utf-8" ?>

<configuration>
  <connectionStrings>
    <add name ="ConnString" connectionString ="Data Source=yourServerName; User Id =yourUserName; Password =yourPwd;" providerName ="System.Data.SqlClient"/>
  </connectionStrings>
</configuration>

 6.       To access the connection string from code add a reference to System.Configuration and add the namespace using System.Configuration;

Populate a TreeView Dynamically

  7.       In the Form Load Event Paste the below code 

String connectionString;

            connectionString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
            conn = new SqlConnection(connectionString);
            String Sequel = "SELECT MAINMNU,MENUPARVAL,STATUS FROM MNUPARENT";
            SqlDataAdapter da = new SqlDataAdapter(Sequel, conn);
            DataTable dt = new DataTable();
            conn.Open();
            da.Fill(dt);
 
            foreach (DataRow dr in dt.Rows)
            {
                 parentNode = treeView1.Nodes.Add(dr["MAINMNU"].ToString());
                 PopulateTreeView(Convert.ToInt32(dr["MENUPARVAL"].ToString()), parentNode);
            }
 
            treeView1.ExpandAll();

 8.       The Treeview is populated with its child nodes using the PopulateTreeView Method we have defined 

private void PopulateTreeView(int parentId, TreeNode parentNode)

        {
            String Seqchildc = "SELECT MENUPARVAL,FRM_NAME,MNUSUBMENU FROM MNUSUBMENU WHERE MENUPARVAL=" + parentId + "";
            SqlDataAdapter dachildmnuc = new SqlDataAdapter(Seqchildc, conn);
            DataTable dtchildc = new DataTable();
            dachildmnuc.Fill(dtchildc);
            TreeNode childNode;
            foreach (DataRow dr in dtchildc.Rows)
            {
                if (parentNode == null)
                    childNode = treeView1.Nodes.Add(dr["FRM_NAME"].ToString());
                else
                    childNode = parentNode.Nodes.Add(dr["FRM_NAME"].ToString());
 
                PopulateTreeView(Convert.ToInt32(dr["MNUSUBMENU"].ToString()), childNode);
            }
        }

  9.       Build and Run the Program which results in output as shown 

Populate a TreeView Dynamically

  10.   Add the below piece of code to the treeview Double Click Event

private void treeView1_DoubleClick(object sender, EventArgs e)

        {
            MessageBox.Show(treeView1.SelectedNode.FullPath.ToString());
        }

 11.   When you double click a node on the Treeview control a message is displayed with the fullpath to the node. Here I have clicked the Acc. Standards node

Populate a TreeView Dynamically

Program  
using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;

namespace LoadTreeView
{
    public partial class FrmTreeView : Form
    {
        SqlConnection conn;
        TreeNode parentNode = null;
        public FrmTreeView()
        {
            InitializeComponent();
        }

        private void FrmTreeView_Load(object sender, EventArgs e)
        {
            String connectionString;
            connectionString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
            conn = new SqlConnection(connectionString);
            String Sequel = "SELECT MAINMNU,MENUPARVAL,STATUS FROM MNUPARENT";
            SqlDataAdapter da = new SqlDataAdapter(Sequel, conn);
            DataTable dt = new DataTable();
            conn.Open();
            da.Fill(dt);

            foreach (DataRow dr in dt.Rows)
            {
                parentNode = treeView1.Nodes.Add(dr["MAINMNU"].ToString());
                PopulateTreeView(Convert.ToInt32(dr["MENUPARVAL"].ToString()), parentNode);
            }

            treeView1.ExpandAll();
        }

        private void PopulateTreeView(int parentId, TreeNode parentNode)
        {
            String Seqchildc = "SELECT MENUPARVAL,FRM_NAME,MNUSUBMENU FROM MNUSUBMENU WHERE MENUPARVAL=" + parentId + "";
            SqlDataAdapter dachildmnuc = new SqlDataAdapter(Seqchildc, conn);
            DataTable dtchildc = new DataTable();
            dachildmnuc.Fill(dtchildc);
            TreeNode childNode;
            foreach (DataRow dr in dtchildc.Rows)
            {
                if (parentNode == null)
                    childNode = treeView1.Nodes.Add(dr["FRM_NAME"].ToString());
                else
                    childNode = parentNode.Nodes.Add(dr["FRM_NAME"].ToString());

                PopulateTreeView(Convert.ToInt32(dr["MNUSUBMENU"].ToString()), childNode);
            }
        }

        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            MessageBox.Show(treeView1.SelectedNode.FullPath.ToString());
        }

    }
}
Conclusion

In this article we have discussed how to Populate a treeview dynamically in C# Application and displaying the entire Path to the Node on a event.


c# c# 
Updated 07-Sep-2019

Leave Comment

Comments

Liked By