现有数据库数据如下:
ID         NAME
001     原材料
0011    塑料
00111   ABS
00112   PP
00113   AS料
0012    烫金纸
0013    油墨
00131    PPC
00132     PM
……
……
V02     铝盖
V02B    V2组装件
V02C    V2成品件
V02N    V2内塑件类
V02N2   V2内塞类先要将这些数据组成一棵树TreeView,树的形成规律是这样的:取ID,001为根节点,0011为属于001的子节点,而00111,00112,00113是0011的子节点。以此类推。请教如何从数据库中取数写这棵树?C#  treeview

解决方案 »

  1.   

    00111到底是001的11号子节点还是0011的1号子节点。id parentid data 3个字段就能搞定又简单又可靠的设计不用,非要发明一个奇怪的数据结构,简直莫名其妙!
      

  2.   

    用递归能搞定
      private void Form1_Load(object sender, EventArgs e)
     {
      DataRow[] drs = dt.Select("len(ID)=3","ID");
                foreach (DataRow dr in drs)
                {
                    TreeNode nodeParent = tv.Nodes.Add(dr["Name"].ToString());
                    nodeParent.Tag = dr["ID"].ToString();
                    LoadNode(nodeParent, dt);
                }
            }
     private void LoadNode(TreeNode nodeParent, DataTable dt)
            {
                string strPID = nodeParent.Tag.ToString();
                DataRow[] drs = dt.Select(string.Format("len(ID)={0} and id like '{1}%'",strPID.Length+1,strPID) , "ID");
                if (drs != null && drs.Length > 0)
                {
                    foreach (DataRow dr in drs)
                    {
                        TreeNode node = tv.Nodes.Add(dr["Name"].ToString());
                        node.Tag = dr["ID"].ToString();
                        LoadNode(node, dt);
                    }
                }
            }
      

  3.   

    修正一下  private void Form1_Load(object sender, EventArgs e)
     {
      DataRow[] drs = dt.Select("len(ID)=3","ID");
                foreach (DataRow dr in drs)
                {
                    TreeNode nodeParent = tv.Nodes.Add(dr["Name"].ToString());
                    nodeParent.Tag = dr["ID"].ToString();
                    LoadNode(nodeParent, dt);
                }
            }
     private void LoadNode(TreeNode nodeParent, DataTable dt)
            {
                string strPID = nodeParent.Tag.ToString();
                DataRow[] drs = dt.Select(string.Format("len(ID)={0} and id like '{1}%'",strPID.Length+1,strPID) , "ID");
                if (drs != null && drs.Length > 0)
                {
                    foreach (DataRow dr in drs)
                    {
                        TreeNode node = nodeParent.Nodes.Add(dr["Name"].ToString());
                        node.Tag = dr["ID"].ToString();
                        LoadNode(node, dt);
                    }
                }
            }
      

  4.   

    with tb(ID,[NAME])
    as(
    select '001','原材料' union all
    select '0011','塑料' union all
    select '00111',' ABS' union all
    select '00112','PP' union all
    select '00113','AS料' union all
    select '0012','烫金纸' union all
    select '0013','油墨' union all
    select '00131','PPC' union all
    select '00132','PM'),
    cte as(
    select * from tb where id='001' union all
    select t.id,t.name from cte c,tb t where t.id!=c.id and t.id like c.id+'%'
    )
    select * from cte