最近在写一个treeview,参考了网上很多种写法,终于总结出自己treeview的写法了!!分享给大家。
假设数据库表:
Table-------
id name fatherid
1 a 0
2 b 1
3 c 1
4 d 2
5 e 3
.
.
.
asp页面添加的treeview名称为TreeVieww1,绑定数据库后得到的DataTable名称为dt,需要在treeview中绑定的节点Text为"name",Node为"id",
父节点id为"fatherid",
那么在asp页面可以这样写
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//获取填充树所需要的DataTable
DataTable dt = dtAdapter.GetClass();
//填充树
newtree.AddTree(dt,TreeView1,"name","id","005000000000", (TreeNode)null);
}
}
其中"005000000000"是我指派给根节点的id(我设置id/fatherid为string类型的),"(TreeNode)null"为设置初始节点的TreeNode为空。下面的方法,
可以放在工程的任何位置,达到重用的目的。
//递归添加树的节点
public void AddTree(DataTable dt, TreeView tv, string NodeText, string NewNode, string FatherID, TreeNode pNode)
{
DataView dvTree = new DataView(dt);
//过滤FatherID,得到当前的所有子节点
dvTree.RowFilter = "fatherid=" + FatherID;
foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{ //添加根节点
Node.Text = Row[NodeText].ToString();
tv.Nodes.Add(Node);
Node.Expanded = true;
AddTree(dt, tv, NodeText, NewNode, Row[NewNode].ToString(), Node); //再次递归
}
else
{ //添加当前节点的子节点
Node.Text = Row[NodeText].ToString().ToString();
pNode.ChildNodes.Add(Node);
Node.Expanded = true;
AddTree(dt, tv, NodeText, NewNode, Row[NewNode].ToString(), Node); //再次递归
}
}
}
************************************************************************************
//获取当前节点路径 text>>输入需要获取的节点名称,此函数返回该节点路径
static string valuePath = null;
public string SearchNode(TreeNodeCollection tnds, string text)
{
foreach (TreeNode tnd in tnds)
{
if (tnd.Text == text)
{
if (valuePath == null)
valuePath= tnd.ValuePath.ToString();
}
else
{
if (tnd.ChildNodes.Count != 0)
{
SearchNode(tnd.ChildNodes, text);
}
}
}
return valuePath;
}
***********************************************************************************
//获取当前节点的子节点 mynode>>当前节点;nodepath>>当前节点的路径
public void printtree(TreeNode mynode,string NodePath)
{
if(NodePath!=mynode.ValuePath)
Response.Write(mynode.Value.ToString() + " ");
NodePath = null;//将路径值归0,不显示当前节点,如果获取的节点要包括当前节点,将样式的两行去掉
if (mynode.ChildNodes.Count != 0)
{
foreach (TreeNode tempnode in mynode.ChildNodes)
{
printtree(tempnode, NodePath);
}
}
}