Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode() Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode() 'NdSel 爲當前選定的要刪除節點,tmpNd3爲它的父節點 NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex) If (Treepaybasic.SelectedNodeIndex <> "0") Then tmpNd3 = NdSel.Parent tmpNd3.Nodes.Remove(NdSel) Else Treepaybasic.Nodes.Clear() End If @修改節點: Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode() NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex) NdSel.Text = "aaa" @剪切和粘貼 剪切: Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode() Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode() 'NdSel 爲當前選定的要刪除節點,tmpNd3爲它的父節點 NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex) '將剪切下來的節點存入session Session("node") = NdSel If (Treepaybasic.SelectedNodeIndex <> "0") Then tmpNd3 = NdSel.Parent tmpNd3.Nodes.Remove(NdSel) End If 粘貼: Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode() Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode() 'NdSel 爲當前要粘貼節點的父節點 NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex) tmpNd3 = Session("node") NdSel.Nodes.Add(tmpNd3) 2.用遞歸生成樹的算法和數據庫設計 (1)遞歸說明 程序調用自身的編程方法稱爲遞歸(recursion)。在樹的生成以及圖的遍歷中,遞歸用的很多。經典的算法求 n! (求n的階乘)中,用的就是遞歸方法。遞歸算法的優點就是簡潔,可擴充性好。但是缺點也很明顯:低效。因爲遞歸就是程序不斷調用自身,對系統的資源消耗比較大。隨着節點的增多,執行效率會變的很低。 爲了解決樹在生成過程中的層樹不定的問題,同時也是爲了讓樹的擴展性更好。樹的生成使用了遞歸的方法。生成樹的代碼一旦寫成,可以不改動源代碼,生成無限級層次的樹。樹的結構完全由數據庫中表的數據決定。 (2)數據庫設計
創建一個數據庫,設計樹圖信息表Treetable,表中屬性包含Nodeid、Parentid、Nodename、Address等字段(分別用於表示節點的ID、父節點ID、節點名稱、鏈接地址),其它屬性根據實際用戶需求和設計而定。節點名稱Nodename將在樹型控件的節點上顯示,Nodeid字段保存節點的唯一標識號,Parentid表示當前節點的父節點ID號(例如有兩個節點是父子關係,孩子節點的Parentid值就是其父節點的Nodeid),節點號父子相接組成了一個“鏈表”,表徵並記錄了樹上節點的層次結構。 表具體設計如下:(簡化模型,實際使用的要複雜一些) 主鍵 屬性名 類型 長度 可空 屬性含義 是 Nodeid int 6 否 節點ID Parentid int 6 否 父節點ID Nodename char 50 否 節點名稱 Address char 80 可 鏈接地址 備註:鏈接地址 主要是用在: 樹在框架中使用的環境。鏈接可以指向其他框架頁中的地址或是帶不同的參數。 (3)程序代碼 ――――――――――――遞歸函數―――――――――――― '生成樹的函數 Private Sub inittree(ByRef Nds As Microsoft.Web.UI.WebControls.TreeNodeCollection, ByVal parentId As Integer) Dim dv As New DataView() Dim dvrow As DataRowView Dim tmpNode As Microsoft.Web.UI.WebControls.TreeNode 'intId爲數值型變量,其作用是記錄並傳遞當前記錄的ID,做爲它子節點的PARENTID值 Dim intId As Integer dv.Table = mySet.Tables("paybasic") 'parentId傳遞的是 additem函數中的intId.下面語句的作用是找出當前節點的子孩子集合。 dv.RowFilter = "parentID='" & parentId & "'" '如果當前節點有孩子,則遍歷所有的孩子,並調用遞歸函數。 For Each dvrow In dv tmpNode = New Microsoft.Web.UI.WebControls.TreeNode() '爲當前節點的各個屬性賦值。 tmpNode.ID = dvrow("nodeID") tmpNode.Text = dvrow("nodename") tmpNode.NavigateUrl = dvrow("Address") intId = dvrow("parentID") '添加一個節點 Nds.Add(tmpNode) '調用遞歸函數 inittree(Nds(Nds.Count - 1).Nodes, intId) Next End Sub
――――――――――――――――調用遞歸函數―――――――――――――――――― CreateReaderDataSet() inittree(Treepaybasic.Nodes, 999) ―――――――――――――――――生成數據集――――――――――――――――――― '生成數據集的函數 Private Sub CreateReaderDataSet() '在運行時連接,並設置連接屬性 MyConn = New System.Data.OleDb.OleDbConnection("Provider=MSDAORA.1;Data Source=oracle9;User ID=user;Password=****;") '設置SelectCommand命令 myAdapter.SelectCommand = New System.Data.OleDb.OleDbCommand("select * from treenode", MyConn) '填充數據集 myAdapter.Fill(mySet, "treenode") End Sub