Public Class RowNodes Implements IList, ICollection, IEnumerable Private ReadOnly _owner As RowNode Private nodes As List(Of RowNode) Friend Sub New(node As RowNode) _owner = node nodes = New List(Of RowNode) End Sub Default Public Property Item(index As Integer) As Object Implements IList.Item Get Return nodes.Item(index) End Get Set(value As Object) nodes(index) = CType(value, RowNode) End Set End Property Public ReadOnly Property IsReadOnly As Boolean Implements IList.IsReadOnly Get Return False End Get End Property Public ReadOnly Property IsFixedSize As Boolean Implements IList.IsFixedSize Get Return False End Get End Property Public ReadOnly Property Count As Integer Implements ICollection.Count Get Return nodes.Count End Get End Property Public ReadOnly Property SyncRoot As Object Implements ICollection.SyncRoot Get Return False End Get End Property Public ReadOnly Property IsSynchronized As Boolean Implements ICollection.IsSynchronized Get Return False End Get End Property ''' ''' 更新节点的上一节点指向 ''' ''' 需要更新的节点 Private Sub AddNodeUpdatePrevNode(node As RowNode) If node.Index > 0 Then node.PrevNode = node.ParentNode.Nodes(node.Index - 1) '更新上一节点的下一节点指向 node.PrevNode.NextNode = node Else node.PrevNode = Nothing End If End Sub ''' ''' 更新节点的下一节点指向 ''' ''' 需要更新的节点 Private Sub AddNodeUpdateNextNode(node As RowNode) If node.Index < node.ParentNode.Nodes.Count - 1 Then node.NextNode = node.ParentNode.Nodes(node.Index + 1) '更新下一节点的上一节点指向 node.NextNode.PrevNode = node Else node.NextNode = Nothing End If End Sub ''' ''' 新增节点后,更新父节点的所有子节点计数 ''' ''' 新增的节点 Private Sub AddNodeUpdateAllChildCount(node As RowNode) Dim pNode As RowNode = node.ParentNode While pNode IsNot Nothing pNode.AllChildCount += (node.AllChildCount + 1) pNode = pNode.ParentNode End While End Sub ''' ''' 删除节点后,更新父节点的所有子节点计数 ''' ''' 被删除的节点 ''' 包含当前节点 Private Sub DelNodeUpdateAllChildCount(node As RowNode, Optional include As Boolean = True) Dim removeCount As Integer If include Then removeCount = node.AllChildCount + 1 Else removeCount = node.AllChildCount End If Dim pNode As RowNode = node.ParentNode While pNode IsNot Nothing pNode.AllChildCount -= removeCount pNode = pNode.ParentNode End While End Sub ''' ''' 插入节点后,更新节点下方节点的索引 ''' ''' 需要更新下方节点索引的节点 Private Sub AddNodeUpdateRowIndex(node As RowNode) While node.NextNode IsNot Nothing node.NextNode.Index = node.Index + 1 node = node.NextNode End While End Sub ''' ''' 删除节点后,更新节点下方节点的索引 ''' ''' Private Sub DelNodeUpdateRowIndex(node As RowNode) If node.NextNode Is Nothing Then Return node.NextNode.Index = node.Index node = node.NextNode While node.NextNode IsNot Nothing node.NextNode.Index = node.Index + 1 node = node.NextNode End While End Sub ''' ''' 获取新添加的节点的链状目录索引 ''' ''' ''' Private Function GetRowListIndex(node As RowNode) As Integer Dim rowListIndex As Integer If node.Index = 0 Then rowListIndex = node.ParentNode.RowListIndex + 1 Else rowListIndex = node.PrevNode.RowListIndex + node.PrevNode.AllChildCount + 1 End If Return rowListIndex End Function ''' ''' 更新节点的所有子节点的链式结合的指向 ''' ''' ''' Private Sub AddNodeUpdateRowList(pNode As RowNode, node As RowNode) node.RowList = pNode.RowList node.RowListIndex = GetRowListIndex(node) node.RowList.Insert(node.RowListIndex, node) For Each cNode As RowNode In node.Nodes AddNodeUpdateRowList(node, cNode) Next End Sub ''' ''' 删除节点后,更新链状列表 ''' ''' ''' 包含当前节点 Private Sub DelNodeUpdateRowList(node As RowNode, Optional include As Boolean = True) Dim index As Integer If include Then index = node.RowListIndex node.RowList.RemoveAt(index) Else index = node.RowListIndex + 1 End If Dim removeCount As Integer = node.AllChildCount While removeCount > 0 node.RowList.RemoveAt(index) removeCount -= 1 End While End Sub ''' ''' 插入节点后,更新链状目录中受影响节点的索引 ''' ''' Private Sub AddNodeUpdateRowListIndex(node As RowNode) Dim startIndex As Integer = node.RowListIndex + node.AllChildCount + 1 For index As Integer = startIndex To node.RowList.Count - 1 node.RowList(index).RowListIndex = index Next End Sub ''' ''' 删除节点后,更新链状目录中受影响节点的索引 ''' ''' 删除的节点 ''' 是否保存该节点 Private Sub DelNodeUpdateRowListIndex(node As RowNode, Optional include As Boolean = True) Dim startIndex As Integer = node.RowListIndex If include = False Then startIndex += 1 For i As Integer = startIndex To node.RowList.Count - 1 _owner.RowList(i).RowListIndex = i Next End Sub Public Function Add(value As Object) As Integer Implements IList.Add Dim node As RowNode Try node = CType(value, RowNode) Catch ex As Exception Return -1 End Try nodes.Add(node) node.HeadNode = _owner.HeadNode node.ParentNode = _owner node.Lever = _owner.Lever + 1 node.Index = nodes.Count - 1 node.RowList = _owner.RowList node.Visible = _owner.Visible And _owner.Expanded '更新节点可见属性 node.UpdateVisible() '更新节点参与编译 node.UpdateCompile() '更新节点可见节点数 ' If _owner.Expanded Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount) If node.Visible Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount) '更新父节点总子节点计数 AddNodeUpdateAllChildCount(node) '更新上一节点指向 AddNodeUpdatePrevNode(node) '更新下一节点指向 node.NextNode = Nothing '将节点及其子节点插入到链状目录中,并更新链状目指向 AddNodeUpdateRowList(_owner, node) '更新下方节点链状索引 AddNodeUpdateRowListIndex(node) Return nodes.Count End Function Public Sub Insert(index As Integer, value As Object) Implements IList.Insert Dim node As RowNode = CType(value, RowNode) nodes.Insert(index, node) node.HeadNode = _owner.HeadNode node.ParentNode = _owner node.Lever = _owner.Lever + 1 node.Index = index node.RowList = _owner.RowList node.Visible = _owner.Visible And _owner.Expanded 'node.Compile = _owner.Compile AndAlso node.Action '更新节点可见属性 node.UpdateVisible() '更新节点参与编译 node.UpdateCompile() '更新节点可见节点数 'If _owner.Expanded Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount) If node.Visible Then _owner.UpdateVisibleCount(1 + node.VisibleNodesCount) '更新父节点总子节点计数 AddNodeUpdateAllChildCount(node) '更新上一节点指向 AddNodeUpdatePrevNode(node) '更新下一节点指向 AddNodeUpdateNextNode(node) '更新下方节点树状索引 AddNodeUpdateRowIndex(node) '将节点及其子节点插入到链状目录中,并更新链状目指向 AddNodeUpdateRowList(_owner, node) '更新下方节点链状索引 AddNodeUpdateRowListIndex(node) End Sub ''' ''' 移除指定节点 ''' ''' Public Sub Remove(value As Object) Implements IList.Remove Dim node As RowNode = CType(value, RowNode) nodes.Remove(node) _owner.UpdateVisibleCount(0 - (1 + node.VisibleNodesCount)) '更新父节点总子节点计数 DelNodeUpdateAllChildCount(node) '更新上一节点的下一节点指向 If node.PrevNode IsNot Nothing Then node.PrevNode.NextNode = node.NextNode End If '更新下一节点的上一节点指向 If node.NextNode IsNot Nothing Then node.NextNode.PrevNode = node.PrevNode End If '更新下方节点树状索引 DelNodeUpdateRowIndex(node) '链状目录移除被删除的节点 DelNodeUpdateRowList(node) '更新链状目录中的节点索引 DelNodeUpdateRowListIndex(node) End Sub Public Sub RemoveAt(index As Integer) Implements IList.RemoveAt Dim node As RowNode = nodes(index) nodes.RemoveAt(index) _owner.UpdateVisibleCount(0 - (1 + node.VisibleNodesCount)) '更新父节点总子节点计数 DelNodeUpdateAllChildCount(node) '更新上一节点的下一节点指向 If node.PrevNode IsNot Nothing Then node.PrevNode.NextNode = node.NextNode End If '更新下一节点的上一节点指向 If node.NextNode IsNot Nothing Then node.NextNode.PrevNode = node.PrevNode End If '更新下方节点树状索引 DelNodeUpdateRowIndex(node) '链状目录移除被删除的节点 DelNodeUpdateRowList(node) '更新链状目录中的节点索引 DelNodeUpdateRowListIndex(node) End Sub ''' ''' 清空节点 ''' Public Sub Clear() Implements IList.Clear _owner.UpdateVisibleCount(0 - _owner.VisibleNodesCount) '清空树状目录子节点 nodes.Clear() '更新父节点总子节点计数 DelNodeUpdateAllChildCount(_owner, False) '链状目录移除被删除的节点 DelNodeUpdateRowList(_owner, False) '更新链状目录中的节点索引 DelNodeUpdateRowListIndex(_owner, False) '更新总子节点计数 _owner.AllChildCount = 0 End Sub Public Sub CopyTo(array As Array, index As Integer) Implements ICollection.CopyTo nodes.CopyTo(CType(array, RowNode()), index) End Sub Public Function Contains(value As Object) As Boolean Implements IList.Contains Return nodes.Contains(CType(value, RowNode)) End Function Public Function IndexOf(value As Object) As Integer Implements IList.IndexOf Return nodes.IndexOf(CType(value, RowNode)) End Function Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return nodes.GetEnumerator End Function End Class