Populate a TreeView Control 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:
Posted by - Christoff Truter
Date - 2009-08-27 16:01:03
Comments
1 2 Last / 2 Pages (16 Entries)
Post comment