數據庫可以這樣設定:
Id ProductName ParentId
1 根類 0
2 一級分類 1
3 一級分類 1
4 二級分類 2
5 二級分類 3
先用daset讀取數據庫表內容填充到DataView,通過DataView.RowFilter 過濾,找到適合的記錄。
通過遞歸,將數據綁定到TreeView 控件上。
重點是以下:
一、在哪裏設置遞歸?
二、判斷遞歸傳的參數的設置。
===================================================
以下是解決方法之一:轉載自:http://fhzheng.cuit.edu.cn/show.aspx?id=297
TreeView控件的使用方法- -
樹形圖用於顯示按照樹形結構進行組織的數據,其用途比較廣泛,如計算機中的文件系統(Windows中的資源管理器)、企業或公司的組成結構等。現在在ASP.NET中利用微軟提供的Internet Explorer WebControls它使得網頁上的樹形圖開發與在Windows下一樣的方便,一樣的功能強大,甚至更靈活。
1.下載地址
http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp 安裝後,通過“自定義工具箱”->“.net框架組件”把TreeView添加到工具箱裏
2.運行時無法顯示
一般是TreeView的版本問題,最好下載英文版自動安裝版本重新安裝,安裝前應該先到添加刪除程序裏卸掉原版本
3.顯示格式出錯(非樹狀顯示)
TreeView要求客戶端瀏覽器版本爲IE5.5及以上
4.框架裏使用TreeView
設置NavigateUrl、Target屬性,可更新另外的Frame
5.找不到TreeNode類
使用TreeView,需要添加namespace:using Microsoft.Web.UI.WebControls;
6.遍歷TreeView節點
下面是一個利用TreeView控件生成樹狀導航的示例。可以無限生成多級菜單。
樹型結構表Para_Item
Item_ID(節點ID) Item_Name(節點名) Parent_ID(父結點ID)
1 All 0
2 aaa 1
3 bbb 1
4 aaa_1 2
5 bbb_1 3
//頁面初始化
private void Page_Load(object sender, System.EventArgs e)
{
// 定義數據庫連接
SqlConnection sqlConection_Tree = new SqlConnection();
//初始化連接字符串
sqlConection_Tree.ConnectionString= Session["ConnString"].ToString();
//打開連接
sqlConection_Tree.Open();
//獲取Faq樹形目錄節點
SqlDataAdapter sqlDataAdapter_Tree = new SqlDataAdapter("select Item_id,Item_name,Parent_ID from Para_item",sqlConection_Tree);
DataSet DataSet_Tree=new DataSet();
sqlDataAdapter_Tree.Fill(DataSet_Tree);
this.ViewState["DataSet_Tree"]=DataSet_Tree;
//調用遞歸函數,完成樹形結構的生成
AddTree(0, (TreeNode)null);
}
//遞歸添加樹的節點 參數ParentID爲樹的最大父結點
public void AddTree(int ParentID,TreeNode pNode)
{
DataSet DataSet_Tree=(DataSet) this.ViewState["DataSet_Tree"];
DataView DataView_Tree = new DataView(DataSet_Tree.Tables[0]);
//過濾ParentID,得到當前的所有子節點 ParentID爲父節點ID
DataView_Tree.RowFilter = "[Parent_ID] = " + ParentID;
//循環遞歸
foreach(DataRowView Row in DataView_Tree)
{
//聲明節點
TreeNode Node=new TreeNode() ;
//綁定超級鏈接
Node.NavigateUrl = "List.aspx?Item_ID="+Row["Item_ID"].ToString();
//開始遞歸
if(pNode == null)
{
//添加根節點
Node.Text = Row["item_name"].ToString();
TreeView_Tree.Nodes.Add(Node);
Node.Expanded=true; //節點狀態展開
AddTree(Int32.Parse(Row["item_id"].ToString()), Node); //再次遞歸
}
else
{
//添加當前節點的子節點
Node.Text = Row["item_name"].ToString();
pNode.Nodes.Add(Node);
Node.Expanded = true; //節點狀態展開
AddTree(Int32.Parse(Row["item_id"].ToString()),Node); //再次遞歸
}
}
//關閉連接
sqlConection_Tree.Close();
}
生成的樹型如下:
All
|-aaa
|-aaa_1
|-bbb
|-bbb_1
7.控制父結點的開/合狀態
TreeView_Tree.GetNodeFromIndex("1").Expanded=false/true;
8.清除某個父結點下的所有子節點
TreeView_IndexLeft.GetNodeFromIndex("1").Nodes.Clear();
9.設置所選節點,如選中第二個節點
function SetSelNode()
{
TreeView_Tree.selectedNodeIndex="1";
}
10.得到所選節點的Text,ID或NodeData
function GetAttribute()
{
alert(TreeView_Tree.getTreeNode(TreeView_Tree.selectedNodeIndex).getAttribute("Text"));
}
//替換Text爲ID或NodeData,可分別得到所選節點的ID或NodeData
11.修改節點屬性,如修改第一個節點的Text
function ModifyNode()
{
var node=TreeView_Tree.getTreeNode("0");
node.setAttribute("Text","第一個節點");
}
12.添加節點
function AddNode()
{
var node=TreeView_Tree.createTreeNode();
node.setAttribute("Text","第一個節點");
TreeView_Tree.add(node);
}
13.TreeView 中的SelectedIndexChange不執行
AutoPostBack=true,SelectedIndexChange才能被執行。
14.判斷 TreeView 的一個節點下是否有子節點
if(SelectNode.Nodes.Count==0)
{
//該節點沒有字節點
}