Verbesserung von Validierungen und State-Management

Die Änderungen umfassen:
- Hinzufügen der Methode `Reset_Current` in `frmMain` zur zentralisierten Rücksetzung von Zuständen.
- Erweiterung von `Item_Scope` mit Validierungen für ungültige Klicks und Fallback-Logik bei DevExpress-Bugs.
- Verbesserte Fehlerbehandlung und Validierungen im `DoubleClick`- und `MouseDown`-Handler.
- Einführung der Methode `ParseColorString` zur sicheren Verarbeitung von Farbwerten.
- Optimierung von `TreeList_Cockpit_DoubleClick` mit Debugging-Logs und State-Reset.
- Hinzufügen von State-Reset-Logik in `frmValidator` (`previousLUSelectedValues`, `hadPreviousLUSelection`).
- Verbesserte Sicherung und Wiederherstellung von Lookup-Werten in `FillIndexValues`.
- SQL-Optimierung: Löschen von Einträgen in `TBTF_PROFILE_FILES_WORK`.
- Erweiterte Debugging-Informationen und Fehlerbehandlung in mehreren Methoden.
This commit is contained in:
Developer01
2026-08-11 14:53:26 +02:00
parent 4609ea8ad7
commit de4f348be5
2 changed files with 174 additions and 48 deletions

View File

@@ -2492,6 +2492,14 @@ Public Class frmMain
End If
End Try
End Sub
Private Sub Reset_Current()
CURRENT_JUMP_DOC_GUID = 0
CURRENT_DOC_GUID = 0
CURRENT_DOC_ID = 0
CURRENT_ProfilGUID = 0
CURRENT_CLICKED_PROFILE_ID = 0
DT_CURR_WF_ITEMS.Clear()
End Sub
Private Async Function Item_Scope(startedFrom As String) As Task
' ========== FRÜHE VALIDIERUNGEN (VOR UI-ÄNDERUNGEN) ==========
If Application.OpenForms().OfType(Of frmValidator).Any Then
@@ -2514,16 +2522,33 @@ Public Class frmMain
Try
LOGGER.Info("Starting Profile Loading")
Reset_Current()
' ========== UI-VORBEREITUNG ==========
Me.UseWaitCursor = True
useWaitCursorApplied = True
bsiMessage.Caption = "Processing selection..."
messageApplied = True
' ========== HITINFO NUR EINMAL BERECHNEN ==========
Dim hitInfo As GridHitInfo = GridViewWorkflows.CalcHitInfo(GridCursorLocation)
' ===== FRÜHE VALIDIERUNG: UNGÜLTIGE ROWHANDLES ABFANGEN =====
If hitInfo.RowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle Then
LOGGER.Warn($"⚠️ Item_Scope: InvalidRowHandle detected (click on empty grid area?) - exiting")
Exit Function
End If
' ===== ZUSÄTZLICH: Prüfen ob überhaupt eine Zeile getroffen wurde =====
If Not hitInfo.InRow Then
LOGGER.Warn($"⚠️ Item_Scope: Click not in any row (HitTest:[{hitInfo.HitTest}]) - exiting")
Exit Function
End If
' ===== STARTEDROM NORMALISIEREN =====
If startedFrom = "DOUBLECLICK" Then
startedFrom = If(hitInfo.InGroupRow, "CMGROUP", "CMROW")
LOGGER.Debug($"User clicked {If(hitInfo.InGroupRow, "group", "normal")} row.")
End If
' ========== STARTEDROM NORMALISIEREN ==========
If startedFrom = "DOUBLECLICK" Then
startedFrom = If(hitInfo.InGroupRow, "CMGROUP", "CMROW")
@@ -2531,21 +2556,56 @@ Public Class frmMain
End If
' ========== PROFIL-ID ERMITTELN (OPTIMIERT) ==========
' ========== PROFIL-ID ERMITTELN (MIT FALLBACK-LOGIK) ==========
Dim oHitProfilID As Object = Nothing
' ===== SCHRITT 1: Direkte Erkennung versuchen =====
If hitInfo.InGroupRow Then
' ✅ Gruppenkopf: Profil-ID aus erster Datenzeile der Gruppe
oHitProfilID = GridViewWorkflows.GetRowCellValue(
GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hitInfo.RowHandle),
GridViewWorkflows.Columns("PROFILE_ID"))
LOGGER.Debug("Clicked on Group Row")
ElseIf hitInfo.InDataRow Then
' ✅ Normale Datenzeile: Profil-ID direkt aus dieser Zeile
oHitProfilID = GridViewWorkflows.GetRowCellValue(
GridViewWorkflows.GetDataRowHandleByGroupRowHandle(
GridViewWorkflows.GetParentRowHandle(hitInfo.RowHandle)),
hitInfo.RowHandle,
GridViewWorkflows.Columns("PROFILE_ID"))
LOGGER.Debug("Clicked on Data Row")
Else
' ===== SCHRITT 2: FALLBACK für "unklare" Klicks =====
' Wenn hitInfo weder InGroupRow noch InDataRow ist, RowHandle direkt prüfen
LOGGER.Warn($"⚠️ hitInfo ist WEDER InGroupRow noch InDataRow - RowHandle:[{hitInfo.RowHandle}]")
If GridViewWorkflows.IsGroupRow(hitInfo.RowHandle) Then
' Es ist doch eine Gruppe (DevExpress Bug-Workaround)
LOGGER.Debug("Fallback: IsGroupRow(RowHandle) = True")
oHitProfilID = GridViewWorkflows.GetRowCellValue(
GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hitInfo.RowHandle),
GridViewWorkflows.Columns("PROFILE_ID"))
ElseIf GridViewWorkflows.IsDataRow(hitInfo.RowHandle) Then
' Es ist doch eine Datenzeile (DevExpress Bug-Workaround)
LOGGER.Debug("Fallback: IsDataRow(RowHandle) = True")
oHitProfilID = GridViewWorkflows.GetRowCellValue(
hitInfo.RowHandle,
GridViewWorkflows.Columns("PROFILE_ID"))
Else
LOGGER.Error($"⚠️ RowHandle [{hitInfo.RowHandle}] ist weder Group noch DataRow!")
End If
End If
LOGGER.Debug("Clicked ProfileId: [{0}], Started From: [{1}]", oHitProfilID, startedFrom)
' ========== PROFIL-ID VALIDIERUNG UND UPDATE ==========
' ========== PROFIL-ID VALIDIERUNG ==========
If oHitProfilID Is Nothing OrElse Not IsNumeric(oHitProfilID) OrElse CInt(oHitProfilID) = 0 Then
LOGGER.Warn("⚠️ Item_Scope: Could not determine valid PROFILE_ID from clicked row!")
FormHelper.ShowInfoMessage("Konnte keine gültige Profil-ID ermitteln!", omsgTitleWarning)
Exit Function
End If
' ========== PROFIL-ID UPDATE ==========
If oHitProfilID IsNot Nothing AndAlso IsNumeric(oHitProfilID) AndAlso CInt(oHitProfilID) > 0 Then
If oHitProfilID <> CURRENT_CLICKED_PROFILE_ID Then
LOGGER.Debug($"Item_Scope: oHitProfilID {oHitProfilID} <> CURRENT_CLICKED_PROFILE_ID {CURRENT_CLICKED_PROFILE_ID}")
@@ -2748,9 +2808,7 @@ Public Class frmMain
If hitInfo.InGroupRow OrElse (startedFrom = "CMGROUP" AndAlso hitInfo.InDataRow) Then
' GRUPPE: Workflow ohne spezifisches Dokument
CURRENT_JUMP_DOC_GUID = 0
CURRENT_DOC_GUID = 0
CURRENT_DOC_ID = 0
Reset_Current()
CURRENT_ProfilGUID = CURRENT_CLICKED_PROFILE_ID
LOGGER.Debug($"Item_Scope: hitInfo.InGroupRow...CURRENT_CLICKED_PROFILE_ID [{CURRENT_CLICKED_PROFILE_ID}]")
Load_Profil_from_Grid(CURRENT_CLICKED_PROFILE_ID)
@@ -3315,9 +3373,38 @@ Public Class frmMain
End Function
Private Async Sub GridViewWorkflows_DoubleClick(sender As Object, e As EventArgs) Handles GridViewWorkflows.DoubleClick
Me.Cursor = Cursors.WaitCursor
Await Item_Scope("DOUBLECLICK")
Me.Cursor = Cursors.Default
Try
' ===== KRITISCH: HitInfo MIT AKTUELLEM Mauszeiger-Position berechnen =====
Dim oCurrentMousePosition As System.Drawing.Point = GridControlWorkflows.PointToClient(Cursor.Position)
Dim hitInfo As GridHitInfo = GridViewWorkflows.CalcHitInfo(oCurrentMousePosition)
' ===== FRÜHE VALIDIERUNG =====
If hitInfo.RowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle Then
LOGGER.Warn("⚠️ DoubleClick: InvalidRowHandle - ignoring")
Exit Sub
End If
If Not hitInfo.InRow Then
LOGGER.Warn("⚠️ DoubleClick: Not in row - ignoring")
Exit Sub
End If
' ===== AKTUALISIERTE GridCursorLocation SETZEN =====
GridCursorLocation = oCurrentMousePosition
LOGGER.Debug($"DoubleClick: RowHandle=[{hitInfo.RowHandle}], InGroupRow=[{hitInfo.InGroupRow}], InDataRow=[{hitInfo.InDataRow}]")
Me.Cursor = Cursors.WaitCursor
Try
Await Item_Scope("DOUBLECLICK")
Finally
Me.Cursor = Cursors.Default
End Try
Catch ex As Exception
LOGGER.Error(ex)
Me.Cursor = Cursors.Default
End Try
End Sub
'Private Sub GridViewWorkflows_CustomDrawGroupRow(sender As Object, e As Views.Base.RowObjectCustomDrawEventArgs) Handles GridViewWorkflows.CustomDrawGroupRow
@@ -3372,7 +3459,6 @@ Public Class frmMain
Private Sub GridViewWorkflows_CustomDrawGroupRow(sender As Object, e As Views.Base.RowObjectCustomDrawEventArgs) Handles GridViewWorkflows.CustomDrawGroupRow
Try
If FormOpenClose = True And GridIsLoaded = False Then
Exit Sub
End If
@@ -3387,11 +3473,27 @@ Public Class frmMain
If oInfo.Column.FieldName = "GROUP_TEXT" Then
oInfo.GroupText = oInfo.GroupValueText
' ===== PRÜFUNG AUF KINDERZEILEN HINZUFÜGEN =====
Dim oChildCount As Integer = oView.GetChildRowCount(oInfo.RowHandle)
' Wenn keine Kinder vorhanden sind, Standard-Farben verwenden
If oChildCount = 0 Then
LOGGER.Debug($"CustomDrawGroupRow: Group [{oInfo.GroupValueText}] has no children - using default colors")
oInfo.Appearance.BackColor = Color.LightGray
oInfo.Appearance.ForeColor = Color.Black
Exit Sub
End If
' ===== NUR BEI VORHANDENEN KINDERN FARBE AUSLESEN =====
Dim oColorString As String = "LightGray"
Dim oFontColorString As String = "Black"
Dim oChildRowHandle As Integer = oView.GetChildRowHandle(oInfo.RowHandle, 0)
oColorString = oView.GetRowCellValue(oChildRowHandle, "GROUP_COLOR")
' GetRowCellValue kann Nothing zurückgeben, daher absichern
Dim oCellValue As Object = oView.GetRowCellValue(oChildRowHandle, "GROUP_COLOR")
If oCellValue IsNot Nothing AndAlso Not IsDBNull(oCellValue) Then
oColorString = oCellValue.ToString()
End If
Dim oColor As Color = ParseColorString(oColorString, Color.LightGray, "Background Color")
Dim oFontColor As Color = ParseColorString(oFontColorString, Color.Black, "Font Color")
@@ -3405,6 +3507,11 @@ Public Class frmMain
End Sub
Private Function ParseColorString(ColorString As String, DefaultColor As Color, ColorDescription As String) As Color
' ===== NULL-CHECK HINZUFÜGEN =====
If String.IsNullOrWhiteSpace(ColorString) Then
LOGGER.Debug($"ParseColorString: ColorString is null/empty for {ColorDescription} - using default color")
Return DefaultColor
End If
Dim oResultColor As Color
If ColorString.Contains(";") Or ColorString.Contains(".") Then
@@ -3439,6 +3546,17 @@ Public Class frmMain
Dim view As GridView = sender
Dim hi As GridHitInfo = view.CalcHitInfo(e.Location)
Dim groupRowButtonClicked = (hi.HitTest = GridHitTest.RowGroupButton)
' ===== UNGÜLTIGE CLICKS ABFANGEN =====
If hi.RowHandle = DevExpress.XtraGrid.GridControl.InvalidRowHandle Then
LOGGER.Debug("MouseDown: InvalidRowHandle - ignoring click")
Exit Sub
End If
If Not hi.InRow Then
LOGGER.Debug($"MouseDown: Click not in row (HitTest:[{hi.HitTest}]) - ignoring")
Exit Sub
End If
GridCursorLocation = e.Location
'If e.Button = MouseButtons.Left Then
@@ -3449,18 +3567,21 @@ Public Class frmMain
GridViewItem_Clicked = "GROUP"
If Not Application.OpenForms().OfType(Of frmValidator).Any Then
CURRENT_CLICKED_PROFILE_ID = GridViewWorkflows.GetRowCellValue(GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hi.RowHandle), GridViewWorkflows.Columns("PROFILE_ID"))
LOGGER.Debug($"MouseDown: PROFILE_ID for GroupRow [{hi.RowHandle}] is [{CURRENT_CLICKED_PROFILE_ID}]")
End If
ElseIf hi.InDataRow Then
GridViewItem_Clicked = "ROW"
If Not Application.OpenForms().OfType(Of frmValidator).Any Then
CURRENT_CLICKED_PROFILE_ID = GridViewWorkflows.GetRowCellValue(GridViewWorkflows.GetDataRowHandleByGroupRowHandle(hi.RowHandle), GridViewWorkflows.Columns("PROFILE_ID"))
LOGGER.Debug($"MouseDown: PROFILE_ID for DataRow [{hi.RowHandle}] is [{CURRENT_CLICKED_PROFILE_ID}]")
End If
Else
GridViewItem_Clicked = Nothing
If hi.HitTest = GridHitTest.FilterPanelCloseButton Then
Ev_Filter_Panel_Closed = True
LOGGER.Debug("MouseDown: FilterPanelCloseButton clicked - Ev_Filter_Panel_Closed set to True")
Grid_Reset_Filter()
Ev_Filter_Panel_Closed = False
End If
@@ -3471,6 +3592,7 @@ Public Class frmMain
For Each orow As DataRow In CURRENT_DT_PROFILES.Rows
If orow.Item("GUID") = CURRENT_CLICKED_PROFILE_ID Then
If Not Application.OpenForms().OfType(Of frmValidator).Any Then
LOGGER.Debug($"MouseDown: PROFILE_TITLE for PROFILE_ID [{CURRENT_CLICKED_PROFILE_ID}] is [{orow.Item("TITLE")}]")
CURRENT_CLICKED_PROFILE_TITLE = orow.Item("TITLE")
End If
@@ -4972,10 +5094,10 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
Dim oProfileId As Integer = CInt(oFkProfileId)
LOGGER.Debug($"TreeList_Cockpit_DoubleClick: Opening validator for profile ID [{oProfileId}]")
Reset_Current()
' ===== PROFIL-DATEN INS GRID LADEN (FALLS NOCH NICHT GELADEN) =====
' Wenn das Grid aktuell leer ist oder ein anderes Profil zeigt, müssen wir erst laden
If GRID_LOAD_TYPE <> $"PROFILE#{oProfileId}" OrElse DT_CURR_WF_ITEMS Is Nothing OrElse DT_CURR_WF_ITEMS.Rows.Count = 0 Then
If DT_CURR_WF_ITEMS Is Nothing OrElse DT_CURR_WF_ITEMS.Rows.Count = 0 Then
LOGGER.Debug($"TreeList_Cockpit_DoubleClick: Grid does not show profile [{oProfileId}] - loading it first")
CURRENT_CLICKED_PROFILE_ID = oProfileId
@@ -5001,6 +5123,8 @@ FROM VWPM_PROFILE_ACTIVE T WHERE T.GUID IN (SELECT PROFILE_ID FROM [dbo].[FNPM_G
FormHelper.ShowInfoMessage(omsg, omsgTitleAttention)
Exit Sub
End If
Else
LOGGER.Debug($"TreeList_Cockpit_DoubleClick: Grid already shows profile [{CURRENT_CLICKED_PROFILE_ID}] with [{DT_CURR_WF_ITEMS.Rows.Count}] items")
End If
' ===== DOCIDS AUS DT_CURR_WF_ITEMS SAMMELN =====

View File

@@ -142,11 +142,12 @@ Public Class frmValidator
Private _overlayLock As New Object() ' ← NEU: Thread-Safe Lock
Private _documentPathHandler As DocumentPathHandler
Private _isLoadingAdditionalSearches As Boolean = False
Private _separateGridDataCache As New Dictionary(Of String, DataTable)
' Bei den anderen Private-Deklarationen:
Private _separateGridControlCache As New Dictionary(Of String, GridControl)
' ========== BUGFIX START: Alte SelectedValues SICHERN bevor DataSource überschrieben wird ==========
Private previousLUSelectedValues As List(Of String) = Nothing
Private hadPreviousLUSelection As Boolean = False
Private Class Translation_Strings
Inherits My.Resources.frmValidator_Strings
@@ -816,9 +817,9 @@ Public Class frmValidator
End If
Try
Dim oSQL As String
oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbCrLf &
$"DELETE FROM TBPM_VALIDATION_PROFILE_GROUP_USER WHERE UserID = {USER_ID};"
Dim oSQL = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID};" & vbCrLf &
$"DELETE FROM TBPM_VALIDATION_PROFILE_GROUP_USER WHERE UserID = {USER_ID};" & vbCrLf &
$"DELETE FROM TBTF_PROFILE_FILES_WORK WHERE Action_UserID = {USER_ID};"
DatabaseFallback.ExecuteNonQueryECM(oSQL)
Catch ex As Exception
MyValidationLogger.Error(ex)
@@ -903,6 +904,9 @@ Public Class frmValidator
If Not IsNothing(DT_AdditionalSearches_Resultset_Docs) Then
DT_AdditionalSearches_Resultset_Docs.Clear()
End If
' Lookup-State zurücksetzen
previousLUSelectedValues = Nothing
hadPreviousLUSelection = False
End Sub
Private Sub CleanupTempFolder()
@@ -1788,7 +1792,9 @@ Public Class frmValidator
End If
End Select
Next
' Lookup-State zurücksetzen
previousLUSelectedValues = Nothing
hadPreviousLUSelection = False
Focus_FirstControl()
End Sub
@@ -3799,7 +3805,7 @@ Public Class frmValidator
oBIT = 1
End If
Dim oSQL = $"EXEC PRPM_GET_NEXT_DOC_INFO {CURRENT_ProfilGUID},{CURRENT_DOC_ID},{USER_ID}"
MyValidationLogger.Debug($"Get_Next_GUID: SQL [{oSQL}]...")
Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL)
CURRENT_DOC_ID = 0
CURRENT_DOC_GUID = 0
@@ -3808,7 +3814,7 @@ Public Class frmValidator
oNewGUID = oDT.Rows(0).Item(0)
MyValidationLogger.Info($"Get_Next_GUID: oNewGUID [{oNewGUID}]...")
Catch ex As Exception
MyValidationLogger.Warn($"⚠️ >> Attention: in GetNextGUID - Could not get the next GUID - SQL [{oSQL}]")
MyValidationLogger.Warn($"⚠️ Attention: in GetNextGUID - Could not get the next GUID - SQL [{oSQL}]")
MyValidationLogger.Warn($"⚠️ ERRORMESSAGE [{ex.Message}]")
End Try
@@ -4053,7 +4059,9 @@ Public Class frmValidator
MyValidationLogger.Info($"LOG_HOTSPOTS - CURRENT_DOC_GUID: {CURRENT_DOC_GUID}")
' ========== ENDE DIAGNOSE ==========
End If
' State-Variablen zurücksetzen beim Laden eines neuen Dokuments
previousLUSelectedValues = Nothing
hadPreviousLUSelection = False
Dim oMilliseconts As Double
clsPatterns.ClearControlCache() ' Cache-Invalidierung
Dim perfStart As DateTime = DateTime.MinValue
@@ -5649,16 +5657,14 @@ Public Class frmValidator
Dim oLookup As LookupControl3 = oControl
Dim oLookupMeta As ClassControlCreator.ControlMetadata = DirectCast(oLookup.Tag, ClassControlCreator.ControlMetadata)
' ========== BUGFIX START: Alte SelectedValues SICHERN bevor DataSource überschrieben wird ==========
Dim previousSelectedValues As List(Of String) = Nothing
Dim hadPreviousSelection As Boolean = False
If oLookup.Properties.SelectedValues IsNot Nothing AndAlso oLookup.Properties.SelectedValues.Count > 0 Then
previousSelectedValues = New List(Of String)(oLookup.Properties.SelectedValues)
hadPreviousSelection = True
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Alte SelectedValues gesichert = [{String.Join(",", previousSelectedValues)}]")
' Nur sichern wenn NICHT bereits von einem vorherigen Dokument vorhanden
If Not hadPreviousLUSelection Then
If oLookup.Properties.SelectedValues IsNot Nothing AndAlso oLookup.Properties.SelectedValues.Count > 0 Then
previousLUSelectedValues = New List(Of String)(oLookup.Properties.SelectedValues)
hadPreviousLUSelection = True
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Alte SelectedValues gesichert = [{String.Join(",", previousLUSelectedValues)}]")
End If
End If
' ========== BUGFIX END: Sicherung ==========
oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)
@@ -5691,20 +5697,20 @@ Public Class frmValidator
End If
Else
' ========== BUGFIX START: Wenn KEIN neuer Wert, alte Werte behalten ==========
If hadPreviousSelection AndAlso previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then
If hadPreviousLUSelection AndAlso previousLUSelectedValues IsNot Nothing AndAlso previousLUSelectedValues.Count > 0 Then
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Kein neuer Wert von Quelle → alte Werte BEHALTEN")
oNewValues = previousSelectedValues
oNewValues = previousLUSelectedValues
ElseIf oDefaultValue <> String.Empty Then
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Keine alten Werte, verwende DefaultValue = [{oDefaultValue}]")
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Verwende DefaultValue = [{oDefaultValue}]")
oNewValues = oDefaultValue.Split(",").ToList()
Else
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: KEINE Werte (oValueFromSource=Nothing, oDefaultValue leer, keine vorherigen Werte)")
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: KEINE Werte!")
End If
' ========== BUGFIX END: Wert-Beibehaltung ==========
End If
' ========== BUGFIX END: Wert-Beibehaltung ==========
End If
' ========== KRITISCH: DataSource-Backup erstellen BEVOR SelectedValues gelöscht wird ==========
Dim savedDataSource = oLookup.Properties.DataSource
' ========== KRITISCH: DataSource-Backup erstellen BEVOR SelectedValues gelöscht wird ==========
Dim savedDataSource = oLookup.Properties.DataSource
MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: DataSource-Backup erstellt")
' ========== KRITISCH: DataSource ZUERST wiederherstellen, DANN SelectedValues leeren ==========
@@ -8508,8 +8514,9 @@ Public Class frmValidator
Cursor = Cursors.WaitCursor
Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing)
Dim perfLastCheck As DateTime = perfStart
' ========== WICHTIG: State-Variablen zurücksetzen vor neuem Dokument ==========
previousLUSelectedValues = Nothing
hadPreviousLUSelection = False
If LOG_HOTSPOTS Then
' ========== DIAGNOSE START ==========
@@ -8531,12 +8538,7 @@ Public Class frmValidator
' ========== ENDE DIAGNOSE ==========
End If
Reset_CurrentReferences()
If LOG_HOTSPOTS Then
MyValidationLogger.Info($"[PERF] Nach Reset_CurrentReferences: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
perfLastCheck = DateTime.Now