自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解ASP.NET樹(shù)形圖

開(kāi)發(fā) 后端
本文介紹用Internet Explorer WebControls開(kāi)發(fā)ASP.NET樹(shù)形圖的方法,由于樹(shù)形圖結(jié)構(gòu)較復(fù)雜,使用起來(lái)常不知如何下手。

ASP.NET樹(shù)形圖用于顯示按照樹(shù)形結(jié)構(gòu)進(jìn)行組織的數(shù)據(jù),其用途比較廣泛,如計(jì)算機(jī)中的文件系統(tǒng)(Windows中的資源管理器)、企業(yè)或公司的組成結(jié)構(gòu)等。我們知道在Windows下VB、PB、Delphi等工具提供了一個(gè)功能很強(qiáng)的樹(shù)型控件TreeView,利用Treeview控件可以方便地開(kāi)發(fā)樹(shù)形圖。然而在網(wǎng)頁(yè)上實(shí)現(xiàn)樹(shù)形圖就不那么容易了,現(xiàn)在在ASP.NET中利用微軟提供的Internet Explorer WebControls它使得網(wǎng)頁(yè)上的樹(shù)形圖開(kāi)發(fā)與在Windows下一樣的方便,一樣的功能強(qiáng)大,甚至更靈活。


本文介紹用Internet Explorer WebControls開(kāi)發(fā)ASP.NET樹(shù)形圖的方法,由于樹(shù)形圖結(jié)構(gòu)較復(fù)雜,使用起來(lái)常不知如何下手。筆者結(jié)合最近剛為公司用ASP.NET編寫(xiě)的應(yīng)用程序管理器這一具體實(shí)例,詳細(xì)闡述在ASP.NET下如何將Internet Explorer WebControls的使用與數(shù)據(jù)庫(kù)聯(lián)系起來(lái),實(shí)現(xiàn)數(shù)據(jù)分任意多層顯示,方便地進(jìn)行增加、修改、刪除、移動(dòng)操作。筆者希望通過(guò)對(duì)該實(shí)例的闡述,達(dá)到拋磚引玉的效果,與各位同仁相互交流,共同進(jìn)步。

一、樹(shù)的建立

具體方法是:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),設(shè)計(jì)樹(shù)圖信息表TREE_INFO,包含NODEID、PARENTID、NODENAME、ADDERSS、ICON字段,其它字段根據(jù)實(shí)際業(yè)務(wù)而定,節(jié)點(diǎn)名稱(chēng)NODENAME將在樹(shù)型控件的節(jié)點(diǎn)上顯示,NODEID字段保存節(jié)點(diǎn)的***標(biāo)識(shí)號(hào),PARENTID表示當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)號(hào),標(biāo)識(shí)號(hào)組成了一個(gè)“鏈表”,記錄了樹(shù)上節(jié)點(diǎn)的結(jié)構(gòu)。設(shè)計(jì)一個(gè)Web窗體其上放置TreeView控件。

  1. Private Sub CreateDataSet()’建立數(shù)據(jù)集  
  2. Dim myConn As New SqlConnection()  
  3. Dim myCmd As New SqlCommand("select NODEID,NODENAME,PARENTID,
    ADDRESS,ICON from Tree_info", myConn)  
  4. Dim myDataAdapter As New SqlDataAdapter()  
  5. myConn.ConnectionString = Application("connectstring")  
  6. myCmd.CommandText = "" 
  7. myCmd.Connection = myConn 
  8. myDataAdapter.SelectCommand = myCmd 
  9. myDataAdapter.Fill(ds, "tree")  
  10. End Sub  

建樹(shù)的基本思路是:從根節(jié)點(diǎn)開(kāi)始遞歸調(diào)用顯示子樹(shù)

  1. Private Sub Page_Load(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles MyBase.Load  
  2. CreateDataSet()  
  3. intiTree(TreeView1.Nodes, 0)  
  4. End Sub  
  5. Private Sub intiTree(ByRef Nds As TreeNodeCollection, 
    ByVal parentId As Integer)  
  6. Dim dv As New DataView()  
  7. Dim drv As DataRowView  
  8. Dim tmpNd As TreeNode  
  9. Dim intId As Integer  
  10. dv.Table = ds.Tables("tree")  
  11. dv.RowFilter = "PARENTID=’" & parentId & "’"  
  12. For Each drv In dv  
  13. tmpNd = New TreeNode()  
  14. strId = drv("NODE_ID")  
  15. tmpNd.ID = strId 
  16. tmpNd.Text = drv("NODE_NAME ")  
  17. tmpNd.ImageUrl = drv("ICON").ToString  
  18. Nds.Add(tmpNd)  
  19. intiTree(Nds(Nds.Count - 1).Nodes, intId)  
  20. Next  
  21. End Sub 

二、增加、刪除樹(shù)節(jié)點(diǎn)

單純?cè)赥reeview 上增加、刪除、修改節(jié)點(diǎn)只需用Nodes屬性的Add、 Remove、等方法即可,值得注意的地方是VS.NET中Treeview的Nodes集合與VS6.0中的區(qū)別,VS6.0中的是一個(gè)大的集合,而 VS.NET中的是分層的每個(gè)Node下都有Nodes屬性。增加、刪除、修改樹(shù)節(jié)點(diǎn)時(shí)與VS6.0相比有很大差別,特別是刪除時(shí)。
Private Sub ButAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButAdd.Click’在選定的節(jié)點(diǎn)下添加子節(jié)點(diǎn)

  1. Dim tmpNd As New TreeNode(), NdSel As TreeNode  
  2. tmpNd.ID = GetNewId()  
  3. NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)’選中的節(jié)點(diǎn)  
  4. tmpNd.Text = "新節(jié)點(diǎn)" 
  5. NdSel.Nodes.Add(tmpNd)  
  6. Dim myRow As DataRow  
  7. myRow = ds.Tables("tree").NewRow()  
  8. myRow("NODE_NAME") = tmpNd.ID  
  9. myRow("NODE_DESCRIPT") = "新節(jié)點(diǎn)" & tmpNd.ID & "_" & NdSel.ID  
  10. myRow("PARENT_NAME") = NdSel.ID  
  11. ds.Tables("tree").Rows.Add(myRow)  
  12. End Sub  
  13. Private Sub ButDele_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    Handles ButDele.Click’刪除選中的節(jié)點(diǎn)  
  14. Dim idx As String = TreeView1.SelectedNodeIndex()  
  15. GetNdCol(idx).Remove(TreeView1.GetNodeFromIndex(idx))  
  16. Dim dv As New DataView(), recNo As Integer  
  17. dv.Table = ds.Tables("tree")  
  18. dv.RowFilter"NODEID=" & NdId  
  19. dv.Delete(0)  
  20. End Sub  
  21. Private Function GetNdCol(ByVal idx As String) As TreeNodeCollection  
  22. ‘獲得選中節(jié)點(diǎn)的父節(jié)點(diǎn)的Nodes集合  
  23. Dim cnt As Integer, i As Integer  
  24. Dim tmpNds As TreeNodeCollection  
  25. Dim idxs() As String  
  26. idxs = Split(idx, ".")  
  27. cnt = UBound(idxs)  
  28. If cnt = 0 Then  
  29. tmpNds = TreeView1.Nodes  
  30. Else  
  31. tmpNds = TreeView1.Nodes(CInt(idxs(0))).Nodes  
  32. For i = 1 To cnt - 1  
  33. tmpNdstmpNds = tmpNds(CInt(idxs(i))).Nodes  
  34. Next  
  35. End If  
  36. Return tmpNds  
  37. End Function 

三、修改、移動(dòng)樹(shù)節(jié)點(diǎn)

由于服務(wù)器控件不支持鼠標(biāo)拖動(dòng)事件,所以不能象Windows程序那樣通過(guò)拖動(dòng)移動(dòng)節(jié)點(diǎn),這里是通過(guò)選擇父節(jié)點(diǎn)的方式。移動(dòng)是通過(guò)在原位置刪除,新位置添加實(shí)現(xiàn)的,要注意在刪除時(shí)先保存節(jié)點(diǎn)信息。

  1. Private Sub TreeView1_SelectedIndExchange(ByVal sender As Object, 
    ByVal e As Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs) 
    Handles TreeView1.SelectedIndexChange  
  2. Dim dv As New DataView()  
  3. dv.Table = ds.Tables("tree")  
  4. Dim tmpNd As TreeNode = TreeNdSel(e.OldNode), tmpNds As TreeNodeCollection  
  5. dv.RowFilter"NODEID=" & tmpNd.ID  
  6. dv(0)("NODE_DESCRIPT") = Me.TextBox1.Text  
  7. dv(0)("ADDRESS") = Me.TextBox2.Text  
  8. dv(0)("TARGET") = Me.TextBox3.Text  
  9. dv(0)("ICON") = Me.TextBox4.Text  
  10. If dv(0)("PARENTID").ToString <> Me.DropDownList1.SelectedItem.Value Then  
  11. ‘移動(dòng)節(jié)點(diǎn)  
  12. dv(0)("PARENT_NAME") = Me.DropDownList1.SelectedItem.Value  
  13. If Me.DropDownList1.SelectedItem.Value = "ROOT" Then  
  14. tmpNds = TreeView1.Nodes  
  15. Else  
  16. tmpNds = FromIdToNode(Me.DropDownList1.SelectedItem.Value, 
    TreeView1.Nodes).Nodes’新的父節(jié)點(diǎn)的Nodes集合  
  17. End If  
  18. GetNdCol(e.OldNode).Remove(tmpNd)  
  19. tmpNds.Add(tmpNd)  
  20. End If  
  21. tmpNd.Text = Me.TextBox1.Text  
  22. tmpNd.ImageUrl = Me.TextBox4.Text  
  23. tmpNd = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)  
  24. dv.RowFilter"NODEID=" & tmpNd.ID  
  25. Me.TextBox1.Text = dv(0)("NODENAME").ToString  
  26. Me.TextBox2.Text = dv(0)("ADDRESS").ToString  
  27. Me.TextBox3.Text = dv(0)("TARGET").ToString  
  28. Me.TextBox4.Text = dv(0)("ICON").ToString  
  29. End Sub  
  30. Private Function FromIdToNode(ByVal ID As String, 
    ByVal Nds As TreeNodeCollection) As TreeNode  
  31. ‘由關(guān)鍵字查找節(jié)點(diǎn)  
  32. Dim i As Integer  
  33. Dim tmpNd As TreeNode, tmpNd1 As TreeNode  
  34. For Each tmpNd In Nds  
  35. If tmpNd.ID = ID Then  
  36. Return tmpNd  
  37. Exit Function  
  38. End If  
  39. tmpNd1 = FromIdToNode(ID, tmpNd.Nodes)  
  40. If Not (tmpNd1 Is Nothing) Then  
  41. Return tmpNd1  
  42. Exit Function  
  43. End If  
  44. Next  
  45. Return Nothing  
  46. End Function 

四、結(jié)束語(yǔ)

以上闡述ASP.NET樹(shù)形圖,以及如何在對(duì)樹(shù)節(jié)點(diǎn)進(jìn)行維護(hù)(增加、刪除、修改、移動(dòng))的同時(shí),修改數(shù)據(jù)庫(kù)數(shù)據(jù)。由于篇幅所限,筆者在此只對(duì)基本思路和流程及關(guān)鍵步驟作了介紹,并未列出詳細(xì)源代碼,讀者可自行完善。需要詳細(xì)源代碼者可與我聯(lián)系,本文程序在VS.NET、SQLServer、 Windows 2000、IIS5.0下調(diào)試通過(guò)。

【編輯推薦】

  1. ASP.NET的DataList和Repeater控件
  2. 淺析ASP.NET的IIS映射
  3. 概述ASP.NET狀態(tài)類(lèi)型
  4. 淺談ASP.NET和Web服務(wù)器
  5. ASP.NET的EnableViewState屬性
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-07-29 16:08:07

ASP和ASP.NET

2009-07-23 13:19:51

2009-07-28 16:57:50

ASP.NET Ses

2009-07-24 10:14:22

ASP.NET開(kāi)發(fā)

2009-08-05 11:14:33

ASP.NET ISA

2009-07-22 16:25:41

ASP.NET AJA

2009-07-28 13:39:44

加載ViewStateASP.NET

2009-08-04 10:43:59

ASP.NET控件開(kāi)發(fā)

2009-08-19 13:44:00

ASP.NET Lis

2009-08-04 18:10:35

ASP.NET動(dòng)態(tài)編譯

2022-06-13 10:39:12

JavaScript

2009-07-23 13:09:23

2009-08-18 17:50:37

ASP.NET MVC

2009-08-05 17:39:13

ASP.NET常用狀態(tài)

2009-08-04 16:09:38

ASP.NET入門(mén)

2009-03-31 09:18:34

客戶(hù)端內(nèi)置對(duì)象ASP.NET

2009-07-21 15:38:31

2011-11-22 09:32:39

ASP.NET

2024-09-09 07:37:51

AspJWT權(quán)限

2009-07-23 13:26:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)