Monorepo/GUIs.ClientSuite/FormUserManager/UserControlAssignment.vb
2019-04-15 14:30:00 +02:00

206 lines
8.5 KiB
VB.net

Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Views.Grid
Imports DigitalData.GUIs.ClientSuite.ClassLayout
Public Class UserControlAssignment
Private _DragDropManager As ClassDragDrop
Private _ParentIdColumn As String
Private _ChildIdColumn As String
Private _ParentList As DataTable
Private _ChildList As DataTable
Private _AssignmentList As DataTable
Private _ParentRecordId As Integer
Public Property TextParentList As String
Public Property TextAssignedToParent As String
Public Property TextNotAssignedToParent As String
Public Event ChildRemoved(ParentId As Integer, ChildId As Integer, RelationRecordId As Integer)
Public Event ChildAdded(ParentId As Integer, ChildId As Integer, RelationRecordId As Integer)
Private Sub UserControlAssignment_Load(sender As Object, e As EventArgs) Handles Me.Load
_DragDropManager = New ClassDragDrop()
_DragDropManager.AddGridView(ViewAssignedToParent)
_DragDropManager.AddGridView(ViewNotAssignedToParent)
' Load text customizations
labelAssignedToParent.Text = TextAssignedToParent
labelNotAssignedToParent.Text = TextNotAssignedToParent
labelParentList.Text = TextParentList
' Load grid customizations
Dim oGridPatcher = New ClassControlPatcher(Of GridControl)(Me)
oGridPatcher.
ProcessContainer(AddressOf GridControlDefaults.DefaultGridSettings).
ProcessContainer(AddressOf GridControlDefaults.ReadOnlyGridSettings).
ProcessControl(AddressOf GridControlDefaults.CheckboxSelectGridSettings, GridNotAssignedToParent).
ProcessControl(AddressOf GridControlDefaults.CheckboxSelectGridSettings, GridAssignedToParent)
' Load view layouts
Try
Dim ViewParentListPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewParentList.Name)
Dim ViewAssignedPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewAssignedToParent.Name)
Dim ViewNotAssignedPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewNotAssignedToParent.Name)
If IO.File.Exists(ViewParentListPath) Then
ViewParentList.RestoreLayoutFromXml(ViewParentListPath)
End If
If IO.File.Exists(ViewAssignedPath) Then
ViewAssignedToParent.RestoreLayoutFromXml(ViewAssignedPath)
End If
If IO.File.Exists(ViewNotAssignedPath) Then
ViewNotAssignedToParent.RestoreLayoutFromXml(ViewNotAssignedPath)
End If
Catch ex As Exception
End Try
End Sub
Private Function MaybeCopyToDataTable(RowCollection As EnumerableRowCollection(Of DataRow)) As DataTable
If RowCollection.Count > 0 Then
Return RowCollection.CopyToDataTable()
Else
Return New DataTable()
End If
End Function
Public Sub Init(ParentList As DataTable, ChildrenList As DataTable, AssignmentList As DataTable, ParentIdColumn As String, ChildIdColumn As String)
_ParentList = ParentList
_ChildList = ChildrenList
_AssignmentList = AssignmentList
_ParentIdColumn = ParentIdColumn
_ChildIdColumn = ChildIdColumn
' This will trigger FocusedRowChanged, needs to be last!!
GridParentList.DataSource = ParentList
End Sub
Public Sub UpdateData(ParentList As DataTable, ChildrenList As DataTable, AssignmentList As DataTable)
_ParentList = ParentList
_ChildList = ChildrenList
_AssignmentList = AssignmentList
Dim oFocusedParentRow = ViewParentList.FocusedRowHandle
ViewParentList.BeginDataUpdate()
GridParentList.DataSource = ParentList
ViewParentList.EndDataUpdate()
ViewParentList.FocusedRowHandle = oFocusedParentRow
End Sub
Private Function GetIdsFromDataRows(Rows As List(Of DataRow)) As List(Of Integer)
Dim oIds As New List(Of Integer)
For Each oRow As DataRow In Rows
oIds.Add(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN))
Next
Return oIds
End Function
Private Function GetModifiedRows(Grid As GridControl, Data As IDataObject) As List(Of DataRow)
Dim oTable As DataTable = Grid.DataSource
Dim oModifiedRows As New List(Of DataRow)
Dim oPrimaryKeys As New List(Of Integer)
For Each oRow As DataRow In oTable.Rows
oPrimaryKeys.Add(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN))
Next
If Data.GetDataPresent(GetType(GridView)) Then
Dim oView As GridView = Data.GetData(GetType(GridView))
Dim oSelectedRows() As Integer = oView.GetSelectedRows()
If oSelectedRows.Length = 0 Then
Return oModifiedRows
End If
' Die ausgewählten Rows auslesen und gridUsersAssigned hinzufügen
For Each oRowIndex As Integer In oView.GetSelectedRows()
Dim oRowView As DataRowView = oView.GetRow(oRowIndex)
Dim oRow As DataRow = oRowView.Row
If Not oPrimaryKeys.Contains(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN)) Then
oModifiedRows.Add(oRow)
End If
Next
ElseIf Data.GetDataPresent(GetType(DataRow)) Then
Dim oRow As DataRow = Data.GetData(GetType(DataRow))
If Not oPrimaryKeys.Contains(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN)) Then
oModifiedRows.Add(oRow)
End If
End If
Return oModifiedRows
End Function
Private Function GetAssignmentRecord(ParentId As Integer, ChildId As Integer)
Dim oRows = _AssignmentList.Select($"{_ParentIdColumn} = {ParentId} And {_ChildIdColumn} = {ChildId}").ToList()
If oRows.Count = 0 Then
Return Nothing
Else
Return oRows.First().Item(ClassConstants.ATTRIBUTE_ID_COLUMN)
End If
End Function
Private Sub GridNotAssignedToParent_DragDrop(sender As Object, e As DragEventArgs) Handles GridNotAssignedToParent.DragDrop
Dim oGrid As GridControl = sender
Dim oChildIds = GetIdsFromDataRows(GetModifiedRows(oGrid, e.Data))
For Each oChildId In oChildIds
Dim oRelationRecordId = GetAssignmentRecord(_ParentRecordId, oChildId)
RaiseEvent ChildRemoved(_ParentRecordId, oChildId, oRelationRecordId)
Next
End Sub
Private Sub GridAssignedToParent_DragDrop(sender As Object, e As DragEventArgs) Handles GridAssignedToParent.DragDrop
Dim oGrid As GridControl = sender
Dim oChildIds = GetIdsFromDataRows(GetModifiedRows(oGrid, e.Data))
For Each oChildId In oChildIds
Dim oRelationRecordId = GetAssignmentRecord(_ParentRecordId, oChildId)
RaiseEvent ChildAdded(_ParentRecordId, oChildId, oRelationRecordId)
Next
End Sub
Private Sub ViewParentList_FocusedRowObjectChanged(sender As Object, e As FocusedRowObjectChangedEventArgs) Handles ViewParentList.FocusedRowObjectChanged
Dim oRowHandle = e.FocusedRowHandle
_ParentRecordId = ViewParentList.GetRowCellValue(oRowHandle, ClassConstants.ATTRIBUTE_ID_COLUMN)
Dim oAssignedChildIds = From oRow In _AssignmentList.AsEnumerable()
Where oRow.Item(_ParentIdColumn) = _ParentRecordId
Select oRow.Item(_ChildIdColumn)
If _ChildList Is Nothing Then
Exit Sub
End If
Dim oAssignedChildren As EnumerableRowCollection(Of DataRow) = From oRow In _ChildList.AsEnumerable()
Where oAssignedChildIds.Contains(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN))
Dim oNotAssignedChildren As EnumerableRowCollection(Of DataRow) = From oRow In _ChildList.AsEnumerable()
Where Not oAssignedChildIds.Contains(oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN)) And oRow.Item(ClassConstants.ATTRIBUTE_ID_COLUMN) <> _ParentRecordId
GridAssignedToParent.DataSource = MaybeCopyToDataTable(oAssignedChildren)
GridNotAssignedToParent.DataSource = MaybeCopyToDataTable(oNotAssignedChildren)
End Sub
Private Sub View_LayoutChanged(sender As Object, e As EventArgs) Handles ViewNotAssignedToParent.Layout, ViewAssignedToParent.Layout, ViewParentList.Layout
Dim oView As BaseView = sender
Dim oLayoutPath = GetLayoutPath(GroupName.LayoutUserManager, Name, oView.Name)
oView.SaveLayoutToXml(oLayoutPath)
End Sub
End Class