实现树形菜单很多人使用递归来实现,这样效率比较低,如果你的数据结构是以下这种方式,可以试试这种方法:数据结构(SQL2005):表名:SysFunNodeId(int) DisplayName(varchar) ParentNodeId(int)101 他爹1号 0102 他爹2号 0101001 他儿1号 101101002 他儿2号 101102001 他女1号 102102002 他女2号 102102003 他女3号 102
存储过程:CREATE PROCEDURE GetAllSysFunASBEGINDECLARE @tab TABLE( NodeId varchar(50), DisplayName varchar(50), ParentNodeId int)INSERT INTO @tab SELECT NodeId, DisplayName, ParentNodeId FROM dbo.SysFunSELECT NodeId, DisplayName, ParentNodeId FROM @tab ORDER BY NodeIdENDGO
查出的结果:NodeId DisplayName ParentNodeId101 他爹1号 0101001 他儿1号 101101002 他儿2号 101102 他爹2号 0102001 他女1号 102102002 他女2号 102102003 他女3号 102如果SysFun表NodeId本身就是varchar类型就不用建临时表@tab了,直接排序
循环方法:
private void ShowTreeView() { int fatherNode = 0;//记录父节点Id TreeNode treeNode = null;//父节点 TreeNode treeNodes = null;//子节点 IList<SysFun> listSysFuns = SysFunManager.GetAllSysFun();//查询 foreach (SysFun sysFun in listSysFuns) { if (sysFun.ParentNodeId == 0) { fatherNode = int.Parse(sysFun.NodeId); treeNode = new TreeNode(sysFun.DisplayName, sysFun.NodeId.ToString(), "images/CloseTree.gif", null, ""); this.tvUserRightMenu.Nodes.Add(treeNode); } else if (sysFun.ParentNodeId == fatherNode) { treeNodes = new TreeNode(sysFun.DisplayName, sysFun.NodeId.ToString(), "images/OpenTree.gif", sysFun.NodeURL, ""); treeNode.ChildNodes.Add(treeNodes); } else { string valuePath = GetValuePath(sysFun.ParentNodeId); treeNode = this.tvUserRightMenu.FindNode(valuePath); fatherNode = sysFun.ParentNodeId; treeNodes = new TreeNode(sysFun.DisplayName, sysFun.NodeId.ToString(), "images/OpenTree.gif", sysFun.NodeURL, ""); treeNode.ChildNodes.Add(treeNodes); } } }
private string GetValuePath(int parentNodeId) { StringBuilder sb = new StringBuilder(); while (parentNodeId != 0) { sb.Insert(0, parentNodeId); sb.Insert(0, this.tvUserRightMenu.PathSeparator); parentNodeId /= 1000; } return sb.ToString().Substring(1); }