int i;
        DataSet ds = new DataSet();
       public static bool bl1 = true;
        private void button8_Click_2(object sender, EventArgs e)
        {
         
            for (i = 0; i < treeView1.SelectedNode.Nodes.Count; i++)
            {
                bl1 = false;
                ds = sql1.dataset(@"SELECT PRODUCT.PRO_CAT,PRODUCT.PRO_NAME,PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO FROM PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID=''", "Print" + i.ToString());
                string[] s;
                s = treeView1.SelectedNode.Nodes[i].Text.Split(' ');
                dr = sql1.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + s[0] + "' and BOM_MOT_AMO='" + s[s.Length - 2] + "'");
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
                        DataRow1.BeginEdit();
                        DataRow1[0] = dr[0].ToString().Trim();
                        DataRow1[1] = dr[1].ToString().Trim();
                        DataRow1[2] = dr[2].ToString().Trim();
                        DataRow1[3] = dr[3].ToString().Trim();
                        DataRow1[4] = dr[4].ToString().Trim();
                        DataRow1.EndEdit();
                        ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
                        recursion_table(ds, dr[0].ToString().Trim(), dr[4].ToString().Trim());
                        //TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
                        //recursion(tn1, tn1.Text.Trim());
                        //Node.Nodes.Add(tn1);
                    }
                }
                dr.Close();
                sql1.connClose();            }            sql2.connClose();
            //dataGrid1.DataSource = ds.Tables["Print1"];            Print f3 = new Print();
            CrystalReport1 CR = new CrystalReport1();
            CR.SetDataSource(ds);
            f3.crystalReportViewer1.ReportSource = CR;
            f3.Show();
        }
        private void recursion_table(DataSet ds, string id, string number)
        {
     
            dr1 = sql2.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + id + "' and BOM_MOT_AMO='" + number + "'");
     
            if (dr1.HasRows)
            {
                int i = 0;
                while (dr1.Read())
                {
                   
                        DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
                        DataRow1.BeginEdit();
                        DataRow1[0] = dr1[0].ToString().Trim();
                        DataRow1[1] = dr1[1].ToString().Trim();
                        DataRow1[2] = dr1[2].ToString().Trim();
                        DataRow1[3] = dr1[3].ToString().Trim();
                        DataRow1[4] = dr1[4].ToString().Trim();                        DataRow1.EndEdit();
                        ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
                        recursion_table(ds, dr1[0].ToString().Trim(), dr1[4].ToString().Trim());
                  
                        //TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
                        //recursion(tn1, tn1.Text.Trim());
                        //Node.Nodes.Add(tn1);
                  
                }
            }
        }sql2是自己写的一个数据库连接类    public SqlDataReader recursion_SqlDataReader(string sqlstr)
      {
          try
          {
              conn = new SqlConnection(connectionString);
              conn.Open();              comm = new SqlCommand(sqlstr, conn);
              mydr = comm.ExecuteReader();              return mydr;
          }
          catch (System.Data.SqlClient.SqlException E)
          {
              conn.Close();
              throw new Exception(E.Message);
          }
      }
数据表结构!如下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BOM]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[BOM]
GOCREATE TABLE [dbo].[BOM] (
[BOM_MOT_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_MOT_AMO] [float] NOT NULL ,
[BOM_CHI_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_CHI_AMO] [float] NOT NULL 
) ON [PRIMARY]
GO有一组数据 如下(树结构)
-G
 -A
  -A1
   -A1A
   -A1B
   -A1C
  -A2
   -A2A
   -A2B
   -A2C
  -A3得到表的结构是
-G
 -A
  -A1
   -A1A
  -A2
   -A2A
  -A3因为递归到A1A的时候ID变成了A1A 而不是A1 所以他的子A1B和A1C找不到父A1就显示不出来
这里要怎么在递归的时候保持A1的值先好,想不出好的办法!高手救救啊!

解决方案 »

  1.   

    偶不知道递归和推方法具体是什么,其实你这问题也不是很复杂,你可以一级一级的加节点,那样就没那么多问题了。
    G
    |--A
    |  |-A1
       |  |-A1A
       |  |-A1B
       |  |-A1C
       |
       |-A2
       |  |-A2A
       |  |-A2B
    ......
    ....
    先查A,查到了A1,A2,循环加入A的子节点(while(SQLDataReader.read()))
    再遍历A的子节点(foreach(Node node in Tree.Nodes[0].Nodes),每个子节点都查一次,查到了就循环加入A的子节点的子节点(while(SQLDataReader.read())),就这样。
      

  2.   

    给你写个垃圾方法,只适合有限节点public void GetNode(TreeView tree)
    {
      SqlConnection cnn=...;//数据连接略
      SqlCommand Cmd=Cnn.CreateCommand();
      Cmd.CommandText="Select T from Table Group by T";//group避免有重复项
      SqlDataReader myread=Cmd.Ex..Reader();//忘记中间几个字母了,呵呵
      while(myread.read())//如果读取到记录
      {
        tree.Nodes.add(myread["T"].tostring());//加入节点
      }
      foreach(Node node1 in tree.Nodes)
      {
        SqlCommand Cmd1=Cnn.CreateCommand();
        Cmd.CommandText="Select T from Table where T='"+node1.Text+"' Group by T";//group避免有重复项
         SqlDataReader myread1=Cmd1.Ex..Reader();//忘记中间几个字母了,呵呵
         while(myread1.read())//如果读取到记录
         {
           node1.Nodes.add(myread["T"].tostring());//加入节点
         }
        cmd1.dispose();
        myread1.dispose();
      }
     .....// 释放资源代码略
    }
      

  3.   

    不用DataTable已经很多年了
    帮你顶到高手出现
      

  4.   

    用whit语句吧 树型递归轻松搞定 
    在程序里写太没效率了
      

  5.   

            private void recursion_table(DataSet ds, string id, string number)
            {
                   ......
                   int i = 0;
                   ......
                            ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
            } 
    这里不明白,怎么递归了i又从0开始了,ds.Tables["Print0"].Rows.Add(DataRow1)又添加记录,怎么区分?
      

  6.   

     private void initSubTree(TreeNode item) 
        { 
             //查找以该节点为父节点的项  
               drRow = datatable.select("ParentId='"+parentId+ "'") 
            foreach (DataRow row in drRow) 
            { 
                TreeNode subItem = new TreeNode (键,值) 
                item.ChildItems.Add(subItem); 
                initSubTree(subItem); 
            } 
        }