上网查了许多展示treeview的例子,但数据库记录结构基本都是一样的:
ID,Value,PID
这种结构实现起来是很简单。
但小弟今天要给用友U870做一个外挂,却发现它的数据库记录结构跟上面是不一样的,请看下面数据库的一部分:
ID, Name, Grade, End
00 电子类 1 0
0001 电阻 2 0
000101 贴片电阻 3 1
000102 薄膜电阻 3 0
00010201 薄膜电阻(ROHS物料) 4 1
00010202 薄膜电阻(非ROHS物料) 4 1
000103 敏感电阻 3 1
000104 排阻系列 3 0
00010401 排阻(ROHS物料) 4 1
00010402 排阻(非ROHS物料) 4 1
000105 其它电阻 3 1
0002 电位器 2 0
000201 可调/旋转电位器(ROHS物料) 3 1
……
其中Grade表示层,End表示“是否叶结点”,各记录在树中的位置按从上到下顺序排列。如上表对应的树应该是:   |(00)电子类
   |
   |——(0001)电阻
   |      |
   |      |——(000101)贴片电阻
   |      |
   |      |——(000102)薄膜电阻
   |      |        |——(00010201)薄膜电阻(ROHS物料)
   |      |        |——(00010202)薄膜电阻(非ROHS物料)
   |      |
   |      |——(000103)敏感电阻
   |      |
   |      |——(000104)排阻系列
   |      |        |——(00010401)排阻(ROHS物料)
   |      |        |——(00010402)排阻(非ROHS物料)
   |      |
   |      |——(000105)其它电阻
   |       
   |——(0002)电位器
   |      |——(000201)可调/旋转电位器(ROHS物料)……虽然知道规则,但还是想不出一个好的算法,让这些数据填入treeview中,请高手指点。

解决方案 »

  1.   

    呵呵,自己解决了。原来那个End字段可以不用的!protected TreeNode getU870tree(int gradecount)//gradecount为最大的层数
        {
            string sqlstr = "select ID, Name,Grade,  /*End*/  from CTable  order by ID asc";
            System.Data.DataSet dst = new DataSet();
            dst = GetDataset(sqlstr);//根据提供的sql查询语句取得DataSet数据
            string strid, strname;
            int grade;
            TreeNode[] tn = new TreeNode[gradecount];
            for (int i = 1; i < gradecount; i++) { tn[i] = new TreeNode(); }
            tn[0] = new TreeNode("分类", "-1");
            for (int i = 0; i < dst.Tables[0].Rows.Count; i++)
            {
                strname = dst.Tables[0].Rows[i]["name"].ToString();
                strid= dst.Tables[0].Rows[i]["id"].ToString();
                grade = int.Parse (dst.Tables[0].Rows[i]["grade"].ToString());
                if (grade > 0)
                {
                    tn[grade] = new TreeNode(strname, strid);
                    tn[grade - 1].ChildNodes.Add(tn[grade]);
                    //层次“低”的子树加入到层次“高”的子树
                }
              }
            return  tn[0];
        }