生成树一般来说有两种方法,一种是深度优先搜索,一种是广度优先搜索
深度搜索如下:用方法递归得到所有节点
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);
}
}
}
深度搜索如下:用方法递归得到所有节点
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);
}
}
}
我还是没有懂你的意思,能不能详细一点啊,谢谢!!
int ParentKey,这个参数是什么啊?
TO YUHAN0001;
能给个代码吗?
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
不执行下面的,直接跳到next,
共同关注!!!!
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); //再次递归
}
}
} 我找到一些代码,这个代码不好理解?大家帮一下
{
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的时候就跳出来阿
快帮帮忙
dv.RowFilter="ParentId='" + parentId + "'" ;
这句多了两个单引号,
楼主你的弄好了没阿
怎么用你的InitTree这个过程啊??对于递归有点不明白
这句的过滤条件在执行时不能确定是那一层次的NODE,唉