DevExpress.XtraTreeList 操作大全

http://blog.csdn.net/zengjiangyou/article/details/5251358


  '-----------------------------------------------------------------
    ' 文 件 名:XtrasTreeList.vb
    ' 功能描述:XtraTreeList通用操作
    ' 编写人   :zengjiangyou   20090923

    ' 邮     箱 :zengjiangyou@126.com
    ' ----------------------------------------------------------------

Imports DevExpress.XtraTreeList.Nodes
Imports DevExpress.XtraTreeList.Columns
Imports DevExpress.XtraTreeList

Public Class XtrasTreeList

#Region "Column列操作"

    ''' <summary>
    ''' 设置焦点列
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <param name="columnCaption">焦点列名称</param>
    ''' <returns>成功与否</returns>
    ''' <remarks>zengjiangyou 20091015</remarks>
    Public Shared Function SetFocuseColumn(ByRef treeList As DevExpress.XtraTreeList.TreeList, ByVal columnCaption As String) As DevExpress.XtraTreeList.Columns.TreeListColumn
        If treeList Is Nothing Then
            Exit Function
        End If

        Dim CurColumn As Columns.TreeListColumn = treeList.Columns.ColumnByFieldName(columnCaption)

        If Not CurColumn Is Nothing Then
            treeList.FocusedColumn = CurColumn
            '获得焦点
            treeList.Focus()
        End If

        Return CurColumn
    End Function

    ''' <summary>
    ''' 固定列
    ''' </summary>
    ''' <param name="treeList">需要固定列的控件</param>
    ''' <param name="columnIndex">固定列索引(固定列数目)</param>
    ''' <returns>成功与否</returns>
    ''' <remarks>zengjiangyou 20091015</remarks>
    Public Shared Function FixColumn(ByRef treeList As DevExpress.XtraTreeList.TreeList, ByVal columnIndex As Integer) As Boolean
        Try
            Dim i As Integer

            For i = 0 To columnIndex - 1
                treeList.Columns(i).Fixed = FixedStyle.Left
            Next

            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

    ''' <summary>
    ''' 实现编辑时(使用Enter键可以直接进入下一行)
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <param name="e">事件</param>
    ''' <returns></returns>
    ''' <remarks>zengjiangyou 20090923</remarks>
    Public Shared Sub EditorKeyDown(ByVal treeList As DevExpress.XtraTreeList.TreeList, ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Enter Then
            If treeList.FocusedColumn.Caption = "计算式" Then
                treeList.MoveNextVisible()
                treeList.Selection.Clear()
                treeList.FocusedNode.Selected = True
            End If
        End If
    End Sub

    ''' <summary>
    ''' 添加列
    ''' </summary>
    ''' <param name="caption">标题</param>
    ''' <param name="fieldName">绑定字段</param>
    ''' <param name="name">绑定名称</param>
    ''' <param name="Visible">是否可视</param>
    ''' <param name="Visible">是否只读</param>
    ''' <returns>列</returns>
    ''' <remarks>zengjiangyou 20090923</remarks>
    Public Shared Function AddColumn(ByRef Column As DevExpress.XtraTreeList.Columns.TreeListColumn, _
                                    ByVal caption As String, _
                                     ByVal fieldName As String, _
                                     ByVal name As String, _
                                     ByVal Visible As String, _
                                     Optional ByVal width As Integer = -1, _
                                     Optional ByVal allowEdit As Boolean = True, _
                                     Optional ByVal allowSort As Boolean = False, _
                                     Optional ByVal allowMove As Boolean = False, _
                                     Optional ByVal Alignment As String = "左对齐") As DevExpress.XtraTreeList.Columns.TreeListColumn
        '标题
        Column.Caption = caption
        '绑定字段
        Column.FieldName = fieldName
        '绑定名称
        Column.Name = name

        '是否可以显示
        Column.Visible = (Visible = "是")
        '显示宽度
        If width <> -1 Then
            Column.Width = width
        End If

        '设置为不能排序
        Column.OptionsColumn.AllowSort = allowSort
        '设置列为不能移动
        Column.OptionsColumn.AllowMove = allowMove
        '设置列为不能编辑
        Column.OptionsColumn.AllowEdit = allowEdit

        '---2009.10.21 xiongguohua Add---
        '解决工程量字段对齐设置无效的问题
        Select Case Alignment
            Case "左对齐"
                Column.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near
            Case "居中"
                Column.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center
            Case "右对齐"
                Column.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
            Case Else
                Column.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Default
        End Select
        '-------------------------------
        Return Column

    End Function

    ''' <summary>
    ''' 判断当前工程量是否可以复制(只要判断当前选中的行中既有父亲又有孩子行就不可用)
    ''' </summary>
    ''' <param name="treelist"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SelectNodeIsSameLevel(ByVal treelist As DevExpress.XtraTreeList.TreeList) As Boolean

        Dim i As Integer
        Dim intCount As Integer = treelist.Selection.Count - 1
        Dim intLevel As Integer = -1

        If intCount > 0 Then
            intLevel = treelist.Selection.Item(0).Level
        ElseIf intCount = 0 Then
            Return True
        End If

        For i = 1 To intCount
            If (intLevel <> treelist.Selection.Item(i).Level) And (intLevel <> -1) Then
                Return False
                Exit For
            End If
        Next

        Return True

    End Function

    ''' <summary>
    ''' 判断当前工程量是否可以复制(只要判断当前选中的行中既有父亲又有孩子行就不可用)
    ''' </summary>
    ''' <param name="treelist"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SelectChildAndParent(ByVal treelist As DevExpress.XtraTreeList.TreeList) As Boolean
        SelectChildAndParent = True

        Dim i As Integer
        Dim j As Integer

        Dim ParRow As DevExpress.XtraTreeList.Nodes.TreeListNode
        Dim intCount As Integer
        Dim intChildCount As Integer

        intCount = treelist.Selection.Count - 1

        For i = 0 To intCount
            ParRow = treelist.Selection.Item(i)

            If ParRow.HasChildren Then

                intChildCount = ParRow.Nodes.Count - 1
                For j = 0 To intChildCount
                    If IsSelected(ParRow.Nodes(j)) Then
                        SelectChildAndParent = False
                        Exit Function
                    End If

                Next j
            End If
        Next i
    End Function

    ''' <summary>
    ''' 判断当前记录行是否被选中(其本身和它的孩子中只要有一个被选中就返回True)
    ''' </summary>
    ''' <param name="Row"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function IsSelected(ByVal Row As DevExpress.XtraTreeList.Nodes.TreeListNode) As Boolean
        If Row.Selected Then
            IsSelected = True
            Exit Function
        End If

        Dim i As Integer
        Dim intCount As Integer
        Dim Selected As Boolean

        intCount = Row.Nodes.Count - 1
        For i = 0 To intCount
            Selected = IsSelected(Row.Nodes(i))
            If Selected = True Then
                IsSelected = True
                Exit Function
            End If
        Next i

        IsSelected = False

    End Function

#End Region

#Region "其他操作"


    '''keyDown输入事件
    Public Shared Sub TreeListKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Dim CurTreeList As TreeList = TryCast(sender, TreeList)

        '如果是辅助键,则不需要开出编辑
        If Not (e.KeyCode = 16 Or e.KeyCode = 17 Or e.KeyCode = Keys.Up Or e.KeyCode = Keys.Down Or e.KeyCode = Keys.Left Or e.KeyCode = Keys.Right) Then
            If e.KeyCode = 13 And CurTreeList.FocusedNode IsNot Nothing Then
                CurTreeList.MoveNext()
                CurTreeList.Selection.Clear()
                CurTreeList.FocusedNode.Selected = True
            Else
                CurTreeList.OptionsBehavior.Editable = True
                CurTreeList.ShowEditor()
            End If
        End If
    End Sub

    ''' <summary>
    ''' 获得当前控件焦点行的兄弟上一个兄弟节点
    ''' </summary>
    ''' <param name="treeList">控件对象</param>
    ''' <returns>兄弟节点</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function GetNodeIndexInParentNode(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Integer
        Dim i As Integer
        Dim intCount As Integer
        Dim intIndex As Integer = -1
        Dim CurFocuseNode As Nodes.TreeListNode
        Dim CurParentNode As Nodes.TreeListNode

        CurFocuseNode = treeList.FocusedNode

        If Not CurFocuseNode Is Nothing Then
            CurParentNode = CurFocuseNode.ParentNode
            If Not CurParentNode Is Nothing Then
                intCount = CurParentNode.Nodes.Count - 1
                For i = 0 To intCount
                    If CurParentNode.Nodes(i).Equals(CurFocuseNode) Then
                        intIndex = i
                        Exit For
                    End If
                Next
            End If
        End If

        Return intIndex

    End Function

    ''' <summary>
    ''' 获得当前控件焦点行的兄弟上一个兄弟节点
    ''' </summary>
    ''' <param name="treeList">控件对象</param>
    ''' <returns>兄弟节点</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function GetNodeIndexInParentNode(ByRef treeList As DevExpress.XtraTreeList.TreeList, _
                                                    ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode) As Integer
        Dim i As Integer
        Dim intCount As Integer
        Dim intIndex As Integer = -1


        If Not treeNode Is Nothing Then
            If Not treeNode.ParentNode Is Nothing Then
                intCount = treeNode.ParentNode.Nodes.Count - 1
                For i = 0 To intCount
                    If treeNode.ParentNode.Nodes(i).Equals(treeNode) Then
                        intIndex = i
                        Exit For
                    End If
                Next
            Else
                intCount = treeList.Nodes.Count
                For i = 0 To intCount
                    If treeList.Nodes(i).Equals(treeNode) Then
                        intIndex = i
                        Exit For
                    End If
                Next
            End If
        End If

        Return intIndex

    End Function

    '''获得选中节点的对象
    Public Shared Sub GetNodeObject(ByRef curNodes As DevExpress.XtraTreeList.Nodes.TreeListNodes, _
                                    ByRef qtyList As List(Of ClsDataQuantity))

        Dim i As Integer
        Dim intCount As Integer = curNodes.Count - 1
        Dim CurTmpNode As DevExpress.XtraTreeList.Nodes.TreeListNode = Nothing

        For i = intCount To 0 Step -1

            '获得节点
            CurTmpNode = curNodes(i)

            If curNodes(i).Selected Then
                qtyList.Add(CurTmpNode.GetValue("DataObject"))
            End If

            If CurTmpNode.HasChildren Then
                Call GetNodeObject(CurTmpNode.Nodes, qtyList)
            End If
        Next i
    End Sub


    ''' <summary>
    ''' 将树目录控件中的选中行转换成工程量列表
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <returns>工程量列表</returns>
    ''' <remarks>20090929 修改</remarks>
    Public Shared Function TransTreeNodesToQtyList(ByRef treeList As DevExpress.XtraTreeList.TreeList) As List(Of ClsDataQuantity)
        'Dim i As Integer
        'Dim intCount As Integer
        Dim CurQtyList As New List(Of ClsDataQuantity)

        Try
            '获得选中节点
            Call GetNodeObject(treeList.Nodes, CurQtyList)

            'intCount = treeList.Selection.Count - 1

            'intCount = treeList.AllNodesCount - 1

            'For i = 0 To intCount
            '    If treeList.get(intCount).Selected Then
            '        CurQtyList.Add(treeList.GetNodeByVisibleIndex(intCount).GetValue("DataObject"))
            '    End If
            'Next

            'For i = intCount To 0 Step -1
            '    'CurQtyList.Add(treeList.Selection.Item(i).GetValue("DataObject"))
            'Next

            'Dim num As Integer = treeList.GetNodeIndex(treeList.Selection.Item(i))

            'Dim k As Integer = 0
            'Dim j As Integer = 0
            'Dim tmp As ClsDataQuantity

            'Dim list As New Dictionary(Of Integer, Object)

            'For k = 0 To intCount - 1
            '    list.Add(treeList.GetNodeIndex(treeList.Selection.Item(k)), treeList.Selection.Item(k).GetValue("DataObject"))
            'Next

            'For k = 0 To intCount - 1
            '    For j = k + 1 To intCount
            '        If treeList.GetNodeIndex(treeList.Selection.Item(k)) > treeList.GetNodeIndex(treeList.Selection.Item(j)) Then
            '            tmp = list(k)
            '            list(k) = list(j)
            '            list(j) = tmp
            '        End If
            '    Next j
            'Next k

            ''对数据进行排序,防止选择顺序错乱
            'For Each key As Integer In list.Keys
            '    CurQtyList.Add(list(key))
            'Next

            'Dim CurQty As ClsDataQuantity
            'CurQtyList
        Catch ex As Exception
            gSystem.ReportErr.PopupMessage("XtrasTreeList:  " & ex.Message)
        End Try

        Return CurQtyList
    End Function


    ''' <summary>
    ''' 刷新TreeList控件
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Sub Refresh(ByRef treeList As DevExpress.XtraTreeList.TreeList)
        If Not treeList Is Nothing Then
            treeList.Refresh()
        End If
    End Sub


    ''' <summary>
    ''' 设置控件的焦点Node
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <param name="treeNode">焦点Node</param>
    ''' <returns>焦点Node</returns>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Function SetFouceNode(ByRef treeList As DevExpress.XtraTreeList.TreeList, _
                                        ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode) As Nodes.TreeListNode

        On Error Resume Next

        '设置当前焦点
        If Not treeNode Is Nothing Then
            Dim NothingNode As DevExpress.XtraTreeList.Nodes.TreeListNode = Nothing
            treeList.FocusedNode = NothingNode
            treeList.FocusedNode = treeNode
            treeList.Selection.Clear()
            treeList.Selection.Add(treeNode)
        End If

        Return treeNode
    End Function


    ''' <summary>
    ''' 设置控件的焦点Node
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <param name="treeNode">焦点Node</param>
    ''' <returns>焦点Node</returns>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Function SetFouceNode(ByRef treeList As DevExpress.XtraTreeList.TreeList, _
                                        ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode, _
                                        ByRef causeSelectionChanged As Boolean) As Nodes.TreeListNode

        On Error Resume Next

        '设置当前焦点
        If Not treeNode Is Nothing Then
            If causeSelectionChanged Then
                Dim NothingNode As DevExpress.XtraTreeList.Nodes.TreeListNode = Nothing
                treeList.FocusedNode = NothingNode
            End If
            treeList.FocusedNode = treeNode
            treeList.Selection.Clear()
            treeList.Selection.Add(treeNode)
        End If

        Return treeNode
    End Function

    ''' <summary>
    ''' 变换控件的焦点Node(去掉原来焦点,重新设置控件焦点为当前节点)
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <param name="treeNode">焦点Node</param>
    ''' <returns>焦点Node</returns>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Function ChangeFouceNode(ByRef treeList As DevExpress.XtraTreeList.TreeList, _
                                          ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode) As Nodes.TreeListNode
        '设置当前焦点
        If Not treeNode Is Nothing Then
            treeList.FocusedNode = Nothing
            treeList.FocusedNode = treeNode
            treeList.Selection.Clear()
            treeList.Selection.Add(treeNode)
        End If

        Return treeNode
    End Function

    ''' <summary>
    ''' 设置第一个节点获得焦点
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <param name="FocuseNodeIndex">焦点Node索引</param>
    ''' <returns>焦点Node</returns>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Function SetFristNodeGetFouce(ByRef treeList As DevExpress.XtraTreeList.TreeList) As DevExpress.XtraTreeList.Nodes.TreeListNode
        '设置当前焦点
        If treeList.Nodes.Count = 1 Then
            treeList.FocusedNode = treeList.Nodes.FirstNode
            treeList.Selection.Clear()
            treeList.Selection.Add(treeList.Nodes.FirstNode)
            Return treeList.Nodes.FirstNode
        Else
            Return Nothing
        End If

    End Function

    '释放多选焦点
    Public Shared Sub RefreshFocuse(ByVal TreeList As DevExpress.XtraTreeList.TreeList, _
                             ByVal e As System.EventArgs, _
                             ByVal IsPressCtrl As Boolean, _
                             ByVal mousePosition As System.Drawing.Point)

        If Not IsPressCtrl Then
            '获得当前鼠标的位置
            Dim pt As System.Drawing.Point = TreeList.PointToClient(mousePosition)
            '获得鼠标所在位置 Treelist焦点信息
            Dim info As TreeListHitInfo = TreeList.CalcHitInfo(pt)
            '如果多选,则清除多选操作
            Dim CurNode As DevExpress.XtraTreeList.Nodes.TreeListNode

            '如果焦点是单元格,则设置焦点信息为当前单元格
            If (info.HitInfoType = HitInfoType.Cell) Then
                CurNode = TreeList.FocusedNode
                If Not CurNode Is Nothing Then
                    '如果多选,则清除多选操作
                    If TreeList.Selection.Count > 1 Then
                        TreeList.Selection.Clear()
                    End If

                    TreeList.FocusedNode = Nothing
                    TreeList.FocusedNode = CurNode
                    TreeList.FocusedNode.Selected = True
                End If
            End If

        End If
    End Sub

    ''' <summary>
    ''' 设置第一个节点获得焦点
    ''' </summary>
    ''' <param name="treeList">设置焦点的控件</param>
    ''' <param name="FocuseNodeIndex">焦点Node索引</param>
    ''' <returns>焦点Node</returns>
    ''' <remarks>zengjiangyou 20091014</remarks>
    Public Shared Sub SetLeftMouseButtonState(ByRef treeList As TreeList, _
                             ByVal e As System.Windows.Forms.MouseEventArgs, _
                             ByVal mousePosition As System.Drawing.Point)

        Try

            '获得当前鼠标的位置
            Dim pt As System.Drawing.Point = treeList.PointToClient(mousePosition)
            '获得鼠标所在位置 Treelist焦点信息
            Dim info As TreeListHitInfo = treeList.CalcHitInfo(pt)

            '如果焦点是单元格,则设置焦点信息为当前单元格
            If Not (info.HitInfoType = HitInfoType.Cell) Then
                Dim CurNode As DevExpress.XtraTreeList.Nodes.TreeListNode
                CurNode = treeList.FocusedNode
                If Not CurNode Is Nothing Then
                    '如果多选,则清除多选操作
                    If treeList.Selection.Count > 1 Then
                        treeList.Selection.Clear()
                    End If

                    treeList.FocusedNode = Nothing
                    treeList.FocusedNode = CurNode
                    treeList.FocusedNode.Selected = True
                End If
            Else

                'If treeList.Selection.Count > 1 Then
                '    'debug.print(info.Node.Selected)
                '    'debug.print(info.Node.Focused)

                '    '如果是多选,则去掉多选,选择当前行
                '    Dim CurNode As DevExpress.XtraTreeList.Nodes.TreeListNode
                '    CurNode = treeList.FocusedNode
                '    If Not CurNode Is Nothing Then
                '        treeList.FocusedNode = Nothing
                '        treeList.FocusedNode = CurNode
                '        treeList.Selection.Clear()
                '        treeList.FocusedNode.Selected = True
                '    End If
                'End If
            End If

        Catch ex As Exception
            'debug.print("")
        End Try
    End Sub

    ''' <summary>
    ''' 图片状态改变事件(点击图片控件会失去焦点)
    ''' </summary>
    ''' <param name="treeList">树控件</param>
    ''' <param name="e">鼠标事件</param>
    ''' <remarks>zengjiangyou 20091016</remarks>
    Public Shared Sub StateImageClick(ByVal sender As Object, ByVal e As DevExpress.XtraTreeList.NodeClickEventArgs)
        sender.FocusedNode = e.Node
    End Sub

    ''' <summary>
    ''' 变换右键切换时的焦点行
    ''' </summary>
    ''' <param name="treeList">树控件</param>
    ''' <param name="e">鼠标事件</param>
    ''' <param name="mousePosition">当前鼠标的位置</param>
    ''' <remarks>zengjiangyou 20091016</remarks>
    Public Shared Function SetMouseUpFocuse(ByRef treeList As TreeList, _
                                 ByVal e As System.Windows.Forms.MouseEventArgs, _
                                 ByVal mousePosition As System.Drawing.Point) As Boolean
        Try
            If e.Button = Windows.Forms.MouseButtons.Right Then
                '获得当前鼠标的位置
                Dim pt As System.Drawing.Point = treeList.PointToClient(mousePosition)
                '获得鼠标所在位置 Treelist焦点信息
                Dim info As TreeListHitInfo = treeList.CalcHitInfo(pt)

                '如果没有记录,弹右键盘菜单
                If treeList.Nodes.Count = 0 Then
                    Return True
                End If

                '如果焦点是单元格,则设置焦点信息为当前单元格
                If (info.HitInfoType = HitInfoType.Cell) Then
                    treeList.FocusedNode = info.Node

                    '如果控件是多选
                    If treeList.OptionsSelection.MultiSelect Then
                        If Not treeList.Selection.Contains(treeList.FocusedNode) Then
                            treeList.Selection.Clear()
                            treeList.Selection.Add(treeList.FocusedNode)
                        End If
                    End If

                    Return True

                Else
                    Return False
                End If

            End If
        Catch ex As Exception
            gSystem.ReportErr.PopupMessage("TreeListBackout:    " & ex.Message)
        End Try
    End Function

#End Region

#Region "Node节点操作"

#Region "上移、下移、左移、右移操作是否可用"

    ''' <summary>
    ''' Node上移是否可用
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <returns>TRUE OR FALSE</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function MoveUpEnabled(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Boolean

        If treeList Is Nothing OrElse treeList.FocusedNode Is Nothing Then Return False

        Return treeList.FocusedNode.PrevNode IsNot Nothing

    End Function

    ''' <summary>
    ''' Node下移是否可用
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <returns>TRUE OR FALSE</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function MoveDownEnabled(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Boolean

        If treeList Is Nothing OrElse treeList.FocusedNode Is Nothing Then Return False

        Return treeList.FocusedNode.NextNode IsNot Nothing

    End Function

    ''' <summary>
    ''' Node左移是否可用
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <returns>TRUE OR FALSE</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function MoveLeftEnabled(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Boolean

        If treeList Is Nothing OrElse treeList.FocusedNode Is Nothing Then Return False

        '存在父级节点则可以左移
        Return treeList.FocusedNode.ParentNode IsNot Nothing

 

    End Function

    ''' <summary>
    ''' Node右移是否可用
    ''' </summary>
    ''' <param name="treeList">控件</param>
    ''' <returns>TRUE OR FALSE</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function MoveRightEnabled(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Boolean

        If treeList Is Nothing OrElse treeList.FocusedNode Is Nothing Then Return False

        Return treeList.FocusedNode.PrevNode IsNot Nothing

    End Function

#End Region

#Region "获得兄弟节点"

    ''' <summary>
    ''' 获得当前控件焦点行的兄弟上一个兄弟节点
    ''' </summary>
    ''' <param name="treeList">控件对象</param>
    ''' <returns>兄弟节点</returns>
    ''' <remarks>ZENGJIANGYOU 20090930</remarks>
    Public Shared Function GetUpBrotherNode(ByRef treeList As DevExpress.XtraTreeList.TreeList) As DevExpress.XtraTreeList.Nodes.TreeListNode
        If treeList.FocusedNode Is Nothing Then
            Return Nothing
        Else
            Return treeList.FocusedNode.PrevNode
        End If
    End Function

    ''' <summary>
    ''' 获得当前控件焦点行是否存在兄弟节点
    ''' </summary>
    ''' <param name="treeList">控件对象</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function HasUpBrotherNode(ByRef treeList As DevExpress.XtraTreeList.TreeList) As Boolean
        If treeList.FocusedNode Is Nothing Then
            Return False
        Else
            Return (Not treeList.FocusedNode Is Nothing)
        End If
    End Function

#End Region

#Region "节点插入"
    ''' <summary>
    ''' 插入节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>当前插入的节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function InsertNode(ByVal treelist As DevExpress.XtraTreeList.TreeList) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing
        '定义当前新节点的父级节点
        Dim ParentNode As TreeListNode = Nothing

        If Not treelist.FocusedNode Is Nothing Then
            ParentNode = treelist.FocusedNode.ParentNode
            '添加最顶级节点
            newNode = treelist.AppendNode(Nothing, ParentNode)
            newNode.Nodes.Add(newNode)
            newNode.Nodes.Add(newNode)
            '将新节点调整到指定位置
            treelist.SetNodeIndex(newNode, treelist.GetNodeIndex(treelist.FocusedNode) + 1)
        End If

        Return newNode

    End Function

    ''' <summary>
    ''' 插入的节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <param name="index">节点插入的位置</param>
    ''' <returns>插入的节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function InsertNode(ByVal treelist As DevExpress.XtraTreeList.TreeList, _
                                      ByVal index As Integer) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing
        '定义当前新节点的父级节点
        Dim ParentNode As TreeListNode = Nothing

        Try

            If Not treelist.FocusedNode Is Nothing Then
                ParentNode = treelist.FocusedNode.ParentNode
                '添加最顶级节点
                newNode = treelist.AppendNode(Nothing, ParentNode)
                '将新节点调整到指定位置
                treelist.SetNodeIndex(newNode, index)
            End If

        Catch ex As Exception

        End Try

        Return newNode

    End Function

    ''' <summary>
    ''' 插入子节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>插入Node</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function InsertChildNode(ByVal treelist As DevExpress.XtraTreeList.TreeList) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing

        Try
            If Not treelist.FocusedNode Is Nothing Then
                '添加最顶级节点
                newNode = treelist.AppendNode(Nothing, treelist.FocusedNode)
            End If


        Catch ex As Exception
            MsgBox("提示", MsgBoxStyle.OkOnly, "InsertChildNode")
        End Try

        Return newNode

    End Function

    ''' <summary>
    ''' 插入子节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <param name="index">插入子节点的位置</param>
    ''' <returns>插入的Node</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function InsertChildNode(ByVal treelist As DevExpress.XtraTreeList.TreeList, _
                                           ByVal index As Integer) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing

        Try
            If Not treelist.FocusedNode Is Nothing Then
                '添加最顶级节点
                newNode = treelist.AppendNode(Nothing, treelist.FocusedNode)
            End If

            '将新节点调整到指定位置
            treelist.SetNodeIndex(newNode, index)

        Catch ex As Exception
            MsgBox("提示", MsgBoxStyle.OkOnly, "InsertChildNode")
        End Try

        Return newNode

    End Function

    ''' <summary>
    ''' 在TreeList的TreeNode节点下,插入子级
    ''' </summary>
    ''' <param name="treelist">要插入节点TreeList控件</param>
    ''' <param name="treeNode">要插入节点TreeNode对象</param>
    ''' <param name="index">要插入节点索引</param>
    ''' <returns>插入后的节点</returns>
    ''' <remarks>zengjiangyou</remarks>
    Public Shared Function InsertChildNode(ByRef treelist As DevExpress.XtraTreeList.TreeList, _
                                           ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode, _
                                           ByRef index As Integer, _
                                           ByRef bindObject As Object) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing
        Dim intNodeIndex As Integer = 0

        Try
            If Not treeNode Is Nothing Then
                '添加最顶级节点
                newNode = treelist.AppendNode(Nothing, treeNode)

                treeNode.Expanded = True

                If Not index > treeNode.Nodes.Count Then
                    intNodeIndex = treelist.GetNodeIndex(treeNode.Nodes(index))
                    '将新节点调整到指定位置
                    treelist.SetNodeIndex(newNode, intNodeIndex)
                End If
            Else
                '添加最顶级节点()
                newNode = treelist.AppendNode(Nothing, treeNode)

                '将新节点调整到指定位置
                If index <= treelist.Nodes.Count Then
                    treelist.SetNodeIndex(newNode, index)
                End If

            End If

            Return newNode

        Catch ex As Exception
            MsgBox("提示", MsgBoxStyle.OkOnly, "InsertChildNode")
        End Try

        Return newNode

    End Function

    ''' <summary>
    ''' 在TreeList的TreeNode节点下,插入子级
    ''' </summary>
    ''' <param name="treelist">要插入节点TreeList控件</param>
    ''' <param name="treeNode">要插入节点TreeNode对象</param>
    ''' <returns>插入后的节点</returns>
    ''' <remarks>zengjiangyou</remarks>
    Public Shared Function InsertChildNode(ByVal treelist As DevExpress.XtraTreeList.TreeList, _
                                           ByVal treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode) As TreeListNode

        '定义当前要添加的新节点
        Dim newNode As TreeListNode = Nothing

        Try
            If Not treeNode Is Nothing Then
                '添加最顶级节点
                newNode = treelist.AppendNode(Nothing, treeNode)
            End If

        Catch ex As Exception
            MsgBox("提示", MsgBoxStyle.OkOnly, "InsertChildNode")
        End Try

        Return newNode

    End Function

    ''' <summary>
    ''' 将Node插入到指定节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <param name="index">树控件索引</param>
    ''' <param name="newNode">Node对象</param>
    ''' <returns>插入Node对象</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function InsertNode(ByVal treelist As DevExpress.XtraTreeList.TreeList, _
                                      ByVal index As Integer, ByRef newNode As TreeListNode) As TreeListNode

        '定义当前要添加的新节点
        Dim CurNewNode As TreeListNode = Nothing
        '定义当前新节点的父级节点
        Dim ParentNode As TreeListNode = Nothing

        Try

            If Not treelist.FocusedNode Is Nothing Then
                ParentNode = treelist.FocusedNode.ParentNode
                '添加最顶级节点
                CurNewNode = treelist.AppendNode(Nothing, ParentNode)
                '将新节点调整到指定位置
                treelist.SetNodeIndex(CurNewNode, index)

                '将指定节点插入
                CurNewNode = newNode
            End If

        Catch ex As Exception

        End Try

        Return newNode

    End Function
#End Region

#Region "删除节点"
    ''' <summary>
    ''' 删除单个节点
    ''' </summary>
    ''' <param name="treelist">树目录控件</param>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub DeleteNode(ByVal treelist As DevExpress.XtraTreeList.TreeList)
        If Not treelist.FocusedNode Is Nothing Then
            treelist.DeleteNode(treelist.FocusedNode)
        End If
    End Sub

    ''' <summary>
    ''' 删除指定节点
    ''' </summary>
    ''' <param name="treelist">树目录控件</param>
    ''' <param name="treeNode">树节点</param>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub DeleteNode(ByRef treelist As DevExpress.XtraTreeList.TreeList, _
                                 ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode)

        If Not treeNode Is Nothing Then
            '思路:先删除子节点,然后再删除父级节点
            'For Each node As DevExpress.XtraTreeList.Nodes.TreeListNode In treeNode.Nodes
            '    'treeNode.Nodes.Remove(node)
            '    treelist.DeleteNode(node)
            'Next

            '将要删除的节点设置为不可见
            '

            '先去掉孩子节点,然后在删除节点
            Call CollapseChildNode(treeNode)
            If Not treeNode.ParentNode Is Nothing Then
                treeNode.Visible = False
                'If treeNode.ParentNode.Nodes.Count = 1 Then
                '    'treelist.IsUnboundMode
                '    'treeNode.ParentNode.Nodes.RemoveAt(0)
                'End If
            End If
            treelist.DeleteNode(treeNode)
        End If

    End Sub

    ''' <summary>
    ''' 收缩孩子节点
    ''' </summary>
    ''' <param name="treeNode">树节点</param>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub CollapseChildNode(ByRef treeNode As DevExpress.XtraTreeList.Nodes.TreeListNode)

        If Not treeNode Is Nothing Then
            'treeNode.Expanded = False
            treeNode.HasChildren = False
        End If

        For Each CurNode As Nodes.TreeListNode In treeNode.Nodes
            Call CollapseChildNode(CurNode)
        Next
    End Sub
    ''' <summary>
    ''' 删除当前节点的所有子节点
    ''' </summary>
    ''' <param name="treelist">目录树</param>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub DeleteAllChildNode(ByVal treelist As DevExpress.XtraTreeList.TreeList)

        Dim CurFocuseNode As TreeListNode = treelist.FocusedNode
        Dim intCount As Integer = 0
        Dim i As Integer

        If Not CurFocuseNode Is Nothing Then
            If CurFocuseNode.HasChildren Then
                '循环删除当前节点的子节点
                intCount = CurFocuseNode.Nodes.Count

                For i = intCount - 1 To 0 Step -1
                    treelist.DeleteNode(CurFocuseNode.Nodes(i))
                Next
            End If
        End If

    End Sub

    ''' <summary>
    ''' 删除选中节点
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub DeleteSelectionNode(ByVal treelist As DevExpress.XtraTreeList.TreeList)
        If treelist.Selection.Count > 0 Then
            treelist.DeleteSelectedNodes()
        End If
    End Sub
#End Region

#Region "节点移动"

    ''' <summary>
    ''' 节点上移
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <param name="index">移动节点位置</param>
    ''' <returns>移动后节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function MoveUp(ByVal treelist As DevExpress.XtraTreeList.TreeList, ByVal index As Integer) As TreeListNode
        Return Nothing

    End Function

    ''' <summary>
    ''' 节点上移
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>移动后节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function MoveUp(ByRef treelist As DevExpress.XtraTreeList.TreeList) As TreeListNode
        '定义焦点行节点
        Dim CurFocuseNode As TreeListNode = Nothing
        Dim CurPreNode As TreeListNode = Nothing

        Try
            CurFocuseNode = treelist.FocusedNode

            If Not CurFocuseNode Is Nothing Then
                CurPreNode = CurFocuseNode.PrevNode

                If Not CurPreNode Is Nothing Then

                    '将新节点调整到指定位置
                    treelist.SetNodeIndex(CurFocuseNode, treelist.GetNodeIndex(CurPreNode))
                End If

            End If

        Catch ex As Exception

        End Try

        Return CurFocuseNode

    End Function

    ''' <summary>
    ''' 节点下移
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>移动后节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function MoveDown(ByVal treelist As DevExpress.XtraTreeList.TreeList) As TreeListNode
        '定义焦点行节点
        Dim CurFocuseNode As TreeListNode = Nothing
        Dim CurNextNode As TreeListNode = Nothing

        Try
            CurFocuseNode = treelist.FocusedNode

            If Not CurFocuseNode Is Nothing Then
                CurNextNode = CurFocuseNode.NextNode

                If Not CurNextNode Is Nothing Then

                    '将新节点调整到指定位置
                    treelist.SetNodeIndex(CurFocuseNode, treelist.GetNodeIndex(CurNextNode))
                End If

            End If
        Catch ex As Exception

        End Try

        Return CurFocuseNode

    End Function

    ''' <summary>
    ''' 节点左移(删除前先对对象进行操作,防止对象被修改(通过虚拟加载的节点,删除时候对象会被删除))
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>移动后节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Function MoveLeft(ByVal treelist As DevExpress.XtraTreeList.TreeList) As TreeListNode

        Dim CurFocuseNode As TreeListNode = treelist.FocusedNode
        Dim CurFocuseCloneNode As TreeListNode = treelist.FocusedNode.Clone
        Dim CurParentNode As TreeListNode = Nothing
        Dim CurNewNode As TreeListNode = Nothing

        Try

            If Not CurFocuseNode Is Nothing Then
                CurParentNode = treelist.FocusedNode.ParentNode.ParentNode

                Dim CurObject As ClsDataQuantity = CurFocuseNode.GetValue("DataObject")
                Dim CurIndex As Integer = XtrasTreeList.GetNodeIndexInParentNode(treelist, treelist.FocusedNode.ParentNode)

                '删除节点
                Call XtrasTreeList.DeleteNode(treelist, CurFocuseNode)
                '添加节点
                'CurNewNode = CommQuantityEdit.LoadOneCataLog(treelist, CurParentNode, CurObject, CurIndex + 1)
                '设置焦点
                Call XtrasTreeList.SetFouceNode(treelist, CurNewNode)

            End If

        Catch ex As Exception
            'debug.print("MoveLeft")
        End Try

        Return CurParentNode
    End Function

    ''' <summary>
    ''' 节点左移(先删除节点,然后插入当前节点的前一个节点 ,先操作对象然后 执行此操作)
    ''' </summary>
    ''' <param name="treelist">树控件</param>
    ''' <returns>移动后节点</returns>
    ''' <remarks>zengjiangyou 20091012</remarks>
    Public Shared Sub MoveRight(ByVal treelist As DevExpress.XtraTreeList.TreeList)

        Dim CurFocuseNode As TreeListNode = treelist.FocusedNode
        Dim CurParentNode As TreeListNode = Nothing
        Dim CurNewNode As TreeListNode = Nothing

        Try
            If Not CurFocuseNode Is Nothing Then
                Dim CurObject As ClsDataQuantity = CurFocuseNode.GetValue("DataObject")

                CurParentNode = treelist.FocusedNode.PrevNode
                '删除节点
                Call XtrasTreeList.DeleteNode(treelist, CurFocuseNode)
                '添加节点
                'CurNewNode = CommQuantityEdit.LoadOneCataLog(treelist, CurParentNode, CurObject, CurParentNode.Nodes.Count)
                '设置焦点
                Call XtrasTreeList.SetFouceNode(treelist, CurNewNode)

            End If

        Catch ex As Exception
            'debug.print("MoveLeft")
        End Try

        '这种可能存在对象被串改问题
        'If Not treelist.FocusedNode Is Nothing Then
        '    treelist.MoveNode(treelist.FocusedNode, treelist.FocusedNode.PrevNode)
        'End If

        'Return treelist.FocusedNode

    End Sub

#End Region

    ''' <summary>
    ''' 移动到下一个节点
    ''' </summary>
    ''' <param name="treeList">树控件</param>
    ''' <remarks></remarks>
    Public Shared Sub ShowNextNode(ByVal treeList As DevExpress.XtraTreeList.TreeList)
        If treeList.FocusedNode Is Nothing Then
            Exit Sub
        End If

        Dim NextNode As DevExpress.XtraTreeList.Nodes.TreeListNode = TreeList.FocusedNode.NextNode

        If Not NextNode Is Nothing Then
            XtrasTreeList.SetFouceNode(treeList, NextNode)
        End If
    End Sub

    ''' <summary>
    ''' 移动到下上一个节点
    ''' </summary>
    ''' <param name="treeList"></param>
    ''' <remarks></remarks>
    Public Shared Sub ShowPreNode(ByVal treeList As DevExpress.XtraTreeList.TreeList)
        If treeList.FocusedNode Is Nothing Then
            Exit Sub
        End If

        Dim PreNode As DevExpress.XtraTreeList.Nodes.TreeListNode = treeList.FocusedNode.PrevNode

        If Not PreNode Is Nothing Then
            XtrasTreeList.SetFouceNode(treeList, PreNode)
        End If
    End Sub

#End Region

End Class


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值