关于TreeView的实例

前台代码 (只需要有TreeView控件, 添加ID,其他默认生成)

<form id="form1" runat="server">
<div>

<asp:treeview ID="tree1" ExpandDepth="0" runat="server" />
</div>
</form>

 

后台代码 

    Page_Load代码

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         }
View Code

 

    获取节点

        /// <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;
        }
View Code

  

    绑定子节点

 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         }
View Code

 

    绑定TreeView树

 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         }
View Code

 

  心得体会 :  也许这个效率很低,不过这个也是我自己写的简单的一部分。整个过程跟DropDownList很像,可以参照添加DropDownList的方法添加;

  设计思路 :  

        首先,先写出关于获取节点的方法, 里面有只需要三个值 当前的模块等级, 模块ID, 模块名字

        第二,绑定一级栏目(一级栏目的绑定相对于子节点较为特殊),所以单独写一个方法,当然写成一个方法也是可以。边绑定要判断是否有子节点,如果无子节点则绑定超级链接。

        第三,绑定二级栏目、跟一级栏目的获取差不多,

        第四, 第一次显示时,模块只需要显示一级模块 即(tree1.ExpandDepth=0)。其他模块默认隐藏

  替换方法 : 如果第一次读取数据库时生成XML文件,这样是否可以加快速度,可以减缓对数据库的读取速度。使用XML的方法生成树图,以后再学习.Ending.

posted @ 2013-12-05 22:20  信息技术的风采  阅读(415)  评论(0编辑  收藏  举报