ASP.NET树形控件TreeView的递归绑定

 用递归绑定TreeView,数据库表设计的时候必不可少的2个字段分别是NodeId和ParentId,其中NodeId是用来标识节点本身的,ParentId是父节点的ID,如下图(记住第一个节点的NodeId不能为0,父节点的ID为0,不然会出现死循环

 绑定TreeView的代码:

[c-sharp]  view plain copy
  1. DataTable table1 = new DataTable();  
  2.     DataTable dt = new DataTable();  
  3.     protected void Page_Load(object sender, EventArgs e)  
  4.     {  
  5.         Response.Cache.SetNoStore();  
  6.         if (!IsPostBack)  
  7.         {  
  8.             sys_treemenuApp bll = new sys_treemenuApp();  
  9.             DataSet set2 = bll.GetList("");  
  10.   
  11.             table1 = set2.Tables[0];//给table1赋值  
  12.             this.InitTree(this.TreeView1.Nodes, "0");  
  13.             this.TreeView1.Attributes.Add("OnClick""postBackByObject()");//执行JS,为了选择节点后能返回后台处理  
  14.             this.TreeView1.ExpandAll();  
  15.         }  
  16.     }  
  17.     //递归生成树  
  18.     private void InitTree(TreeNodeCollection Nds, string parentId)  
  19.     {  
  20.         DataView view1 = new DataView();  
  21.         DataView view2 = new DataView();  
  22.         DataSet set1 = new DataSet();  
  23.   
  24.         view1.Table = table1;  
  25.         view2.Table = table1;  
  26.         view1.RowFilter = "ParentId='" + parentId + "'";  
  27.         Admin_UserrightApp bll = new Admin_UserrightApp();  
  28.         DataSet ds = bll.GetList(" userid=" + Request["id"].ToString() + "");//获取登录用户拥有的权限,拥有权限的节点为选中状态  
  29.         foreach (DataRowView view3 in view1)  
  30.         {  
  31.             TreeNode node1 = new TreeNode();  
  32.             node1.Expanded = false;  
  33.             node1.Value = view3["NodeId"].ToString();  
  34.             node1.Text = view3["NodeName"].ToString();  
  35.             node1.ImageUrl = view3["Icon"].ToString();  
  36.             node1.NavigateUrl = view3["Address"].ToString() + "?NodeId=" + view3["NodeId"].ToString();  
  37.             node1.Target = "mainwindow";  
  38.             for(int i=0;i<ds.Tables[0].Rows.Count;i++)//绑定节点是否为选中状态,这里又一个循环,感觉效率不高,有什么更好的方法望指教  
  39.             {  
  40.              if(node1.Value.ToString() ==ds.Tables[0].Rows[i]["NodeId"].ToString())  
  41.              {  
  42.                  node1.Checked = true;  
  43.              }  
  44.             }  
  45.             Nds.Add(node1);  
  46.             string text1 = view3["NodeId"].ToString();  
  47.             view2.RowFilter = "ParentId='" + text1 + "'";  
  48.             if (view3["NodeId"].ToString() != "0")  
  49.             {  
  50.                 this.InitTree(node1.ChildNodes, node1.Value.ToString());//递归调用  
  51.             }  
  52.         }  
  53.     }  
  54.     //子节点有选中的,父节点默认选中  
  55.     protected void TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)  
  56.     {  
  57.         //bool check=false;  
  58.         if (e.Node.Checked == true)  
  59.         {  
  60.             if (e.Node.Parent != null)  
  61.             {  
  62.                 e.Node.Parent.Checked = true;  
  63.             }  
  64.         }  
  65.     }  
  66. }  

 JS代码:

 

[xhtml]  view plain copy
  1. <mce:script type="text/javascript"><!--  
  2.     function postBackByObject()  
  3.     {  
  4.         var obj = window.event.srcElement;  
  5.          
  6.         if(obj.tagName == "INPUT" && obj.type == "checkbox")  
  7.         {  
  8.             __doPostBack("","");  
  9.         }  
  10.     }  
  11.       
  12. // --></mce:script>  

最终效果图:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值