Option Explicit On Public Class Nodes #Region "公共变量" Private mobjNodes As Collection Private mOwner As Node Private mobjFirstNode As Node Private mobjLastNode As Node Private mintKey As Integer #End Region #Region "Public属性" Public ReadOnly Property FirstNode() As Node Get Return mobjFirstNode End Get End Property Public ReadOnly Property LastNode() As Node Get Return mobjLastNode End Get End Property Default Public ReadOnly Property Item(ByVal Key As Object) As Node Get On Error Resume Next Item = mobjNodes.Item(Key) If Err.Number <> 0 Then Return Nothing End If End Get End Property #End Region #Region "Public方法" Public Sub New(ByVal Owner As Node) mobjNodes = New Collection mOwner = Owner End Sub Public Sub Dispose() Me.Dispose(True) End Sub Public Function Add() As Node Return Add("", "") End Function Public Function Add(ByVal Text As String) As Node Return Add(Text, "") End Function Public Function Add(ByVal Text As String, ByVal Tag As String) As Node mintKey = mintKey + 1 Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner) If mobjNodes.Count = 0 Then mobjFirstNode = objNode mobjLastNode = objNode Else mobjLastNode.NextNode = objNode objNode.PrevNode = mobjLastNode mobjLastNode = objNode End If mobjNodes.Add(objNode, objNode.Key) mOwner.UpdateChindrenCount(1) If mOwner.Expanded Then mOwner.UpdateVisibleNodesCount(1) End If Return objNode End Function Public Sub Add(ByVal Count As Integer) Dim i As Integer For i = 1 To Count Call Add() Next End Sub Public Sub Clear() Dim i As Integer Dim objNode As Node If mobjNodes Is Nothing Then Return End If If mobjNodes.Count = 0 Then Return End If mOwner.UpdateChindrenCount(-mobjNodes.Count) If mOwner.Expanded Then mOwner.UpdateVisibleNodesCount(-mobjNodes.Count) End If mobjLastNode = Nothing mobjFirstNode = Nothing For i = mobjNodes.Count To 1 Step -1 objNode = mobjNodes.Item(i) If objNode.HasChildren Then objNode.Nodes.Clear() End If mobjNodes.Remove(i) Next End Sub Public Function Count() As Integer Return mobjNodes.Count End Function Public Function InsertBefore(ByVal Key As String, ByVal Text As String, ByVal Tag As String) As Node '在指定Key的前面插入一个新的节点 mintKey = mintKey + 1 Dim objNode1 As Node = mobjNodes.Item(Key) Dim objNode2 As Node = objNode1.PrevNode Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner) objNode.NextNode = objNode1 objNode.PrevNode = objNode2 objNode1.PrevNode = objNode If Not objNode2 Is Nothing Then objNode2.NextNode = objNode Else mobjFirstNode = objNode End If mobjNodes.Add(objNode, objNode.Key) mOwner.UpdateChindrenCount(1) If mOwner.Expanded Then mOwner.UpdateVisibleNodesCount(1) End If Return objNode End Function Public Function InsertAfter(ByVal Key As String, ByVal Text As String, ByVal Tag As String) As Node '在指定Key的后面插入一个新的节点 mintKey = mintKey + 1 Dim objNode1 As Node = mobjNodes.Item(Key) Dim objNode2 As Node = objNode1.NextNode Dim objNode As New Node("N" & mintKey, Text, Tag, mOwner.Level + 1, mOwner) objNode.PrevNode = objNode1 objNode.NextNode = objNode2 objNode1.NextNode = objNode If Not objNode2 Is Nothing Then objNode2.PrevNode = objNode Else mobjLastNode = objNode End If mobjNodes.Add(objNode, objNode.Key) mOwner.UpdateChindrenCount(1) If mOwner.Expanded Then mOwner.UpdateVisibleNodesCount(1) End If Return objNode End Function Public Sub Remove(ByVal Key As Object) Dim objNode As Node objNode = mobjNodes.Item(Key) If mobjNodes.Count <= 1 Then mobjFirstNode = Nothing mobjLastNode = Nothing Else If objNode.PrevNode Is Nothing Then 'FirstNode mobjFirstNode = objNode.NextNode mobjFirstNode.PrevNode = Nothing Else objNode.PrevNode.NextNode = objNode.NextNode End If If objNode.NextNode Is Nothing Then 'LastNode mobjLastNode = objNode.PrevNode mobjLastNode.NextNode = Nothing Else objNode.NextNode.PrevNode = objNode.PrevNode End If End If If objNode.HasChildren Then objNode.Nodes.Clear() End If mobjNodes.Remove(Key) mOwner.UpdateChindrenCount(-1) If mOwner.Expanded Then mOwner.UpdateVisibleNodesCount(-1) End If End Sub #End Region #Region "其它" Protected Overrides Sub Finalize() Try Me.Dispose(False) Finally MyBase.Finalize() End Try End Sub Protected Overridable Sub Dispose(ByVal disposing As Boolean) Clear() mobjNodes = Nothing If disposing Then GC.SuppressFinalize(Me) End If End Sub #End Region End Class