最近在做一个信息管理系统的后台,打算用树型结构显示导航列表,用一般的遍历实现不了这样无限级别的导航,所以使用递归.
一.数据库表结构大致是这样:
ID Name(导航名) ParentID(对应父级)
1 后台管理 0
2 人员管理 1
3 系统人员 2
4 员工管理 3
5 单位管理 1
6 基础资料 0
7 客户管理 6
8 商品管理 6
……
还有很多属性,这里就不列举出来了,在日后将推出权限方面的文章再提及其他属性,为了思路清晰,实现树绑定仅这些列足够.
预期效果:
- 后台管理
- 人员管理
系统人员
员工管理
- 单位管理
- 基础资料
- 客户管理
- 商品管理
(针对列举的数据只有3层,我们要做的是无限级别)
二.初期准备:新建Asp.net页面,从导航控件盒拖入TreeView控件
三.思路:
遍历找出没有父级的节点A,如果有下级节点则将下级节点B添加到A的子集,如果B也拥有下级节点C,则将C添加到B的子集,……从这规律我们可以推导出需要遍历的地方以及参数包括 当前节点ID,当前节点实体.以下是代码:
//得到导航列表 private List<Model.Sys_Navigation> NavList = new BLL.Sys_Navigation().GetList(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //执行绑定 CreateTree(); } } #region 递归绑定树控件 private void CreateTree() { foreach (Model.Sys_Navigation model in NavList.Where(p => p.ParentID == 0)) { TreeNode ParentNode = new TreeNode(model.Name, model.ID.ToString()); TreeView1.Nodes.Add(ParentNode); GetChildNodes(ParentNode); } } private void GetChildNodes(TreeNode ParentNode) { foreach (Model.Sys_Navigation model in NavList.Where(p => p.ParentID == MyConvert.toInt32(ParentNode.Value))) { TreeNode ChildNode = new TreeNode(model.Name, model.ID.ToString()); if (NavList.Exists(p => p.ParentID == model.ID)) GetChildNodes(ChildNode); ParentNode.ChildNodes.Add(ChildNode); } } #endregion
代码已经测试通过,为何不能本地上传图片呢,555..只有文字,十分空洞.