生成树一般来说有两种方法,一种是深度优先搜索,一种是广度优先搜索
深度搜索如下:用方法递归得到所有节点
private void FullTreeList(TreeNode ParentNode,int ParentKey)
{
int iDepID=0;
int iParentID=0;
foreach(DataRow dr in this.dtDep.Rows)
{
iDepID=int.Parse(dr["ID"].ToString ());
iParentID=int.Parse(dr["UpperID"].ToString());if(iParentID ==ParentKey)
{
TreeNode mNode=new TreeNode();
mNode.Text=dr["DepartmentName"].ToString() ;
mNode.Tag=iDepID;
mNode.Expand();
ParentNode.Nodes.Add(mNode);//find his children
FullTreeList(mNode,(int)mNode.Tag);
}
}
}

解决方案 »

  1.   

    TO RACHY:
    我还是没有懂你的意思,能不能详细一点啊,谢谢!!
      

  2.   

    你可以先把数据生成XML格式,这样就非常好加入了
      

  3.   

    TO RACHY:
    int ParentKey,这个参数是什么啊?
    TO YUHAN0001;
    能给个代码吗?
      

  4.   

    数据循环内嵌套树的遍历(递归)。思路是,把数据一条条nodes.add到树上的合适位置。
      

  5.   

    Imports System
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Web
    Imports System.Web.SessionState
    Imports System.Web.UI
    Imports System.Web.UI.HtmlControls
    Imports System.Web.UI.WebControls
    Imports System.Data.SqlClient
    Imports System.Configuration
    Imports Microsoft.Web.UI.WebControls Dim conn As New SqlConnection
        Dim mycmd As New SqlDataAdapter
        Dim ds As DataSet
        Dim cmdSelect As String    Protected WithEvents TVMenu As Microsoft.Web.UI.WebControls.TreeView  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            '在此处放置初始化页的用户代码
            conn = New SqlConnection(ConfigurationSettings.AppSettings("SQLConnString1"))
            'conn.ConnectionString = Application("SQLConnString1")
            CreateDataSet()
            InitTree(TVMenu.Nodes, "0")    End Sub  Private Function CreateDataSet() As DataSet
            cmdSelect = "select * from S_Menu"
            mycmd = New SqlDataAdapter(cmdSelect, conn)
            ds = New DataSet
            mycmd.Fill(ds, "s_menu")
            Return ds    End Function
        Private Sub InitTree(ByVal Nds As TreeNodeCollection, ByVal parentId As String)         Dim dv As New DataView
            Dim tmpNd As TreeNode
            Dim intId As String
            Dim drv As DataRowView
            dv.Table = ds.Tables("tree")
            dv.RowFilter = "ParentId='" + parentId + "'"
            For Each drv In dv            tmpNd = New TreeNode
                tmpNd.ID = drv("NodeId").ToString()
                tmpNd.Text = drv("NodeName").ToString()
                tmpNd.ImageUrl = "../images/" + drv("Icon").ToString()
                tmpNd.NavigateUrl = "../" + drv("Address").ToString()
                Nds.Add(tmpNd)
                intId = drv("ParentId").ToString()
                InitTree(tmpNd.Nodes, tmpNd.ID)
            Next
        End Sub
      

  6.   

    不知道为什么程序执行到For Each 语句的时候
    不执行下面的,直接跳到next,
    共同关注!!!!
      

  7.   

    // 递归添加树的节点
    public void AddTree(int ParentID,TreeNode pNode) 
    {
    DataView dvTree = new DataView(ds.Tables[0]);
    //过滤ParentID,得到当前的所有子节点
    string Fstr= "[PARENTID] = " + ParentID;//
    dvTree.RowFilter = Fstr;
    MessageBox.Show(Fstr);
    foreach(DataRowView Row in dvTree) 
    {
    if(pNode == null) 
    {    //'̀添加根节点
    TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
    AddTree(Int32.Parse(Row["ID"].ToString()),Node);    //再次递归

    else 
    {   //添加当前节点的子节点
    TreeNode Node =  pNode.Nodes.Add(Row["ConText"].ToString());
    AddTree(Int32.Parse(Row["ID"].ToString()),Node);     //再次递归
    }
    }                   
    }            我找到一些代码,这个代码不好理解?大家帮一下
      

  8.   

    private void InitTree(TreeNodeCollection Nds,string parentId)
    {
       DataView dv=new DataView();
       TreeNode tmpNd;
       string intId;
       dv.Table=ds.Tables["S_Menu"];
       dv.RowFilter="ParentId='" + parentId + "'" ;
       foreach(DataRowView drv in dv)
          {
             tmpNd=new TreeNode();
             tmpNd.ID=drv["NodeId"].ToString();
    tmpNd.Text=drv["NodeName"].ToString();
    tmpNd.ImageUrl="../images/"+drv["Icon"].ToString();
    tmpNd.NavigateUrl="../"+drv["Address"].ToString();
    Nds.Add(tmpNd);
    intId=drv["ParentId"].ToString();
    InitTree(tmpNd.Nodes,tmpNd.ID);
    }
    }
    我想问问大家,为什么我的程序执行到foreach的时候就跳出来阿
    快帮帮忙
      

  9.   

    我知道了,
    dv.RowFilter="ParentId='" + parentId + "'" ;
    这句多了两个单引号,
    楼主你的弄好了没阿
      

  10.   

    TO:douguangyao
    怎么用你的InitTree这个过程啊??对于递归有点不明白
      

  11.   

    dv.RowFilter="ParentId='" + parentId + "'" ;
    这句的过滤条件在执行时不能确定是那一层次的NODE,唉