用递归绑定TreeView,数据库表设计的时候必不可少的2个字段分别是NodeId和ParentId,其中NodeId是用来标识节点本身的,ParentId是父节点的ID,如下图(记住第一个节点的NodeId不能为0,父节点的ID为0,不然会出现死循环)
绑定TreeView的代码:
- DataTable table1 = new DataTable();
- DataTable dt = new DataTable();
- protected void Page_Load(object sender, EventArgs e)
- {
- Response.Cache.SetNoStore();
- if (!IsPostBack)
- {
- sys_treemenuApp bll = new sys_treemenuApp();
- DataSet set2 = bll.GetList("");
- table1 = set2.Tables[0];//给table1赋值
- this.InitTree(this.TreeView1.Nodes, "0");
- this.TreeView1.Attributes.Add("OnClick", "postBackByObject()");//执行JS,为了选择节点后能返回后台处理
- this.TreeView1.ExpandAll();
- }
- }
- //递归生成树
- private void InitTree(TreeNodeCollection Nds, string parentId)
- {
- DataView view1 = new DataView();
- DataView view2 = new DataView();
- DataSet set1 = new DataSet();
- view1.Table = table1;
- view2.Table = table1;
- view1.RowFilter = "ParentId='" + parentId + "'";
- Admin_UserrightApp bll = new Admin_UserrightApp();
- DataSet ds = bll.GetList(" userid=" + Request["id"].ToString() + "");//获取登录用户拥有的权限,拥有权限的节点为选中状态
- foreach (DataRowView view3 in view1)
- {
- TreeNode node1 = new TreeNode();
- node1.Expanded = false;
- node1.Value = view3["NodeId"].ToString();
- node1.Text = view3["NodeName"].ToString();
- node1.ImageUrl = view3["Icon"].ToString();
- node1.NavigateUrl = view3["Address"].ToString() + "?NodeId=" + view3["NodeId"].ToString();
- node1.Target = "mainwindow";
- for(int i=0;i<ds.Tables[0].Rows.Count;i++)//绑定节点是否为选中状态,这里又一个循环,感觉效率不高,有什么更好的方法望指教
- {
- if(node1.Value.ToString() ==ds.Tables[0].Rows[i]["NodeId"].ToString())
- {
- node1.Checked = true;
- }
- }
- Nds.Add(node1);
- string text1 = view3["NodeId"].ToString();
- view2.RowFilter = "ParentId='" + text1 + "'";
- if (view3["NodeId"].ToString() != "0")
- {
- this.InitTree(node1.ChildNodes, node1.Value.ToString());//递归调用
- }
- }
- }
- //子节点有选中的,父节点默认选中
- protected void TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
- {
- //bool check=false;
- if (e.Node.Checked == true)
- {
- if (e.Node.Parent != null)
- {
- e.Node.Parent.Checked = true;
- }
- }
- }
- }
JS代码:
- <mce:script type="text/javascript"><!--
- function postBackByObject()
- {
- var obj = window.event.srcElement;
- if(obj.tagName == "INPUT" && obj.type == "checkbox")
- {
- __doPostBack("","");
- }
- }
- // --></mce:script>
最终效果图: