地区在数据库中是用递归存储的,如下id  pid  name
1   0    中国
2   1    北京
3   1    上海
4   2    XXX区想用TreeView显示如下:-中国
 ----北京
 --------XXX区
 ----上海我已经在数据库用函数返回了如下的数据集,而且不用TreeView,可通过前面加空格形成一个‘假树’,但如果用TreeView怎么实现呢?id  pid  name  degree
1   0    中国   01
2   1    北京   0102
3   1    上海   0103
4   2    XXX区  0204我的想法是通过 degree 字段来得知该结点是哪个结点的子结点,如:北京 0102 可通01得知他的上级为中国,而XXX区的上级为北京。
怎么样写该算法?
我写了半天没写出来,特来求助!

解决方案 »

  1.   

    TreeNode tn;
    int i;
    TreeNode GetParent(TreeNode tnParent,int id)
    {
         if ((int)tnParent.Tag == id)
         {
              return tnParent;
         }
         int i;
         TreeNode tn;
         for (i = 0 ; i < tnParent.Nodes.Count; ++i)
         {
              tn = GetParent(tnParent.Nodes[i],id);
              if (null != tn)
             {
                  return tn;
              }
         }
         return null;
    }
    //分别将数据整理为多级后,逐级调用该方法。
    void AddData(TreeView tv,DataSet ds)
    {
       int i,j;
    TreeNode tn,tnChild;
       for (i = 0 ; i < ds.Tables[0].Rows.Count; ++i)
    {
        for (j = 0 ; j < tv.Nodes.Count; ++j)
      {
        tn = GetParent(tv.Nodes[j],ds.Table[0].Rows[i]["parentid"]);
        if (tn ! =null)
       {
           tnChild =  tn.Nodes.Add(ds.Tables[0].Rows[i]["name"].ToString());
           tnChild.Tag = tn.Nodes.Add(ds.Tables[0].Rows[i]["id"];
           continue;
       }   
      }
    }
    }
      

  2.   

    private void AddTree(int ParentID,TreeNode pNode) 
    {
    DataView dvTree = new DataView(ds.Tables[0]);
    dvTree.RowFilter =  "[ParentID] = " + ParentID;
    foreach(DataRowView Row in dvTree) 
    {
    if(pNode == null) 
    {   
    TreeNode Node = treeView1.Nodes.Add(Row["ProjectName"].ToString());
    AddTree(Int32.Parse(Row["ProjectID"].ToString()),Node);   

    else 
    {   
    TreeNode Node =  pNode.Nodes.Add(Row["ProjectName"].ToString());
    AddTree(Int32.Parse(Row["ProjectID"].ToString()),Node);   
    }
    }                   
    }
      

  3.   

    DataView myDataView = new DataView(myDataSet.Tables[0]);
    //过滤ParentID,得到当前的所有子节点
    myDataView.RowFilter =  "[Parent_NO] = " + Parent_NO;
    foreach(DataRowView Row in myDataView) 
    { if(pNode == null) 
    {    //添加根节点
    TreeNode Node = treeView1.Nodes.Add(Row["Unit_Name"].ToString().Trim());
    Node.Tag = Row["Unit_ID"].ToString().Trim();
    AddTree(Int32.Parse(Row["Unit_NO"].ToString()),Node);    //再次递归

    else 
    {   //添加当前节点的子节点
    TreeNode Node =  pNode.Nodes.Add(Row["Unit_Name"].ToString().Trim());
    Node.Tag = Row["Unit_ID"].ToString().Trim();
    AddTree(Int32.Parse(Row["Unit_NO"].ToString()),Node); //再次递归
    }
    }
      

  4.   

    id  name  parentid childid
    1   中国   0          1
    2   北京   1          2
    3   上海   1          3
    4   XXX区  2          null(没有下级)这种方式好管理!
    递归函数即可!无级别限制.public void BuildTree(string ParentID,TreeNode td)
    {
    TreeNode tempNode=null;
    string selectString=null;
    string tabString=null;
    string textString=null;
    string ChildIdString=null; selectString="PARENTID='"+ParentID+"'";
    DataRow[] dataRows=treeDataSet.Tables[0].Select(selectString);    foreach(DataRow dr in dataRows)
    {
    tempNode=new TreeNode();
    tabString=dr["BK_C_BM"].ToString();
    textString=dr["BK_C_MC"].ToString();
    ChildIdString=dr["CHILDID"].ToString();
    tempNode.Tag=tabString;
    tempNode.Text=textString;
    tempNode.ImageIndex=1;
    tempNode.SelectedImageIndex=2;
    td.Nodes.Add(tempNode);
    BuildTree(ChildIdString,tempNode); } 

    调用的时候传递"0"参数,把"中国"加进去,然后递归调用,用
    ChildIdString=dr["CHILDID"].ToString();取得当前记录的子记录,去递归.如中国的childid='1',找到上海和北京....以此类推...
      

  5.   

    cxa(安心) ( ) 
    你那种数据库存储方式,在数据库设计的角度来说不是一种好的方法。
    用递归表存储是最好的!(纯属讨论)
      

  6.   

    好像我的想法与大家的想法有点不致呀?id  pid  name  degree
    1   0    中国   01
    2   1    北京   0102
    3   1    上海   0103
    4   2    XXX区  0204其中degree字段是我通过自编的一个数据库函数计算出来的,用处就是前台程序能过过该字段的结构来动态地生成一颗树形结构。
    楼上各位都是直接编程生成树的,而我想通过degree来生成树该怎么做呀?
      

  7.   

    通过degree来生成树结构,不用递归.只要一次循环就可以了:
    int PreIDLength=0;
    TreeNode PreNode=new TreeNode();
    dataTable1.DefaultView.Sort="degree";
    treeView1.Nodes.Add(PreNode);
    for(int i=0;i<dataTable1.Rows.Count;i++)
    {
      TreeNode trnAdd=new TreeNode();
      trnAdd.Text=dataTable1.DefaultView[i]["name"].ToString().Trim();
      int IDLength=dataTable1.DefaultView[i]["degree"].ToString().Trim().Length;
      for(int j=0;j<=(PreIDLength-IDLength)/2;j++)
      {
        PreNode=PreNode.Parent;
      }
      PreNode.Nodes.Add(trnAdd);
      PreIDLength=dataTable1.DefaultView[i]["degree"].ToString().Trim().Length;
      PreNode=trnAdd;
    }