Populate a TreeView Control C#

August 27, 2009 by C#  

Populating a TreeView control in a windows application using SQL and C# is quite straightforward.

Create a self referencing table, lets call it myTable, quite orginal don't you think? ;)

CREATE TABLE [dbo].[myTable](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[title] [varchar](255) NOT NULL,
	[parentID] [int] NULL,
 CONSTRAINT [PK_myTable] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Insert some hierarchal data.

SET IDENTITY_INSERT myTable ON
GO

INSERT INTO myTable(ID, title, parentID) VALUES(1,'Microsoft', NULL)
INSERT INTO myTable(ID, title, parentID) VALUES(2,'C#', 1)
INSERT INTO myTable(ID, title, parentID) VALUES(3,'VB.net', 1)
INSERT INTO myTable(ID, title, parentID) VALUES(4,'Open Source', NULL)
INSERT INTO myTable(ID, title, parentID) VALUES(5,'Python',	4)
INSERT INTO myTable(ID, title, parentID) VALUES(6,'Ruby', 4)
INSERT INTO myTable(ID, title, parentID) VALUES(7,'PHP', 4)
INSERT INTO myTable(ID, title, parentID) VALUES(8,'Perl', 4)
INSERT INTO myTable(ID, title, parentID) VALUES(9,'Java', 4)
INSERT INTO myTable(ID, title, parentID) VALUES(10,'LinQ', 2)
INSERT INTO myTable(ID, title, parentID) VALUES(11,'5.2', 7)
INSERT INTO myTable(ID, title, parentID) VALUES(12,'4.4', 7)

GO
SET IDENTITY_INSERT myTable OFF
GO

I assume in my code example that the root parent node equals 0, hence when returning results from SQL like in the stored procedure, I use the ISNULL method to return 0 from a NULL.

You can just define a root value as well...

CREATE PROCEDURE viewMyTable
AS
BEGIN
	SELECT ID, title, ISNULL(parentID, 0) AS parentID
	FROM myTable
END

Add a same table key contraint.

ALTER TABLE [dbo].[myTable]  WITH CHECK ADD  CONSTRAINT [FK_myTable_myTable] FOREIGN KEY([parentID])
REFERENCES [dbo].[myTable] ([ID])
GO
ALTER TABLE [dbo].[myTable] CHECK CONSTRAINT [FK_myTable_myTable]


  • In your windows application, drag and drop a treeview control onto your form.
  • Populate a DataTable with your stored procedure.
Pass your TreeNodeCollection, the parentID you wish to start with and DataTable to the following method: eg. PopulateTreeView(SomeTreeView.Nodes, 0, SomeDataTable);

protected void PopulateTreeView (TreeNodeCollection parentNode, int parentID, DataTable folders)
{   
    foreach (DataRow folder in folders.Rows)
    {
        if (Convert.ToInt32(folder["parentID"]) == parentID)
        {
            String key = folder["ID"].ToString();
            String text = folder["title"].ToString();
            TreeNodeCollection newParentNode = parentNode.Add(key, text).Nodes;
            PopulateTreeView(newParentNode, Convert.ToInt32(folder["ID"]), folders);                    
        }
    }
}

If everything went according to plan, you'll end up with something like this:


Leave a Comment


Very good December 16, 2019 by mojtaba

Thanks It helps me

very usefull code May 30, 2016 by dhananjay umrao

its very emportant and simplest code. thanks

tnx April 15, 2016 by Sohrab

thanks for your solution. I attempt to use recursive for this problem,but I could not. Your answer Is Perfect.

Treeview August 28, 2015 by devidas

Good Example

thank you ! June 20, 2014 by Anonymous

thank you !

Thank you May 11, 2014 by Ali

your code is very useful for me. thanks a lot thank you man. your are my hero

problems June 11, 2013 by alex

i'm doing exactly like you and the result was the next: An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll how can I fixe it?

سپاس May 17, 2013 by dvdj

سلام دو روز تو اینترنت دنبالش میگشتم!! سپاسگذارم private void button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); TreeNodeCollection parentNode = treeView1.Nodes; sqlDataAdapter dap = new sqlDataAdapter ("SELECT * FROM MyTable ", conn); dap.Fill(dt); PopulateTreeView(parentNode, 0, dt); }

April 21, 2013 by Anonymous

Thank you!!!!

thanks..... March 15, 2013 by Thành Trần

Good