Jonathan Jenne 3675e83102 push
2023-12-06 11:58:15 +01:00

215 lines
6.8 KiB
VB.net

Option Strict On
Imports System.Collections
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraGrid.Views.Grid
Public Class RefreshHelper
<Serializable>
Public Structure RowInfo
Public Id As Object
Public level As Integer
End Structure
Private ReadOnly view As GridView
Private ReadOnly keyFieldName As String
Private _saveExpList As ArrayList
Private _saveSelList As ArrayList
Private _saveMasterRowsList As ArrayList
Private visibleRowIndex As Integer = -1
Public Sub New(ByVal view As GridView, ByVal keyFieldName As String)
Me.view = view
Me.keyFieldName = keyFieldName
End Sub
Public ReadOnly Property SaveExpList As ArrayList
Get
If _saveExpList Is Nothing Then
_saveExpList = New ArrayList()
End If
Return _saveExpList
End Get
End Property
Public ReadOnly Property SaveSelList As ArrayList
Get
If _saveSelList Is Nothing Then
_saveSelList = New ArrayList()
End If
Return _saveSelList
End Get
End Property
Public ReadOnly Property SaveMasterRowsList As ArrayList
Get
If _saveMasterRowsList Is Nothing Then
_saveMasterRowsList = New ArrayList()
End If
Return _saveMasterRowsList
End Get
End Property
Protected Function FindParentRowHandle(ByVal rowInfo As RowInfo, ByVal rowHandle As Integer) As Integer
Dim result As Integer = view.GetParentRowHandle(rowHandle)
While view.GetRowLevel(result) <> rowInfo.level
result = view.GetParentRowHandle(result)
End While
Return result
End Function
Protected Sub ExpandRowByRowInfo(ByVal rowInfo As RowInfo)
Dim dataRowHandle As Integer = view.LocateByValue(0, view.Columns(keyFieldName), rowInfo.Id)
If dataRowHandle <> GridControl.InvalidRowHandle Then
Dim parentRowHandle As Integer = FindParentRowHandle(rowInfo, dataRowHandle)
view.SetRowExpanded(parentRowHandle, True, False)
End If
End Sub
Protected Function GetRowHandleToSelect(ByVal rowInfo As RowInfo) As Integer
Dim dataRowHandle As Integer = view.LocateByValue(0, view.Columns(keyFieldName), rowInfo.Id)
If dataRowHandle <> GridControl.InvalidRowHandle Then
If view.GetRowLevel(dataRowHandle) <> rowInfo.level Then Return FindParentRowHandle(rowInfo, dataRowHandle)
End If
Return dataRowHandle
End Function
Protected Sub SelectRowByRowInfo(ByVal rowInfo As RowInfo, ByVal isFocused As Boolean)
If isFocused Then
view.FocusedRowHandle = GetRowHandleToSelect(rowInfo)
Else
view.SelectRow(GetRowHandleToSelect(rowInfo))
End If
End Sub
Public Sub SaveSelectionViewInfo(ByVal list As ArrayList)
list.Clear()
Dim column As GridColumn = view.Columns(keyFieldName)
Dim rowInfo As RowInfo
Dim selectionArray As Integer() = view.GetSelectedRows()
If selectionArray IsNot Nothing Then
For i As Integer = 0 To selectionArray.Length - 1
Dim dataRowHandle As Integer = selectionArray(i)
rowInfo.level = view.GetRowLevel(dataRowHandle)
If dataRowHandle < 0 Then dataRowHandle = view.GetDataRowHandleByGroupRowHandle(dataRowHandle)
rowInfo.Id = view.GetRowCellValue(dataRowHandle, column)
list.Add(rowInfo)
Next
End If
rowInfo.Id = view.GetRowCellValue(view.FocusedRowHandle, column)
rowInfo.level = view.GetRowLevel(view.FocusedRowHandle)
list.Add(rowInfo)
End Sub
Public Sub SaveExpansionViewInfo(ByVal list As ArrayList)
If view.GroupedColumns.Count = 0 Then Return
list.Clear()
Dim column As GridColumn = view.Columns(keyFieldName)
For i As Integer = -1 To Integer.MinValue + 1
If Not view.IsValidRowHandle(i) Then Exit For
If view.GetRowExpanded(i) Then
Dim rowInfo As RowInfo
Dim dataRowHandle As Integer = view.GetDataRowHandleByGroupRowHandle(i)
rowInfo.Id = view.GetRowCellValue(dataRowHandle, column)
rowInfo.level = view.GetRowLevel(i)
list.Add(rowInfo)
End If
Next
End Sub
Public Sub SaveExpandedMasterRows(ByVal list As ArrayList)
If view.GridControl.Views.Count = 1 Then Return
list.Clear()
Dim column As GridColumn = view.Columns(keyFieldName)
For i As Integer = 0 To view.DataRowCount - 1
If view.GetMasterRowExpanded(i) Then list.Add(view.GetRowCellValue(i, column))
Next
End Sub
Public Sub SaveVisibleIndex()
visibleRowIndex = view.GetVisibleIndex(view.FocusedRowHandle) - view.TopRowIndex
End Sub
Public Sub LoadVisibleIndex()
If visibleRowIndex = GridControl.InvalidRowHandle Then
Exit Sub
End If
view.MakeRowVisible(view.FocusedRowHandle, True)
view.TopRowIndex = view.GetVisibleIndex(view.FocusedRowHandle) - visibleRowIndex
End Sub
Public Sub LoadSelectionViewInfo(ByVal list As ArrayList)
view.BeginSelection()
Try
view.ClearSelection()
For i As Integer = 0 To list.Count - 1
SelectRowByRowInfo(CType(list(i), RowInfo), i = list.Count - 1)
Next
Finally
view.EndSelection()
End Try
End Sub
Public Sub LoadExpansionViewInfo(ByVal list As ArrayList)
If view.GroupedColumns.Count = 0 Then Return
view.BeginUpdate()
Try
view.CollapseAllGroups()
For Each info As RowInfo In list
ExpandRowByRowInfo(info)
Next
Finally
view.EndUpdate()
End Try
End Sub
Public Sub LoadExpandedMasterRows(ByVal list As ArrayList)
view.BeginUpdate()
Try
view.CollapseAllDetails()
Dim column As GridColumn = view.Columns(keyFieldName)
For i As Integer = 0 To list.Count - 1
Dim rowHandle As Integer = view.LocateByValue(0, column, list(i))
view.SetMasterRowExpanded(rowHandle, True)
Next
Finally
view.EndUpdate()
End Try
End Sub
Public Sub SaveViewInfo()
SaveExpandedMasterRows(SaveMasterRowsList)
SaveExpansionViewInfo(SaveExpList)
SaveSelectionViewInfo(SaveSelList)
SaveVisibleIndex()
End Sub
Public Sub LoadViewInfo()
LoadExpandedMasterRows(SaveMasterRowsList)
LoadExpansionViewInfo(SaveExpList)
LoadSelectionViewInfo(SaveSelList)
LoadVisibleIndex()
End Sub
End Class