Populate a TreeView Control C#

August 27, 2009 by Christoff Truter 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,

Insert some hierarchal data.


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)


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...

	SELECT ID, title, ISNULL(parentID, 0) AS parentID
	FROM myTable

Add a same table key contraint.

ALTER TABLE [dbo].[myTable]  WITH CHECK ADD  CONSTRAINT [FK_myTable_myTable] FOREIGN KEY([parentID])
REFERENCES [dbo].[myTable] ([ID])
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

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


Wow Fantastic ! February 9, 2013 by Dipu

Thanks dude..... U save me....

August 31, 2012 by firdaus.mansuri@gmail.com


firdaus mansuri August 31, 2012 by Anonymous

this is very nice please keep it up and share such thing with us thanks you so much

Very Good August 31, 2012 by Welinton

Very good. Hi, I am Brazilian. I liked your example helped me a lot.

Latest Posts

Simple JavaScript Shop - Back to the future : Part 1

March 20, 2015

Getting my hands dirty with TypeScript

February 17, 2015

Quick and dirty look at TypeScript

January 29, 2015

My personal life in review

January 21, 2015

Quick rundown of possible new C# 6.0 features (perhaps, maybe - I think)

January 19, 2015

Proof of Concept - JavaScript Mediator Framework

January 13, 2015

JavaScript Tip - Benchmarking

January 7, 2015

Google's new and improved reCAPTCHA - simple PHP implementation

January 5, 2015

NASA missions to follow in 2015

January 3, 2015

Online content censorship - South Africa

January 2, 2015

Most Commented on Posts

Moving items between listboxes in ASP.net/PHP example

Move items between two listboxes in ASP.net(C#, VB.NET) and PHP
June 12, 2008

Simple WYSIWYG Editor

Creating a WYSIWYG textbox for your website is actually quite simple.
February 1, 2007

C# YouTube : Google API

Post on how to integrate with YouTube using the Google Data API
March 12, 2011

Populate a TreeView Control C#

Populate a TreeView control in a windows application.
August 27, 2009

Cross Browser Issues: Firefox Word Wrapping

Firefox word wrapping issues
June 9, 2008

Angular   ASP.NET   Astronomy   C#   C++   Coding Horrors   Comedy   Cross Browser   Design Patterns   Google API   IIS   Integration   JavaScript   Love and War   Microsoft Office   Personal   PHP   South Africa   SQL   Threading   TypeScript   Visual Basic   XML