一棵纠结的树

justinsolo 2013-01-23 08:31:16
现有数据库数据如下:
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的子节点。以此类推。请教如何从数据库中取数写这棵树?
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
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
gxingmin 2013-01-24
  • 打赏
  • 举报
回复
修正一下

  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);
                }
            }
        }
gxingmin 2013-01-24
  • 打赏
  • 举报
回复
用递归能搞定


  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);
                }
            }
        }
threenewbee 2013-01-24
  • 打赏
  • 举报
回复
00111到底是001的11号子节点还是0011的1号子节点。 id parentid data 3个字段就能搞定又简单又可靠的设计不用,非要发明一个奇怪的数据结构,简直莫名其妙!
ChargeForward 2013-01-24
  • 打赏
  • 举报
回复
写个字符串分析算法, 木有难度
qq402305413 2013-01-24
  • 打赏
  • 举报
回复
改铝盖ID,这样就不用纠结了。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧