先來看看效果,基本上就是這樣的。

所謂樹,無非就是2點,第一個:根節點,第二:葉子節點,其中葉子節點中還可能有葉子節點,但是根節點始終只有一個。
下面貼上 各部分的代碼
1.PAGE_LOAD載入事件。
protected void Page_Load(object sender, EventArgs e)
{
BindTree(); //綁定樹
}
2.BindTree方法。
private void BindTree()
{
DataSet ds = new DataSet(); //這里的DS里不存在數據,具體情況請大家自己具體考慮,修改代碼
TreeView1.Nodes.Clear();
AddTree("-1", (TreeNode)null,ds);
TreeView1.Nodes[0].Expanded = true;
}
3.AddTree方法,遞歸添加樹。
/*其中ds對應的是一個實體類Model,里面的IndexName,IndexID等,都是對應着數據庫里的相應字段所以我們在使用這個方法時前,必須先得到相對應的有具體意義的DataSet*/
/// <summary>
/// 遞歸樹
/// </summary>
/// <param name="ParentID">當前節點父節點ID</param>
/// <param name="pNode"></param>
/// <param name="ds"></param>
private void AddTree(string ParentID, TreeNode pNode,DataSet ds)
{
DataView dvTree = new DataView(ds.Tables[0]); //用DataView來模擬DataTable,因為DV是虛擬的表,所以可以提高效率
foreach (DataRowView Row in dvTree)
{
TreeNode node = new TreeNode();
if (pNode == null)
{ //添加根節點
node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString();
if (Row["IndexClass"].ToString() == "0")
{
node.NavigateUrl = "IndexInfo1.aspx?IndexID=" + node.Value;
}
else
{
node.NavigateUrl = "IndexInfo2.aspx?IndexID=" + node.Value;
}
node.Target = "mainFrame";
node.Expanded = false;
TreeView1.Nodes.Add(node); //添加根節點
AddTree(Row["IndexID"].ToString(), node,ds); //遞歸,添加子節點,這段遞歸是必須的,不然只會添加根節點,而進不到下面的else語句,pNode在TreeView第二次執行以后都是不為空的,所以會一直跳到執行ELSE語句里的內容。
}
else
{ //添加當前節點的子節點
node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString();
node.ToolTip = node.Text;
if (Row["IndexClass"].ToString() == "0" || Row["IndexParentID"].ToString() == "-1")
{
node.NavigateUrl = "IndexInfo1.aspx?IndexID=" + node.Value;
}
else
{
node.NavigateUrl = "IndexInfo2.aspx?IndexID=" + node.Value;
}
node.Target = "Frame1"; //某一個節點指向的一個IFRAME,里面可以是這個節點下的具體內容。
//node.NavigateUrl = Request.Url.LocalPath + "?OrgID=" + Row["OrgID"].ToString();
node.Expanded = false;
pNode.ChildNodes.Add(node); //pNode為父節點,把Node作為子節點添加進去
AddTree(Row["IndexID"].ToString(), node,ds); //遞歸添加子節點
}
}
}
