資料庫樹形查詢
① ASP.NET中怎麼使用樹形控制項綁定從資料庫讀取的數據
創建資料庫 TreeViewgouse,使用 Treeview 創建表,分別定義 node1、node2 和 node3,用於存儲層級數據。插入相應的數據,構建樹形結構。
在 Visual Studio 中編寫代碼,實現資料庫查詢與樹形控制項綁定。
定義函數 PopulateCategories、PopulateProcts 和 PopulateProcts1,分別用於填充根節點、一級節點和二級節點。
在 PopulateCategories 函數中,執行查詢語句獲取 node1 表中的數據,生成 TreeNode 對象並添加至樹形控制項中。
在 PopulateProcts 和 PopulateProcts1 函數中,通過節點的 ID 執行查詢,獲取 node2 和 node3 表中的數據,同樣生成 TreeNode 對象並添加至對應層級的樹形控制項中。
定義 Getdataset 函數,用於執行 sql 查詢並返回 DataSet 對象,作為查詢結果。
在 TreeView1_TreeNodePopulate 事件處理程序中,根據節點的深度調用相應的填充函數,實現數據的動態載入。
在 TreeView1_SelectedNodeChanged 和 TreeView1_TreeNodeExpanded 事件處理程序中,可以添加自定義的響應邏輯,例如輸出被選中或展開的節點信息。
② 怎麼將資料庫中存的樹轉化為樹形列表
樹狀結構的數據保存在資料庫中的常用方法有一下兩種:
1、鄰接表(adjacency list model)
2、預排序遍歷樹演算法(modified preorder tree traversal algorithm)
用一下的例子討論這兩種方法的差異:
現有一棵樹如下:
鄰接表模式:
這種模式我們經常用到,很多的教程和書中也介紹過。我們通過給每個節點增加一個屬性 parent 來表示這個節點的父節點從而將整個樹狀結構通過平面的表描述出來。根據這個原則,例子中的數據可以轉化成如下的表:
我們看到 Pear 是Green的一個子節點,Green是Fruit的一個子節點。而根節點'Food'沒有父節點。 為了簡單地描述這個問題, 這個例子中只用了name來表示一個記錄。 在實際的資料庫中,你需要用數字的id來標示每個節點,資料庫的表結構大概應該像這樣:id, parent_id, name, description。
以下是代碼:
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
// used to display a nice indented tree
function display_children($parent, $level)
{
// 獲得一個 父節點 $parent 的所有子節點
$result = mysql_query('SELECT name FROM tree '.
'WHERE parent="'.$parent.'";');
// 顯示每個子節點
while ($row = mysql_fetch_array($result))
{
// 縮進顯示節點名稱
echo str_repeat(' ',$level).$row['name']."n";
//再次調用這個函數顯示子節點的子節點
display_children($row['name'], $level+1);
}
}
?>
對整個結構的根節點(Food)使用這個函數就可以列印出整個多級樹結構,由於Food是根節點它的父節點是空的,所以這樣調用: display_children('',0)。將顯示整個樹的內容:
Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
③ 資料庫中樹形圖的用法
資料庫中樹形圖的用法的用法你知道嗎?下面我就跟你們詳細介紹下資料庫中樹形圖的用法的用法,希望對你們有用。
資料庫中樹形圖的用法的用法如下:
樹形圖用於顯示按照樹形結構進行組織的數據,其用途比較廣泛,如計算機中的文件系統(Windows中的資源管理器)、企業或公司的組成結構等。我們知道在Windows下VB、PB、Delphi等工具提供了一個功能很強的樹型控制項TreeView,利用Treeview控制項可以方便地開發樹形圖。然而在網頁上實現樹形圖就不那麼容易了,現在在asp.net中利用微軟提供的Internet Explorer WebControls它使得網頁上的樹形圖開發與在Windows下一樣的方便,一樣的功能強大,甚至更靈活。
本文介紹用Internet Explorer WebControls開發樹形圖的方法,由於樹形圖結構較復雜,使用起來常不知如何下手。筆者結合最近剛為公司用ASP.NET編寫的應用程序管理器這一具體實例,詳細闡述在ASP.NET下如何將Internet Explorer WebControls的使用與資料庫聯系起來,實現數據分任意多層顯示,方便地進行增加、修改、刪除、移動操作。筆者希望通過對該實例的闡述,達到拋磚引玉的效果,與各位同仁相互交流,共同進步。
Internet Explorer WebControls不在VS.NET的標准Server Control中,要到微軟的站點上下載,下載地址是:
http://msdn.microsoft.com/downloads/samples/internet/default.asp?url=/Downloads/samples/Internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
下載安裝後第一次使用時,要右擊工具箱Customize Toolbox…→.NET Framework Components中找到Micosoft.Web.UI.WebControls.Treeview後選中,這樣Treeview控制項就出現在工具箱中了。
一、樹的建立
具體方法是:創建一個資料庫,設計樹圖信息表TREE_INFO,包含NODEID、PARENTID、NODENAME、ADDErss、ICON欄位,其它欄位根據實際業務而定,節點名稱NODENAME將在樹型控制項的節點上顯示,NODEID欄位保存節點的唯一標識號,PARENTID表示當前節點的父節點號,標識號組成了一個“鏈表”,記錄了樹上節點的結構。設計一個Web窗體其上放置TreeView控制項。
PRivate Sub CreateDataSet()’建立數據集
Dim myConn As New SqlConnection()
Dim myCmd As New SqlCommand("select NODEID,NODENAME,PARENTID,ADDRESS,ICON from Tree_info", myConn)
Dim myDataAdapter As New SqlDataAdapter()
myConn.ConnectionString = application("connectstring")
myCmd.CommandText = ""
myCmd.Connection = myConn
myDataAdapter.SelectCommand = myCmd
myDataAdapter.Fill(ds, "tree")
End Sub
建樹的基本思路是:從根節點開始遞歸調用顯示子樹
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CreateDataSet()
intiTree(TreeView1.Nodes, 0)
End Sub
Private Sub intiTree(ByRef Nds As TreeNodeCollection, ByVal parentId As Integer)
Dim dv As New DataView()
Dim drv As DataRowView
Dim tmpNd As TreeNode
Dim intId As Integer
dv.Table = ds.Tables("tree")
dv.RowFilter = "PARENTID=’" & parentId & "’"
For Each drv In dv
tmpNd = New TreeNode()
strId = drv("NODE_ID")
tmpNd.ID = strId
tmpNd.Text = drv("NODE_NAME ")
tmpNd.ImageUrl = drv("ICON").ToString
Nds.Add(tmpNd)
intiTree(Nds(Nds.Count - 1).Nodes, intId)
Next
End Sub
二、增加、刪除樹節點
單純在Treeview 上增加、刪除、修改節點只需用Nodes屬性的Add、 Remove、等方法即可,值得注意的地方是VS.NET中Treeview的Nodes集合與VS6.0中的區別,VS6.0中的是一個大的集合,而VS.NET中的是分層的每個Node下都有Nodes屬性。增加、刪除、修改樹節點時與VS6.0相比有很大差別,特別是刪除時。
Private Sub ButAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButAdd.Click’在選定的節點下添加子節點
Dim tmpNd As New TreeNode(), NdSel As TreeNode
tmpNd.ID = GetNewId()
NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)’選中的節點
tmpNd.Text = "新節點"
NdSel.Nodes.Add(tmpNd)
Dim myRow As DataRow
myRow = ds.Tables("tree").NewRow()
myRow("NODE_NAME") = tmpNd.ID
myRow("NODE_DESCRipT") = "新節點" & tmpNd.ID & "_" & NdSel.ID
myRow("PARENT_NAME") = NdSel.ID
ds.Tables("tree").Rows.Add(myRow)
End Sub
Private Sub ButDele_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButDele.Click’刪除選中的節點
Dim idx As String = TreeView1.SelectedNodeIndex()
GetNdCol(idx).Remove(TreeView1.GetNodeFromIndex(idx))
Dim dv As New DataView(), recNo As Integer
dv.Table = ds.Tables("tree")
dv.RowFilter= "NODEID=" & NdId
dv.Delete(0)
End Sub
Private Function GetNdCol(ByVal idx As String) As TreeNodeCollection
‘獲得選中節點的父節點的Nodes集合
Dim cnt As Integer, i As Integer
Dim tmpNds As TreeNodeCollection
Dim idxs() As String
idxs = Split(idx, ".")
cnt = UBound(idxs)
If cnt = 0 Then
tmpNds = TreeView1.Nodes
Else
tmpNds = TreeView1.Nodes(CInt(idxs(0))).Nodes
For i = 1 To cnt - 1
tmpNds = tmpNds(CInt(idxs(i))).Nodes
Next
End If
Return tmpNds
End Function
三、修改、移動樹節點
由於伺服器控制項不支持滑鼠拖動事件,所以不能象Windows程序那樣通過拖動移動節點,這里是通過選擇父節點的方式。移動是通過在原位置刪除,新位置添加實現的,要注意在刪除時先保存節點信息。
Private Sub TreeView1_SelectedIndexChange(ByVal sender As Object, ByVal e As Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs) Handles TreeView1.SelectedIndexChange
Dim dv As New DataView()
dv.Table = ds.Tables("tree")
Dim tmpNd As TreeNode = TreeNdSel(e.OldNode), tmpNds As TreeNodeCollection
dv.RowFilter= "NODEID=" & tmpNd.ID
dv(0)("NODE_DESCRIPT") = Me.TextBox1.Text
dv(0)("ADDRESS") = Me.TextBox2.Text
dv(0)("TARGET") = Me.TextBox3.Text
dv(0)("ICON") = Me.TextBox4.Text
If dv(0)("PARENTID").ToString <> Me.DropDownList1.SelectedItem.Value Then
‘移動節點
dv(0)("PARENT_NAME") = Me.DropDownList1.SelectedItem.Value
If Me.DropDownList1.SelectedItem.Value = "ROOT" Then
tmpNds = TreeView1.Nodes
Else
tmpNds = FromIdToNode(Me.DropDownList1.SelectedItem.Value, TreeView1.Nodes).Nodes’新的父節點的Nodes集合
End If
GetNdCol(e.OldNode).Remove(tmpNd)
tmpNds.Add(tmpNd)
End If
tmpNd.Text = Me.TextBox1.Text
tmpNd.ImageUrl = Me.TextBox4.Text
tmpNd = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)
dv.RowFilter= "NODEID=" & tmpNd.ID
Me.TextBox1.Text = dv(0)("NODENAME").ToString
Me.TextBox2.Text = dv(0)("ADDRESS").ToString
Me.TextBox3.Text = dv(0)("TARGET").ToString
Me.TextBox4.Text = dv(0)("ICON").ToString
End Sub
Private Function FromIdToNode(ByVal ID As String, ByVal Nds As TreeNodeCollection) As TreeNode
‘由關鍵字查找節點
Dim i As Integer
Dim tmpNd As TreeNode, tmpNd1 As TreeNode
For Each tmpNd In Nds
If tmpNd.ID = ID Then
Return tmpNd
Exit Function
End If
tmpNd1 = FromIdToNode(ID, tmpNd.Nodes)
If Not (tmpNd1 Is Nothing) Then
Return tmpNd1
Exit Function
End If
Next
Return Nothing
End Function