我的数据库是这样设计的:
parent_id(字符型) this_id(字符型) this_name this_url
0 1 根节点1
0 2 根节点2
0 3 根节点3
1 11 父节点1
2 21 父节点2
11 子节点1 list.aspx
21 自节点2 list.aspx
首先我们在cs文件的Page_Load中把数据库中的数据全部读到一个DataTable里面,以避免每次都要连接数据库而耗费资源。
首先声明一个类成员变量:
public class WebForm1 : System.Web.UI.Page
{
protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
private DataTable dt;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
string connString = "provider=Microsoft.Jet.OleDb.4.0;Data Source=c:/inetpub/wwwroot/sjbang/sjbang.mdb";
string selCmd = "select * from mytree";
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter(selCmd,conn);
dt = new DataTable();
adapter.Fill(dt);
ShowAllNodes("0",TreeView1.Nodes);//调用函数显示节点
dt.Dispose();//显示了全部节点后销毁dt以减少资源占用。
}
}
private void ShowAllNodes(string ddd,TreeNodeCollection nodes)
{
//下面这句必须写,否则会陷入死循环
DataRow[] rowClass = dt.Select(string.Format("parent_id = '{0}'",ddd));
if(rowClass.Length>0)
{
foreach(DataRow dr in rowClass)
{
TreeNode newNode = new TreeNode();
newNode.Text = dr["this_name"].ToString().Trim();
string strUrl = dr["this_url"].ToString().Trim();
string newId = dr["this_id"].ToString().Trim();
if(strUrl!="" && null!=strUrl)
{
newNode.NavigateUrl = strUrl + "?type=" + Server.UrlEncode(dr["this_name"].ToString().Trim()) + "&brand=" + Server.UrlEncode(dr["this_brand"].ToString().Trim());
newNode.Target="right";
}
nodes.Add(newNode);
//循环递归调用
ShowAllNodes(newId,newNode.Nodes);
}
}
}