前台代码 (只需要有TreeView控件, 添加ID,其他默认生成)
<form id="form1" runat="server">
<div>
<asp:treeview ID="tree1" ExpandDepth="0" runat="server" />
</div>
</form>
后台代码
Page_Load代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private string myConn = ConfigurationManager.ConnectionStrings["connectionString0"].ConnectionString; 2 protected void Page_Load(object sender, EventArgs e) 3 { 4 if (!IsPostBack) 5 { 6 BindTree(tree1); 7 } 8 }
获取节点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 获得节点 1--当前元素的第几层 2--上级ID 3--更改的数据集 /// </summary> /// <param name="upDegree">当前元素的第几层</param> /// <param name="upID">上级ID</param> /// <param name="ds">更改的数据集</param> /// <returns>是否成功</returns> private bool getNode(int upDegree, string upID, ref DataSet ds) { string myQuery = " select model_ID, model_name, up_ID, degree from Model where degree='" + upDegree + "' and up_ID='" + upID + "';"; SqlConnection conn = new SqlConnection(myConn); conn.Open(); SqlDataAdapter da = new SqlDataAdapter(myQuery, conn); da.Fill(ds); conn.Close(); if (ds.Tables[0].Rows.Count>0) { return true; } return false; }
绑定子节点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 绑定子节点 1--父节点所处级别 2--父节点 return Bool是否有子节点 3 /// </summary> 4 /// <param name="upDegree">第几级</param> 5 /// <param name="tn">父节点</param> 6 /// <returns>是否有子节点</returns> 7 private bool BindChild(int Degree, TreeNode tn){ 8 DataSet ds = new DataSet(); 9 getNode(Degree+1, tn.Value, ref ds); // 获取节点列表 比当前节点更多 10 DataTable dt = ds.Tables[0]; // 加快ds的读取速度 11 TreeNode tn2 = new TreeNode(); // 新增子节点 12 13 int len = dt.Rows.Count; // 子节点数量 14 bool flag = false; // 是否有子节点 false--无子节点 true--有子节点 15 for (int i = 0; i < len; i++) 16 { 17 tn2 = new TreeNode(dt.Rows[i][1].ToString(), dt.Rows[i][0].ToString()); // 生成需要绑定的节点 18 tn.ChildNodes.Add(tn2); // 增加子节点 19 BindChild(Degree + 1, tn2); // 循环绑定子节点 20 flag = true; // 有子节点 21 } 22 if (!flag) // 当没有叶子节点(最底层的节点)时, 则添加超级链接 23 { 24 tn.NavigateUrl = "http://www.baidu.com"; 25 tn.Target = "_blank"; 26 } 27 // 销毁占用内存的空间 28 dt.Dispose(); 29 ds.Dispose(); 30 return flag; 31 }
绑定TreeView树
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 绑定TreeView树 1--treeview的节点ID 3 /// </summary> 4 /// <param name="tv"></param> 5 private void BindTree(TreeView tv) 6 { 7 tv.Nodes.Clear(); // 初始化TreeView 8 9 TreeNode tn = new TreeNode(); 10 DataSet ds = new DataSet(); // 获取子节点 11 getNode(1, "00", ref ds); // 获取一级节点 12 DataTable dt = ds.Tables[0]; // DataTable的读取速度快与DataSet; 13 14 int len = dt.Rows.Count; 15 for (int i = 0; i < len; i++) // 绑定节点TreeNode 16 { 17 tn = new TreeNode(dt.Rows[i][1].ToString(), dt.Rows[i][0].ToString()); // 18 if (!BindChild(1, tn)) // 当无子节点的时候,链接百度,也可以设置ViewState的值 19 { 20 tn.NavigateUrl = "http://www.baidu.com"; 21 tn.Target = "_blank"; 22 } 23 tv.Nodes.Add(tn); // 将节点添加到原来的TreeView中 24 } 25 // 销毁占用内存的空间 26 dt.Dispose(); 27 ds.Dispose(); 28 }
心得体会 : 也许这个效率很低,不过这个也是我自己写的简单的一部分。整个过程跟DropDownList很像,可以参照添加DropDownList的方法添加;
设计思路 :
首先,先写出关于获取节点的方法, 里面有只需要三个值 当前的模块等级, 模块ID, 模块名字
第二,绑定一级栏目(一级栏目的绑定相对于子节点较为特殊),所以单独写一个方法,当然写成一个方法也是可以。边绑定要判断是否有子节点,如果无子节点则绑定超级链接。
第三,绑定二级栏目、跟一级栏目的获取差不多,
第四, 第一次显示时,模块只需要显示一级模块 即(tree1.ExpandDepth=0)。其他模块默认隐藏
替换方法 : 如果第一次读取数据库时生成XML文件,这样是否可以加快速度,可以减缓对数据库的读取速度。使用XML的方法生成树图,以后再学习.Ending.