無限分級的一個思路

數據庫可以這樣設定:

 

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)

  //該節點沒有字節點 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章