这是我在网上摘抄的一个递归添加的方法。
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); //再次递归
}
}
}看了这个方法后启发很大,一下是我对这个方法的改写。protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt;
object[] str = dt.Rows[0].ItemArray;
TreeMenu.BindTree(TreeView1.Nodes[0], dt, str[dt.Columns["id"].Ordinal].ToString());
}
}我觉得这样调用更具用通用性。fatherid 不用自己写死。public static void BindTree(TreeNodeCollection Nds, DataTable dt, string id)
{DataView dv = new DataView(dt);
dv.RowFilter = "fatherid = '" + id.ToString() + "'";
TreeNode node;
foreach (DataRowView drv in dv)
{
node = new TreeNode();
node.Value= drv["id"].ToString();
node.Text = drv["name"].ToString();
Nds.Add(node);
BindTree(node.ChildNodes, dt, drv["id"].ToString());
}
}递归循环添加更为简洁,而且如意明白。反正我是明白了,不知大家明白不。