从数据库读取数据绑定到TREEVIEW上
(下面是在别人的博客中取出来的数据)
有如下一张表解释:DEPT_ID是部门号,NAME_DEP是部门名称,ID_DEPT是所属的部门号,其意义是,如:DEPT_ID 为000000 NAME_DEP为北京检查院,ID_DEPT为000000表示这是根节点,也就是一级节点,又如:DEPT_ID为000004,NAME_DEP为成都检查院,ID_DEPT为000004也是指这是根节点,也是一级节点,又如DEPT_ID为000002,NAME_DEP为检查办,ID_DEPT为000000,表示这个部门是北京检查院的下级部门,也就是二级节点,DEPT_ID为000003这个部门是DEPT_ID为000001的子部门,是它的更下一级节点,程序运行后的效果如下图:
我就是想动态读取数据库中的数据,然后像上图所示的树形结构,大家都又什么好办法拿出来晒晒,我在博客上看到一个办法,但是觉得效率不高http://blog.csdn.net/jjx0224/archive/2010/01/15/5193834.aspx
这是能实现的代码,但觉得不好,大家看看还有什么好办法

解决方案 »

  1.   

    我通常用这种方式:
    比你的表多加一个字段Level用于表示级次
    DeptId  DeptName  ParentId  Level
    00000   北京检察院   null      1
    00001   党委         00001     1
    00002   检察办       00001     1
    00003   政治部       00001     2
    00004   成都检察院   null      1
    然后这样查出来: select * from Dept order by Level
    这样可以保证一次循环就可以加上所有节点,因为当前的节点的上一级必定已经加入树内,具体代码就不写了,很简单了.
      

  2.   

    递归ID_DEPT循环绑定数据
    TreeView 
      

  3.   

    private void button1_Click(object sender, EventArgs e)
            {            
                DataTable dt = new DataTable();
                dt.Columns.Add("depart_id");
                dt.Columns.Add("depart_name");
                dt.Columns.Add("parent_id");            DataRow dr;            dr = dt.NewRow();
                dr[0] = "1";
                dr[1] = "name1";
                dr[2] = "";
                dt.Rows.Add(dr);            dr = dt.NewRow();
                dr[0] = "2";
                dr[1] = "name2";
                dr[2] = "1";
                dt.Rows.Add(dr);            dr = dt.NewRow();
                dr[0] = "3";
                dr[1] = "name3";
                dr[2] = "2";
                dt.Rows.Add(dr);            dr = dt.NewRow();
                dr[0] = "4";
                dr[1] = "name4";
                dr[2] = "3";
                dt.Rows.Add(dr);            this.treeView1.Nodes.Clear();            DataRow[] drs = dt.Select("parent_id=''");
                if (drs != null)
                {
                    if (drs.Length > 0)
                    {
                        foreach (DataRow tempdr in drs)
                        {
                            TreeNode oTreeNode = new TreeNode();
                            oTreeNode.Text = tempdr["depart_name"].ToString();
                            fTreeNone(oTreeNode, dt, tempdr["depart_id"].ToString());
                            this.treeView1.Nodes.Add(oTreeNode);
                            
                        }
                    }
                }
            }        private void fTreeNone(TreeNode oTreeNode, DataTable dt, string parentid)
            {
                DataRow[] drs = dt.Select("parent_id='" + parentid + "'");
                if (drs != null)
                {
                    if (drs.Length > 0)
                    {
                        foreach (DataRow tempdr in drs)
                        {
                            TreeNode oTempTreeNode = new TreeNode();
                            oTempTreeNode.Text = tempdr["depart_name"].ToString();
                            oTreeNode.Nodes.Add(oTempTreeNode);
                            fTreeNone(oTempTreeNode, dt, tempdr["depart_id"].ToString());                    }
                    }
                }
            }
      

  4.   

    就是id和PARENTID,也就是说,一个数据中的PARENTID等于另外一个数据的ID的时候,那么第一个数据就是第二个数据的子节点,就是这样啊
      

  5.   

    如果限制条件:本部门的上级部门编码<本部门的编码
    成立:就可以一次循环把它们全加到树里
    不成立:必须经过很多次的循环才能全加到树里,大概就跟LZ原来的解法是一样的.
      

  6.   

    有具体demo没+  回复内容太短了! 
      

  7.   

    都是做一个ParentID,然后递归出树状结构
      

  8.   

    id格式 000_000_000 varchar类型。
    然后表结构,name ,id,parent_id
    首先通过ID的length可以知道ID的Leave,parent_Id知道父节点。这个表结构就可以支持无限极分类树了,级别限制跟Id字段数据类型相关。不需要递归。
      

  9.   

    [style="color:#FFFFFE"]ff[/color]
      

  10.   

    http://www.cnblogs.com/MR_ke/archive/2010/03/16/1687440.html
    这是我做的一个demo,含源码下载。
      

  11.   

    说下我的思路:
    第一次加载就只是加载其下面的一层 这样不会出现假死现象。
    下面的代码是年前我一个项目中用到的:希望对你有帮助
            #region TreeView AfterSelect Event.
            private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                this.getCon(); // Connect the database
                string name = this.treeView1.SelectedNode.Text.ToString();
                this.treeView1.SelectedNode.Nodes.Clear(); // Clear the selected node's children nodes.            SortedList<string, int> childern = findUnder(name); // Find the child nodes from the data.            foreach (KeyValuePair<string, int> s in childern)
                {
                    if (data.Contains(s.Key)) // Check the srearch contain the nodes.
                    {
                         TreeNode child = new TreeNode(s.Key.ToString());
                         this.treeView1.SelectedNode.Nodes.Add(child); // Add the found nodes into the selected node.
                         data.Remove(s.Key);
                    }
                }
                for (int k = 0; k < data.Count; k++) 
                {
                    TreeNode child = new TreeNode(data[k].ToString());
                    this.treeView1.Nodes.Add(child);
                }
                this.treeView1.SelectedNode.Expand();
                this.odcConnection.Close();// Close the data connection.
            }不懂可以和我聊聊
    QQ:287072382
    MSN:[email protected]