怎么生成动态TreeView .求简单实例。。

解决方案 »

  1.   

    //从网上摘录的,第一级可以按照下面的方法绑定,以后的级别可以写一个递归调用函数就可以了!下面的仅供参考,至于递归函数怎么写,自己看看,研究一下吧...关于VS2005中TreeView控件动态绑定数据库
    由于一直做Web开发,对于TreeView这个控件用的比较少,今天在做桌面应用程序的时候,遇到了这个控件,项目中的需求是需要分三级,动态从数据库中绑定,下面是我实现的方法,供大家参考第一级    private void BindTree()
        {
            DataSet ds = new DataSet();
            string sql = "select * from Address";
            ds = adb.getDataSet(sql, "Address");
            foreach (DataRow dr in ds.Tables[0].Rows)
            {            TreeNode tn = new TreeNode();
                tn.Text =dr["AddressID"].ToString()+"   "+ dr["AddressName"].ToString(); //根据需求要帮你数据库中的两列
                tn.Value = dr["AddressID"].ToString();
                TreeView1.Nodes[0].ChildNodes.Add(tn);
                BandingAddressOne(tn);  //第二级的方法
            }
        }第二级 public void BandingAddressOne(TreeNode node)
        {
            int id = Convert.ToInt32(node.Value);
            DataSet ds = new DataSet();
            string sql = string.Format("select * from AddressOne where AddressID={0}", id);
            ds = adb.getDataSet(sql, "AddressOne");
            foreach (DataRow dr in ds.Tables["AddressOne"].Rows)
            {
                TreeNode tn = new TreeNode();
                tn.Text =dr["AddressOneID"].ToString()+"  "+ dr["AddressOneName"].ToString();
                tn.Value = dr["AddressOneID"].ToString(); 
                node.ChildNodes.Add(tn);//在这个地方我一开始遇到了一个问题,就是之前写的是 TreeView1.Nodes//[0].ChildNodes.Add(tn); 而这样出现的结果是,当我点击第一级,也就是根的时候,本来要绑定的第二级也成了第一级,当我多次点击的时候,就会循环的绑定。
                BandingAddressTwo(tn);
            }
        }第三级    public void BandingAddressTwo(TreeNode node)
        {
            int id = Convert.ToInt32(node.Value);
            DataSet ds = new DataSet();
            string sql = string.Format("select * from AddressTwo where AddressOneID={0}", id);
            ds = adb.getDataSet(sql, "AddressTwo");
            foreach (DataRow dr in ds.Tables["AddressTwo"].Rows)
            {
                TreeNode tn = new TreeNode();
                tn.Text =dr["AddressTwoID"].ToString()+"  "+ dr["AddressTwoName"].ToString();
                tn.Value = dr["AddressTwoID"].ToString();
                node.ChildNodes.Add(tn);
            }
        }通过这三级,我发现,它们每次绑定的方法差不多,只是在每一级的方法中调用下一级的方法,做为它的枝或者叶
      

  2.   

    怎么用到dataset了?需要引用命名空间吗?
      

  3.   

    递归……数据库:
    NodeId ParentId NodeName
      1       0       1
      2       1       1.1
      3       1       1.2
      4       3       1.2.1
      5       3       1.2.2
      6       0       2
    ……
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack){
                CreateTreeView();
            }
        }    /// <summary>
        /// 创建 TreeView
        /// 此方法采取一次性加载目标数据到 DataTable,递归查询 DataTable ,创建子节点
        /// </summary>
        private void CreateTreeView()
        {
            //虚拟的根节点 ID, 表中 ParentID=0 的节点表示无实际父节点
            const int VirtualRootId = 0; 
            const string SQL_SELECT = "SELECT NodeId, NodeName,ParentId FROM TreeView ORDER BY NodeId ASC";      
            string connStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;        
            
            SqlDataAdapter da = new SqlDataAdapter(SQL_SELECT, new SqlConnection(connStr));
            DataTable dt = new DataTable();        
            da.Fill(dt);
            
            CreateTreeViewRecursive(treeMenu.Nodes, dt, 0);
        }    /// <summary>
        /// 递归查询数据,创建 TreeNode 节点
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="dataSource"></param>
        /// <param name="parentId"></param>
        private void CreateTreeViewRecursive(TreeNodeCollection nodes, DataTable dataSource, int parentId)
       {
            //
            string fliter = String.Format("ParentId={0}", parentId);
            // 查询子节点
            DataRow[] drArr = dataSource.Select(fliter);
            
            TreeNode node;        
            foreach(DataRow dr in drArr)                      
            {   
                node = new TreeNode();
                nodes.Add(node);
                node.Text = (string)dr["NodeName"];            
                // 设置其他属性                 
                           
                // 递归创建子节点
                CreateTreeViewRecursive(node.ChildNodes, dataSource,Int32.Parse(dr["NodeId"].ToString()));
                
                // 移除已添加行,提高性能
                dataSource.Rows.Remove(dr);
            }
        }</script><html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>ASP.NET DEMO15: CreateTreeViewResursiveFromDb</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>Menu Tree created from DataBase</h1>
            <a href="http://www.cnblogs.com/Jinglecat/archive/2007/08/10/850090.html">More Details</a>
            <hr />
            <asp:TreeView ID="treeMenu" runat="server"  ExpandDepth="1">
            </asp:TreeView>
        </div>
        </form>
    </body>
    </html>