ID  NAME  PARENTID
1   电器     0
2   电视机   1
3   洗衣机   1
4   冰箱     1想实现的树是电器
|
----电视机
----洗衣机
----冰箱

解决方案 »

  1.   

    http://www.cnblogs.com/xiang/archive/2006/07/13/449944.aspx
      

  2.   

    用递归DataSet ds=new DataSet();
    private void Form1_Load(object sender, System.EventArgs e)
    {
    // 定义数据库连接
    SqlConnection CN = new SqlConnection();
    try 
    {
    //初始化连接字符串
    CN.ConnectionString= 
    "data source=pmserver;initial catalog=Bench;
    persist security info=False;user id=sa;Password=sa;";
    CN.Open();
    //添加命令,从数据库中得到数据
    SqlCommand sqlCmd= new SqlCommand();
    sqlCmd.Connection = CN;
    sqlCmd.CommandText = "select * from tbTree";
    sqlCmd.CommandType = CommandType.Text ;
    SqlDataAdapter adp = new SqlDataAdapter(sqlCmd);
    adp.Fill(ds);
    }
    catch (Exception ex)
    {
    throw (ex);   
    }
    finally 
    {
    CN.Close();
    }
    //调用递归函数,完成树形结构的生成
    AddTree(0, (TreeNode)null);
    } // 递归添加树的节点
    public void AddTree(int ParentID,TreeNode pNode) 
    {
    DataView dvTree = new DataView(ds.Tables[0]);
    //过滤ParentID,得到当前的所有子节点
    dvTree.RowFilter =  "[PARENTID] = " + ParentID;
    foreach(DataRowView Row in dvTree) 
    {
    if(pNode == null) 
    {    //'̀添加根节点
    TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
    AddTree(Int32.Parse(Row["ID"].ToString()),Node);    //再次递归

    else 
    {   //添加当前节点的子节点
    TreeNode Node =  pNode.Nodes.Add(Row["ConText"].ToString());
    AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
    }
    }
    }
      

  3.   

    我写出来的效果是+电器
    ---电器
    +电视机
    ---电视机
    +洗衣机
    ---洗衣机
    +冰箱
    ---冰箱
    private DataTable CreateTable()
            {
                OConn.Open();//打开数据库连接
                OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器
                da.Fill(dt);//进行数据填充
                return dt;//返回一个数据表dt
            }        private void CreateTree()
            {
                DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows);
                string strParentID = "";
                TreeNode tnParent = null;
                foreach (DataRowView drv in dv)
                {
                    if (strParentID != drv["PARENTID"].ToString())
                    {
                        //Add parent node here
                        strParentID = drv["NAME"].ToString();
                        tnParent = treeView1.Nodes.Add(strParentID);
                    }
                    tnParent.Nodes.Add(drv["NAME"].ToString());
                }
            }
      

  4.   

    研究下微软的解释
    http://www.microsoft.com/china/community/Column/21.mspx
      

  5.   

    不难!
    1  : select where =0;2:      增加子接点;3:   递归增加子节点
      

  6.   

    using System; 
    using System.Data; 
    using System.Configuration; 
    using System.Web; 
    using System.Web.Security; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Web.UI.WebControls.WebParts; 
    using System.Web.UI.HtmlControls; 
    using System.Data.SqlClient; 
    public partial class _Default : System.Web.UI.Page 

        protected string _connstr = ConfigurationManager.ConnectionStrings["DemoConnectionstrings"].ConnectionString; 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            if (!Page.IsPostBack) 
            { 
                BindTree(); 
                using (SqlConnection _conn = new SqlConnection(_connstr)) 
                { 
                    SqlCommand _comm = new SqlCommand("select * from treeview", _conn);                 _conn.Open(); 
                    using (SqlDataReader r = _comm.ExecuteReader()) 
                    { 
                        while (r.Read()) 
                        { 
                            ListItem item = new ListItem(r["txt"].ToString(), r["id"].ToString()); 
                            this._dd_parent.Items.Add(item); 
                        } 
                    } 
                } 
                this._dd_parent.Items.Insert(0, new ListItem(".", "0")); 
            } 
        } 
        protected void BindTree() 
        { 
            TreeNode node = new TreeNode();   //这里是创建一个根节点,就是dome中看到的Root 
            node.Text = "Root"; 
            CreateChildTree(node, 0);    
            _tree_view.Nodes.Add(node); 
        }     protected void CreateChildTree(TreeNode _parentNode, int _parentID) 
        { 
            using (SqlConnection _conn = new SqlConnection(_connstr)) 
            { 
                SqlCommand _comm = new SqlCommand(); 
                string sql = "select * from treeview where rootid=@rootid"; 
                _comm.Parameters.Add("@rootid", SqlDbType.Int).Value = _parentID; 
                _comm.CommandText = sql; 
                _comm.Connection = _conn; 
                _conn.Open(); 
                using (SqlDataReader r = _comm.ExecuteReader()) 
                { 
                    while (r.Read()) 
                    { 
                        TreeNode _node = new TreeNode(r["txt"].ToString()); 
                            CreateChildTree(_node, (int)r["ID"]);  //递归出子节点 
                            _parentNode.ChildNodes.Add(_node); 
                    } 
                } 
            } 
        } 
        protected void _btn_submit_Click(object sender, EventArgs e) 
        { 
            int _rootid = Convert.ToInt16(this._dd_parent.SelectedValue); 
            string _txt = this._txt_txt.Text.Trim(); 
            using (SqlConnection _conn = new SqlConnection(_connstr)) 
            { 
                SqlCommand _comm = new SqlCommand("insert into treeview (txt,rootid) values (@txt,@id)", _conn); 
                _comm.Parameters.Add("@txt", SqlDbType.VarChar, 50).Value = _txt; 
                _comm.Parameters.Add("@id", SqlDbType.Int).Value = _rootid; 
                _conn.Open(); 
                _comm.ExecuteNonQuery(); 
            } 
            this._tree_view.Nodes.Clear(); 
            BindTree(); 
        } 
    }
      

  7.   

    想实现的树是电器
    |
    ----电视机
    ----洗衣机
    ----冰箱但我写出来的效果是+电器
    ---电器
    +电视机
    ---电视机
    +洗衣机
    ---洗衣机
    +冰箱
    ---冰箱
    private DataTable CreateTable()
            {
                OConn.Open();//打开数据库连接
                OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器
                da.Fill(dt);//进行数据填充
                return dt;//返回一个数据表dt
            }        private void CreateTree()
            {
                DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows);
                string strParentID = "";
                TreeNode tnParent = null;
                foreach (DataRowView drv in dv)
                {
                    if (strParentID != drv["PARENTID"].ToString())
                    {
                        //Add parent node here
                        strParentID = drv["NAME"].ToString();
                        tnParent = treeView1.Nodes.Add(strParentID);
                    }
                    tnParent.Nodes.Add(drv["NAME"].ToString());
                }
            }
    -------------------------------------
    能不能在这个上面修改一下.
      

  8.   

    我要的是winform.别再给我web的了
      

  9.   

    win
    如何把树与数据库的信息进行绑定
    http://blog.csdn.net/knight94/archive/2006/05/01/704281.aspx
      

  10.   

    Knight94(愚翁)我看了你写的,也按照你写的方式写了.但读取出来只有一个跟父结点private DataTable CreateTable()
            {
                try
                {
                    OConn.Open();//打开数据库连接
                    OracleDataAdapter da = new OracleDataAdapter("select * from Mytable",OConn);//建立数据适配器
                    da.Fill(dt);//进行数据填充
                    return dt;//返回一个数据表dt
                }catch(Exception ex)
                {
                    throw(ex);
                }finally
                {
                    OConn.Close();
                }
            }   
            private void CreateTree()
            {            DataRow[] drArray = dt.Select("ParentID=0",                                "ParentID ASC",                                DataViewRowState.CurrentRows);            if (drArray.Length == 0) return;            TreeNode tnNew = null;            foreach (DataRow dr in drArray)
                {                tnNew = treeView1.Nodes.Add(dr["NAME"].ToString());                tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag                CreateTreeNode(ref tnNew);            }        }        private void CreateTreeNode(ref TreeNode tnParent)
            {            //Get children data info            DataRow[] drArray = dt.Select(                string.Format("ParentID = {0}", tnParent.Tag),                "ParentID ASC",                DataViewRowState.CurrentRows);            if (drArray.Length == 0) return;            TreeNode tnNew = null;            foreach (DataRow dr in drArray)
                {                tnNew = tnParent.Nodes.Add(dr["NAME"].ToString());                tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag                CreateTreeNode(ref tnNew);            }        }请指教
      

  11.   

    ID NAME PARENTID
    1 电器     0
    2 电视机   1
    3 洗衣机   1
    4 冰箱     1连接字符串
    OracleConnection OConn = new OracleConnection("User Id=MyID;PassWord=MyPass;Data Source=192.168.2.1:1521/MyData;");
    这个是表结构.是不是我在填充数据的时候出了错?
      

  12.   

    现在有成型的例子了么?有的话发一份,我正在研究
    [email protected] 谢谢
      

  13.   

    这就很怪了,你单步调试,看看dt.Select后的结果是什么
      

  14.   

    递归就是速度慢了。一个只有48条记录的表,生成3级的树竞要花2、3秒左右
    当然我是直接在库里读的。如果先放到dataTable里可能会好些?
      

  15.   

    奇怪。为什么呢?应该是填充Dataset的时候出了问题
      

  16.   

    强烈建议兄弟们自己写xmlTreeView组件
    目前我写好的基本上能满足你的要求,但还有BUG
    我在:http://community.csdn.net/Expert/topic/5096/5096131.xml?temp=.3367731#top
    也建议用自己写组件,不过大多数人还是没理解XML带来的好处
      

  17.   

    XML是挺好的.只是好象用的人还不是那么多
      

  18.   

    我相信来CSDN的 朋友们,可以说,,,
    至少有一半以上不懂的,,
    这个朋友,也是关于无限级分类的,都是说的比较模糊的...
    看下我的帖子,还有好多类似我的帖子,,都是没真正了解的!都是模糊概念
    http://community.csdn.net/Expert/topic/5158/5158852.xml?temp=.7078668
    http://community.csdn.net/Expert/topic/5158/5158877.xml?temp=.5437586我帖子上面2个朋友发出来了那2部分代码确实不错!
    可以实现,但是我是真的怎么调都没成功......或许是我不行吧....但是我会认真对待的
    ....没有详细的理解,,,,象我一样只是了解表面而已!!!我可以说楼主,,到目前为止还是没有懂无限分类的真正的用法.没有真正的理解叫程序员???说实在的,我搞不懂之前,,我会在这里一直等下去的!!!
      

  19.   

    我写的XmlTreeView for WinForm已经完成,就是在节点增至3000个以上时再增加一节点要化0.5秒左右,有点慢,节点的级数和int一样多(当然我也可改成long int)