数据库格式是这样:
id    name    father_id
1     aaa         0
2     bbb         0
3     ccc         1
4     ddd         3
5     eee         2
想生成这种树结构:
aaa
  ccc
    ddd
bbb
  eee
想用一个递归调用的方法完成

解决方案 »

  1.   

    简单,根据father_id的值,显示的时候前面空几格就可以了。
      

  2.   

    参考一下吧:
    http://community.csdn.net/Expert/topic/2863/2863032.xml?temp=.3794519
      

  3.   

    while(reader.Read())
    {
    nodeid   = reader.GetInt32(0);
    parentid = reader.GetValue(2).ToString();
    Nodetxt  = reader.GetString(1);
    NodeUrl  = reader.GetValue(3).ToString();

    countid = TreeView1.Nodes.Count;

    for(i=0;i<countid;i++)
    {

    ParentNode = tree.getParentNode(parentid,TreeView1.Nodes[i]);
    if(ParentNode!=null)
    {

    returnbool = tree.AddNode(Nodetxt,nodeid,NodeUrl,ParentNode,false,"main",false,false);

    break;
    }
    else
    {
    //Response.Write(Nodetxt+"<br>");
    }


    }

    } //找到父节点
    public TreeNode getParentNode(string parentID,TreeNode node)
    {
    //Response.Write(node.Text+"->"+parentID + "==" + node.Type + "<br>"); if(node.Type.ToString()==parentID)
    {
    return node;
    }
    int i,j;
    int len = node.Nodes.Count;
    int len1;
    //bool tempbool;
    for(i=0;i<len;i++)
    {

    if(node.Nodes[i].Type==parentID.ToString())
    {

    //Response.Write("循环中:"+node.Nodes[i].Text+"||"+node.Nodes[i].Type+"<br>");
    return node.Nodes[i];

    }
    else
    {
    len1 = node.Nodes[i].Nodes.Count;
    if(len1>0)
    {
    //tempbool = getParentNode(parentID,node.Nodes[i]);
    if(getParentNode(parentID,node.Nodes[i])!=null)
    {
    return getParentNode(parentID,node.Nodes[i]);
    } }

    } } return null;
    } //添加子节点
    public bool AddNode(string NodeName,int NodeID,string NodeURL,TreeNode parentNode,bool checkboxstyle,string targetid,bool ischecked,bool nodeExpand)
    {
    try
    {
    //Response.Write(parentNode.Type+"<br>");
    TreeNode ChildNode = new TreeNode();
    ChildNode.ExpandedImageUrl = "icon/Open.ico";
    ChildNode.ImageUrl = "icon/close.ico";
    ChildNode.SelectedImageUrl = "icon/Subscription.ico";
    ChildNode.CheckBox = checkboxstyle;
    ChildNode.Text = NodeName;
    ChildNode.NavigateUrl = NodeURL;
    ChildNode.Checked = ischecked;
    ChildNode.Expanded = nodeExpand;
    if(targetid!=null)
    {
    ChildNode.Target = targetid;
    }
    ChildNode.Type = NodeID.ToString();
    parentNode.Nodes.Add(ChildNode);
    return true;
    }
    catch(Exception ex)
    {
    //Response.Write(ex.Message.ToString());
    return false;
    }
    }
      

  4.   

    你要的:
    http://www.microsoft.com/china/community/Column/30.mspx
      

  5.   

    foreach(DataRowView Row in dvTree) 
    {
    TreeNode Node=new TreeNode() ;
    if(pNode == null) 
    {    //添加根节点
    Node.Text = Row["ConText"].ToString();
    TreeView1.Nodes.Add(Node);
    Node.Expanded=true;
    AddTree(Int32.Parse(Row["ID"].ToString()), Node);    //再次递归

    else 
    {   //&#768;添加当前节点的子节点
    Node.Text = Row["ConText"].ToString();
    pNode.Nodes.Add(Node);
    Node.Expanded = true;
    AddTree(Int32.Parse(Row["ID"].ToString()),Node);     //再次递归
    }
    }
      

  6.   

    /// <summary>
    /// 重载1:绑定树控件并显示——>节点有连接,连接传递一个参数,传递的参数是location
    /// </summary>
    /// <param name="f_key">数据库表关键字key值名</param>
    /// <param name="f_parentkey">数据库表保存父节点id值字段名</param>
    /// <param name="f_text">节点显示文字树数据库表字段名</param>
    /// <param name="str_Sql">Select-SQL语句</param>
    /// <param name="Frame">单击树节点时连接的目标框架</param>
    /// <param name="Url">单击时连接网页名</param>
    /// <param name="TreeView1">TreeView控件id值</param>
    public void  BindTreeView(string f_key,string f_parentkey,string f_text,string str_Sql,TreeView TreeView1)
    {
    GetTable(str_Sql); // 获得树的内存表
    TreeView1.Nodes.Clear(); // 清空树
    TreeNode rootnode=new TreeNode();
    rootnode.CheckBox = true;
    rootnode.Text=dt.Rows[0][f_text].ToString(); // 给节点绑定显示值
    rootnode.NodeData=dt.Rows[0][f_key].ToString(); // 给节点绑定key值
    rootnode.Expanded=true; // 默认根结点为展开
    TreeView1.Nodes.Add(rootnode);
    string parentid=dt.Rows[0][f_key].ToString(); // 他子节点的parentid字段值
    CreateNode(f_key,f_parentkey,f_text,parentid,rootnode);// 加入所有根结点以下的结点 
    } /// <summary>
    /// 重载1:绑定树控件并显示——>节点有连接,连接传递一个参数,传递的参数是location
    /// </summary>
    /// <param name="f_key">数据库表关键字key值名</param>
    /// <param name="f_parentkey">数据库表保存父节点id值字段名</param>
    /// <param name="f_text">节点显示文字树数据库表字段名</param>
    /// <param name="str_Sql">Select-SQL语句</param>
    /// <param name="Frame">单击树节点时连接的目标框架</param>
    /// <param name="Url">单击时连接网页名</param>
    /// <param name="TreeView1">TreeView控件id值</param>

    public void CreateNode(string f_key,string f_parentkey,string f_text,string parentid,TreeNode parentnode)
    {
    DataRow [] drs = dt.Select(f_parentkey +"= '" + parentid + "'");// 选出所有子节点
    //遍历所有子节点
    foreach( DataRow r in drs )
    {
    TreeNode tempnode = new TreeNode();
    tempnode.CheckBox = true;
    tempnode.Text = r[f_text].ToString();
    tempnode.NodeData = r[f_key].ToString();
    parentnode.Nodes.Add(tempnode);
    tempnode.Expanded=false;
    parentid=r[f_key].ToString();
    CreateNode(f_key,f_parentkey,f_text,parentid,tempnode);
    }
    }