无需使用递归,使用简单的算法即可解决.
使用一个hash表,记录tree节点即可.
选创建每个节点,
再进行遍例节点,在hash表中查找父节点.父子关系处理完后,把首节点加到treeview上即可.
效率会比递归高.

解决方案 »

  1.   

    建树:
    public void InitTree(TreeNodeCollection  Nds,string parentId,DataTable dt)
    {    
    dv=new DataView();
    TreeNode  tmpNd;
    string intId;
    dv.Table=dt;
    dv.RowFilter="ParentId="  + parentId ;
    foreach(DataRowView drv in dv)
    {   
                    tmpNd=new TreeNode();
    tmpNd.Tag =drv[0].ToString(); 
                      tmpNd.Text=drv[2].ToString(); 
    Nds.Add(tmpNd);
    intId=drv[1].ToString();      
                    InitTree(tmpNd.Nodes,tmpNd.Tag.ToString(),ds,TableName);
    }
    }
    遍历树:
    public void GetAllNodeText(TreeNodeCollection tnc,string txt)
    {  
    foreach (TreeNode node in tnc)
    {
    if( node.Nodes.Count != 0 )
    GetAllNodeText(node.Nodes,txt);
    }
    }
    调用:
       myTree.InitTree(TreeView1.Nodes,"0",dataTable);注意这个:dv.RowFilter="ParentId="  + parentId ;ParentId就是父节点的ID,这里是字段名,最后要和你的对应上。
    我的表结构:
    id    ParentID   name
      

  2.   

    我有一个例子,不过我的例子中有一个总的root,然后实现递归调用。可以吗?
    private void CreateTreeNode(TreeNodeCollection newNodes,int parentID,DataSet ds)
    {
    try
    {
    DataView dv=new DataView();
    dv.Table =ds.Tables["OrgInfo"];
    dv.RowFilter="UpOrgID="+parentID.ToString();
    foreach(DataRowView drv in dv)//循环遍历子组织,合并到记录中
    {
    TreeNode tmpNd=new TreeNode();
    int id=Convert.ToInt32(drv["OrgID"]);
    tmpNd.ID=id.ToString();
    tmpNd.Text=drv["OrgName"].ToString();

    newNodes.Add(tmpNd);
    CreateTreeNode(newNodes[newNodes.Count-1].Nodes,id,ds);//递归调用创建子组织
    }
    }
    catch{}
    }我没有用部门级别字段,OrgID为组织ID,UpOrgID为父组织ID调用时CreateTreeNode(Treeview1.Nodes,UpOrgID,dsOrg);
      

  3.   

    public void CreateNodesOfParent(string iParent,TreeNode pNode) 
    {


    DataView dvwData = new DataView(this.dt.Tables[0]);
    if (iParent == null)
    {
    dvwData.RowFilter =  "[ParentID] is null";
    }
    else
    {
    dvwData.RowFilter =  "[ParentID] = " +"'"+ iParent+"'";
    }


    foreach(DataRowView Row in dvwData) 
    {
    // Call Stack !
    if(pNode == null) 
    {
    TreeNode zNode = this.treeView1.Nodes.Add(Row["DeptName"].ToString());
    zNode.Tag = Row["DeptID"].ToString();
    CreateNodesOfParent((Row["DeptID"].ToString()),zNode);

    else 
    {
    TreeNode zNode =  pNode.Nodes.Add(Row["DeptName"].ToString());
    zNode.Tag = Row["DeptID"].ToString();
    CreateNodesOfParent((Row["DeptID"].ToString()),zNode);
    }

    }
    }
    public void IniTree()
    {
    this.treeView1.BeginUpdate();
    CreateNodesOfParent(null,0);
    this.treeView1.ExpandAll();
    this.treeView1.EndUpdate();
    }