From 98bc06535fc2638752977d3c4e4a0eed152e1a98 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 13 Jul 2018 14:52:17 +0200 Subject: [PATCH] jj: refetch checked values for checkable grid when filter is cleared. don't act on refresh in onSelectionChange. --- .../ClassControlBuilder.vb | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/app/DD-Record-Organizer/ClassControlBuilder.vb b/app/DD-Record-Organizer/ClassControlBuilder.vb index 805cd0c..4a125d3 100644 --- a/app/DD-Record-Organizer/ClassControlBuilder.vb +++ b/app/DD-Record-Organizer/ClassControlBuilder.vb @@ -1,5 +1,7 @@ Imports System.Windows.Forms Imports System.Text.RegularExpressions +Imports DevExpress.XtraGrid +Imports DevExpress.XtraGrid.Views.Grid Public Class ClassControlBuilder Private _master_panel As Panel @@ -496,8 +498,8 @@ Public Class ClassControlBuilder ' Hier werden nun evtl schon gesetzte Werte für CheckedListBox angehakt ' Wert per LINQ aus DT_ControlValues suchen der zur aktuellen controlId passt Dim values As List(Of Object) = (From row1 In CURRENT_CONTROL_VALUES.AsEnumerable() - Where row1.Item("CONTROL_ID") = dependingControlId - Select row1.Item("VALUE")).ToList() + Where row1.Item("CONTROL_ID") = dependingControlId + Select row1.Item("VALUE")).ToList() ControlLoader.CheckedListBox.LoadValue(checkedlistbox, values) If IsEdit Or IsInsert Then @@ -555,8 +557,8 @@ Public Class ClassControlBuilder ControlLoader.DataGridViewCheckable.SetDataSource(gridControl, dt) Dim values As List(Of Object) = (From row1 In CURRENT_CONTROL_VALUES.AsEnumerable() - Where row1.Item("CONTROL_ID") = dependingControlId - Select row1.Item("VALUE")).ToList() + Where row1.Item("CONTROL_ID") = dependingControlId + Select row1.Item("VALUE")).ToList() ControlLoader.DataGridViewCheckable.LoadValue(gridControl, values) End Select @@ -746,8 +748,8 @@ Public Class ClassControlBuilder Me.ControlsChanged.Remove(controlId) Dim loadedValues As List(Of Object) = (From row In CURRENT_CONTROL_VALUES.AsEnumerable() - Where row.Item("CONTROL_ID") = controlId - Select row.Item("VALUE")).ToList() + Where row.Item("CONTROL_ID") = controlId + Select row.Item("VALUE")).ToList() ClassControlValues.LoadControlValue(CURRENT_RECORD_ID, CURRENT_PARENT_RECORD_ID, CONTROL_ID, control, loadedValues, CURRENT_ENTITY_ID) RECORD_CHANGED = False @@ -765,7 +767,7 @@ Public Class ClassControlBuilder ' CtrlCommandUI.SaveRecord(0, CURRENT_ENTITY_ID, CURRENT_PARENT_ID) 'End If - Dim CONTROL_VALUE As String = ClassControlCommandsUI.GetControlValue(control) + Dim CONTROL_VALUE As String = ClassControlCommandsUI.GetControlValue(control) If CURRENT_CONTROL_VALUE_COUNT > 3 Then @@ -808,6 +810,9 @@ Public Class ClassControlBuilder Public Sub OnCheckedChanged(sender As Object, ByVal e As DevExpress.Data.SelectionChangedEventArgs) If CURRENT_RECORD_ENABLED = False Then Exit Sub If IsCancelCheck = True Then Exit Sub + ' Wenn die aktion nicht Add oder Remove ist, wurde auch keine Checkbox angeklickt + ' Dann auch nicht updaten + If e.Action = System.ComponentModel.CollectionChangeAction.Refresh Then Exit Sub Try Dim GridView As DevExpress.XtraGrid.Views.Grid.GridView = sender @@ -891,6 +896,36 @@ Public Class ClassControlBuilder End If End Try End Sub + + Public Sub OnFilterChanged(sender As Object, e As EventArgs) + Dim gridView As GridView = sender + Dim filter = gridView.ActiveFilter + Dim controlId As Integer = DirectCast(gridView.GridControl.Tag, ClassControlMetadata).Id + Dim recordId As Integer = CURRENT_RECORD_ID + + ' Wenn der Filter geleert wurde, Infos über die angehakten Zeilen aus der Datenbank holen + If filter.IsEmpty Then + Try + Dim sql As String = $"SELECT VALUE FROM TBPMO_CONTROL_VALUE WHERE CONTROL_ID = {controlId} AND RECORD_ID = {recordId}" + Dim dt As DataTable = ClassDatabase.Return_Datatable(sql) + Dim values As New List(Of Object) + + For Each row As DataRow In dt.Rows + values.Add(row.Item(0)) + Next + + ' Verhindern, dass OnSelectionChanged ausgelöst wird + IsCancelCheck = True + ' Jetzt die Werte neu setzen, d.h. die angehakten Zeilen setzen + ControlLoader.DataGridViewCheckable.LoadValue(gridView.GridControl, values) + IsCancelCheck = False + Catch ex As Exception + ClassLogger.Add("Error in OnFilterChanged: " & ex.Message) + End Try + End If + End Sub + + Public Sub CheckBoxChanged(sender As Object, ByVal e As EventArgs) If CURRENT_RECORD_ENABLED = False Then Exit Sub @@ -1047,15 +1082,11 @@ Public Class ClassControlBuilder AddHandler gridview.SelectionChanged, AddressOf RecordChanged AddHandler gridview.SelectionChanged, AddressOf OnCheckedChanged - AddHandler gridview.CustomDrawColumnHeader, AddressOf OnDrawColumnHeader + AddHandler gridview.ColumnFilterChanged, AddressOf OnFilterChanged + End Select End Sub - Private Sub OnDrawColumnHeader(sender As Object, e As DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs) - Console.WriteLine() - End Sub - - Private Sub SetDragDropHandler(groupbox As GroupBox) If Not IsNothing(_group_box_drag_drop_handler) Then AddHandler groupbox.DragDrop, Me._group_box_drag_drop_handler @@ -1100,7 +1131,7 @@ Public Class ClassControlBuilder If dialog.ShowDialog() = DialogResult.OK Then pb.BackgroundImageLayout = ImageLayout.Zoom - pb.BackgroundImage = CType(Drawing.Image.FromFile(dialog.FileName, True), Bitmap) + pb.BackgroundImage = CType(System.Drawing.Image.FromFile(dialog.FileName, True), Bitmap) End If End Sub