數據庫菜單表:
SQL腳本:

1 use master 2 go 3 4 create database TreeViewDemo 5 on primary 6 ( 7 name='TreeViewDemo_data', 8 filename='C:\2Study\SQLServer\TreeViewDemo\TreeViewDemo_data.mdf', 9 size=5MB, 10 filegrowth=1MB 11 ) 12 13 create table MenuList 14 ( 15 MenuId int identity(1,1) primary key, 16 MenuName varchar(20) ,--菜單名稱 17 MenuCode varchar(20),--菜單編號 18 ParentId int --父類編號 19 ) 20 21 --一級菜單 22 insert into MenuList (MenuName, MenuCode, ParentId) values ('系統管理','',0)--1 23 insert into MenuList (MenuName, MenuCode, ParentId) values ('學員管理','',0)--2 24 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績管理','',0)--3 25 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤管理','',0)--4 26 insert into MenuList (MenuName, MenuCode, ParentId) values ('系統幫助','Help',0)--5 27 28 --二級菜單 29 insert into MenuList (MenuName, MenuCode, ParentId) values ('密碼修改','ModifyPwd',1) 30 31 insert into MenuList (MenuName, MenuCode, ParentId) values ('添加學員','AddStu',2) 32 insert into MenuList (MenuName, MenuCode, ParentId) values ('批量導入學員','ImportStu',2) 33 insert into MenuList (MenuName, MenuCode, ParentId) values ('學員信息管理','StuManage',2) 34 35 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績查詢與分析','ScoreQuery',3) 36 insert into MenuList (MenuName, MenuCode, ParentId) values ('成績快速查詢','ScoreQuickQuery',3) 37 38 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤打卡','ModifyPwd',4) 39 insert into MenuList (MenuName, MenuCode, ParentId) values ('考勤查詢','ModifyPwd',4) 40 41 select * from MenuList
相關表測試數據:
相關實體類:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TreeViewDemo { public class TVNode { public int MenuId { get; set; } public string MenuName { get; set; } public string MenuCode { get; set; } public int ParentId { get; set; } } }
數據庫查詢(簡易版):

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Data.SqlClient; 7 8 namespace TreeViewDemo 9 { 10 public class SQLHelper 11 { 12 public List<TVNode> GetMenuList() 13 { 14 string connString = "Server=.;DataBase=TreeViewDemo;Uid=sa;Pwd=warrenwell"; 15 string sql = "select MenuId,MenuName, MenuCode, ParentId from MenuList"; 16 List<TVNode> objMenuList = new List<TVNode>(); 17 SqlConnection conn = new SqlConnection(connString); 18 SqlCommand cmd = new SqlCommand(sql,conn); 19 conn.Open(); 20 SqlDataReader objReader = cmd.ExecuteReader(); 21 while (objReader.Read()) 22 { 23 objMenuList.Add(new TVNode 24 { 25 MenuId=Convert.ToInt32(objReader["MenuId"]), 26 MenuName=objReader["MenuName"].ToString(), 27 MenuCode=objReader["MenuCode"].ToString(), 28 ParentId= Convert.ToInt32(objReader["ParentId"]) 29 }); 30 } 31 objReader.Close(); 32 conn.Close(); 33 return objMenuList; 34 } 35 } 36 }
TreeView遞歸實現:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.Reflection; 11 12 namespace TreeViewDemo 13 { 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void Form1_Load(object sender, EventArgs e) 22 { 23 this.nodeList = new SQLHelper().GetMenuList(); 24 25 //創建根節點 26 this.tv.Nodes.Clear();//清空節點 27 TreeNode rootNode = new TreeNode(); 28 rootNode.Text = "學員管理系統"; 29 rootNode.Tag = 0; 30 rootNode.ImageIndex = 0; 31 this.tv.Nodes.Add(rootNode); 32 33 CreateChildNode(rootNode,0); 34 35 //this.tv.Nodes[0].Expand();//展開一級菜單 36 this.tv.ExpandAll();//展開所有菜單 37 } 38 39 private List<TVNode> nodeList = new List<TVNode>(); 40 private void CreateChildNode(System.Windows.Forms.TreeNode parentNode,int parentId) 41 { 42 //找到該節點下的子項(父節點值等於該節點編號) 43 var nodes = from list in this.nodeList 44 where list.ParentId.Equals(parentId) 45 select list; 46 //創建該節點子節點 47 foreach (var item in nodes) 48 { 49 TreeNode node = new TreeNode(); 50 node.Text = item.MenuName; 51 node.Tag = item.MenuCode; 52 53 ////此處可根據節點的parentId來設置圖標 54 if (item.ParentId == 0) 55 { 56 node.ImageIndex = 1; 57 } 58 else 59 { 60 node.ImageIndex = 2; 61 } 62 //父節點添加子節點 63 parentNode.Nodes.Add(node); 64 //調用自身:遞歸 65 CreateChildNode(node,item.MenuId); 66 } 67 } 68 69 private void tv_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 70 { 71 if (e.Node.Level == 2) 72 { 73 Form obj = (Form)Assembly.Load("TreeViewDemo").CreateInstance("TreeViewDemo.Frm" + e.Node.Tag.ToString()); 74 obj.Show(); 75 } 76 } 77 78 private void tv_AfterExpand(object sender, TreeViewEventArgs e) 79 { 80 e.Node.ImageIndex = 0; 81 } 82 83 private void tv_AfterCollapse(object sender, TreeViewEventArgs e) 84 { 85 e.Node.ImageIndex = 1; 86 } 87 } 88 }
實現效果:
歡迎前來指教!