Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data.Entity.Core.Common.CommandTrees
'Imports System.Data.SqlClient
Imports System.Globalization
Imports System.IO
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Imports System.Threading
Imports DevExpress.Data
Imports DevExpress.DataAccess.Native.Sql
Imports DevExpress.DataProcessing.InMemoryDataProcessor
Imports DevExpress.Utils
Imports DevExpress.Utils.Automation
Imports DevExpress.XtraBars
Imports DevExpress.XtraEditors
Imports DevExpress.XtraEditors.Mask
Imports DevExpress.XtraEditors.Repository
Imports DevExpress.XtraExport.Helpers
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraSplashScreen
Imports DigitalData.Controls.LookupGrid
Imports DigitalData.GUIs.Common
Imports DigitalData.GUIs.Common.DocumentResultList
Imports DigitalData.Modules.Base
Imports DigitalData.Modules.EDMI.API.Constants
Imports DigitalData.Modules.EDMI.API.DatabaseWithFallback
Imports DigitalData.Modules.Interfaces
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.ZooFlow
Imports DigitalData.Modules.ZooFlow.Constants
'Imports System.Windows.Forms.VisualStyles.VisualStyleElement
'Imports System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox
Imports WINDREAMLib
Imports System.Linq

Public Class frmValidator
    Public Event CustomColumnDisplayText As CustomColumnDisplayTextEventHandler
    Private Property Current_Document As DocumentResultList.Document = Nothing
    ''' <summary>
    ''' Contains all controls for the current profile
    ''' </summary>
    Private Property DT_CONTROLS As DataTable

    ''' <summary>
    ''' Contains all grid columns for the current profile
    ''' </summary>
    Private Property DT_COLUMNS_GRID As DataTable
    Private Property GIT_TEST As Boolean = False
    ''' <summary>
    ''' Contains all grid columns for the current profile which have an sql but don't have a reference to a control
    ''' </summary>
    Private Property DT_COLUMNS_GRID_WITH_SQL As DataTable

    ''' <summary>
    ''' Contains all grid columns for the current profile which have an sql and have a reference to a control 
    ''' </summary>
    Private Property DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER As DataTable

    Private Property DTInfoDoc As DataTable
    Private Property PROFIL_sortbynewest As Boolean
    Private Property PROFIL_VEKTORINDEX
    Private Property PROFIL_FINISH_SQL
    Private Property PROFIL_LOGINDEX
    Private Property PROFIL_CURRENCY_ATTRIBUTE
    Private Property PROFIL_REJECT_ACTIONS_ATTRIBUTE As String = ""
    Private Property PROFIL_REJECT_COMMENT_ATTRIBUTE As String = ""
    Private Property PROFIL_NOT_RESP_COMMENT_ATTR As String = ""
    Private Property REJECTION_ACTIVE As Boolean = False
    Private Property oErrMsgMissingInput

    Private Const PMDelimiter As String = "~"

    Private Property finalProfile As Boolean
    Private Property Move2Folder As String
    'Private Property DataASorDB As ClassDataASorDB
    Private Property allgFunk As New ClassAllgemeineFunktionen
    Private CountAction As Int16 = 0
    Public Shared Property WMDocPathWindows As String
    Private Property DocPathWindows As String
    Private Property DocCurrency As String = "EUR"
    'Anzahl der Validierungsdokumente
    Private Property Amount_Docs2Validate As Integer
    Private Property first_control As Control
    Private Property last_control As Control

    Public Shared Property idxerr_message As String = ""

    Private Property _frmValidatorSearch As frmValidatorSearch

    Private Property DT_AdditionalSearches_Resultset_Docs As DataTable

    Private Property _Indexe_Loaded As Boolean = False
    Private Property _DependingControl_In_Action As Boolean = False
    Private Property _DependingColumn_In_Action As Boolean = False
    Private Property _SetControlValue_In_Action As Boolean = False
    Public Property _FormLoaded As Boolean = False
    Private Property _FormClosing As Boolean = False
    Private Property _ControlHandleStarted As Boolean = False
    Private Property Override As Boolean = False
    Private Property OverrideAll As Boolean = False
    Private Property Override_SQLCommand As String = ""
    Private Property listChangedLookup As New List(Of String)

    Private DD_Documentloader As Loader
    Private ControlCreator As ClassControlCreator
    Private PerformanceLogger As Logger
    Private Validator As Validator
    Private Const LOG_PERF = False
    Private ReadOnly MyValidationLogger As Logger

    Private Property OperationMode As OperationMode
    Private ReadOnly Environment As Environment
    Private AdditionalDocResultsExist As Boolean = False
    Private AdditionalDataResultsExist As Boolean = False
    Private oProfileFinalText As String = ""
    Private oProfileRejectionText As String = ""
    Private oProfileNotResponsibleText As String = ""
    Private oProfileNotResponsibleQuestion As String = ""

    Private oProfile_REJECT_SQL_REASONS As String
    Private oProfile_NOT_RESP_SQL As String
    Private listofControls As New List(Of String)

    Private frmMessages As frmValidator_Messages
    Private ReadOnly _CachedSqlDataCache As New Dictionary(Of String, DataTable)(StringComparer.OrdinalIgnoreCase)
    Private ReadOnly _CachedSqlScalarCache As New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase)
    Private _CachedSqlControlsByGuid As Dictionary(Of Integer, List(Of DataRow))
    Private _CachedLookupControlsByRepository As Dictionary(Of RepositoryItemLookupControl3, LookupControl3)
    Private _CachedControlsBySetControlData As Dictionary(Of Integer, DataRow)
    Private _CachedFinalIndexing As DataTable = Nothing
    Private _CachedControlsByGuid As Dictionary(Of Integer, Control)
    Private _isUpdatingLookup As Boolean = False
    Private _suppressLookupEvents As Boolean = False
    Private _isShowingErrorDialog As Boolean = False  ' ← NEU: Klassenvariable oben hinzufügen
    Private _overlayHandle As Object = Nothing  ' ← NEU: Klassenvariable
    Private _overlayRefCount As Integer = 0  ' ← NEU: Zähler für verschachtelte Calls
    Private _overlayLock As New Object()     ' ← NEU: Thread-Safe Lock
    Private _documentPathHandler As DocumentPathHandler
    Private _isLoadingAdditionalSearches As Boolean = False


    Private Class Translation_Strings
        Inherits My.Resources.frmValidator_Strings
    End Class

    Public Sub New(pEnvironment As Environment)
        PerformanceLogger = LOGCONFIG.GetLoggerFor("PERF")
        If LOG_PERF Then PerformanceLogger.Info("New")
        MyValidationLogger = LOGCONFIG.GetLogger()

        'MyBase.New
        MyValidationLogger.Debug("Initialize Components...")
        InitializeComponent()
        Environment = pEnvironment
        clsPatterns.ClearControlCache()
        Try
            MyValidationLogger.Debug("Initialize _frmValidatorSearch...")
            _frmValidatorSearch = New frmValidatorSearch(Me, Environment)
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try


    End Sub
    ' ========== NEU: Zentrale Overlay-Verwaltung ==========
    ''' <summary>
    ''' Thread-sicheres Öffnen des Overlays (verschachtelte Calls werden ignoriert)
    ''' </summary>
    Private Function ShowOverlaySafe() As Boolean
        SyncLock _overlayLock
            If _overlayRefCount = 0 Then
                Try
                    _overlayHandle = SplashScreenManager.ShowOverlayForm(Me)
                    MyValidationLogger.Debug($"[Overlay] Geöffnet (RefCount: 0 → 1)")
                Catch ex As Exception
                    MyValidationLogger.Error($"[Overlay] Fehler beim Öffnen: {ex.Message}")
                    Return False
                End Try
            Else
                MyValidationLogger.Debug($"[Overlay] Bereits offen (RefCount: {_overlayRefCount} → {_overlayRefCount + 1})")
            End If
            _overlayRefCount += 1
            Return True
        End SyncLock
    End Function

    ''' <summary>
    ''' Thread-sicheres Schließen des Overlays (nur wenn RefCount = 0)
    ''' </summary>
    Private Sub CloseOverlaySafe()
        SyncLock _overlayLock
            If _overlayRefCount > 0 Then
                _overlayRefCount -= 1
                MyValidationLogger.Debug($"[Overlay] RefCount: {_overlayRefCount + 1} → {_overlayRefCount}")
            End If

            If _overlayRefCount = 0 AndAlso _overlayHandle IsNot Nothing Then
                Try
                    SplashScreenManager.CloseOverlayForm(_overlayHandle)
                    MyValidationLogger.Debug("[Overlay] ✓ Geschlossen")
                Catch ex As Exception
                    MyValidationLogger.Warn($"[Overlay] Fehler beim Schließen: {ex.Message}")
                Finally
                    _overlayHandle = Nothing
                End Try
            End If
        End SyncLock
    End Sub

    ''' <summary>
    ''' Erzwingt sofortiges Schließen (nur für Fehlerfall / FormClosing)
    ''' </summary>DetachAllGridEvents
    Private Sub ForceCloseOverlay()
        SyncLock _overlayLock
            If _overlayHandle IsNot Nothing Then
                Try
                    SplashScreenManager.CloseOverlayForm(_overlayHandle)
                    MyValidationLogger.Debug("[Overlay] ⚠️ FORCE CLOSED")
                Catch ex As Exception
                    MyValidationLogger.Warn($"[Overlay] Force-Close failed: {ex.Message}")
                Finally
                    _overlayHandle = Nothing
                    _overlayRefCount = 0
                End Try
            End If
        End SyncLock
    End Sub
    ' ========== ENDE NEU ==========
    Private Function GetOperationMode() As OperationMode
        Dim oOperationMode As OperationMode

        If Environment.Service.Client Is Nothing And OPERATION_MODE_FS <> ClassConstants.OpModeFS_ZF Then
            Return OperationMode.NoAppServer
        End If
        If Not IsNothing(Environment.Service.Client) Then
            If Environment.Service.Client.IsOnline AndAlso Environment.Service.Client.ServerAddress <> String.Empty And IDB_USES_WMFILESTORE = False Then
                oOperationMode = OperationMode.WithAppServer
            Else
                oOperationMode = OperationMode.NoAppServer
            End If
        End If

        If OPERATION_MODE_FS = ClassConstants.OpModeFS_ZF Then
            oOperationMode = OperationMode.ZooFlow
        End If

        Return oOperationMode
    End Function
    Private Sub EnsureFormIsVisible()
        Try
            ' Aktuellen Bildschirm basierend auf der Formularposition ermitteln
            Dim currentScreen As Screen = Screen.FromPoint(Me.Location)
            Dim workingArea As Rectangle = currentScreen.WorkingArea

            ' Prüfen ob das Formular vollständig außerhalb des sichtbaren Bereichs liegt
            Dim formBounds As New Rectangle(Me.Location, Me.Size)

            ' Wenn das Formular nicht mit dem Arbeitsbereich überschneidet
            If Not workingArea.IntersectsWith(formBounds) Then
                CenterFormOnScreen()
                Exit Sub
            End If

            ' Optional: Prüfen ob das Formular zu weit außerhalb liegt (z.B. nur 20% sichtbar)
            Dim visibleArea As Rectangle = Rectangle.Intersect(workingArea, formBounds)
            Dim visiblePercentage As Double = (visibleArea.Width * visibleArea.Height) / (formBounds.Width * formBounds.Height)

            If visiblePercentage < 0.2 Then ' Weniger als 20% sichtbar
                CenterFormOnScreen()
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            ' Bei Fehler sicherheitshalber zentrieren
            CenterFormOnScreen()
        End Try
    End Sub

    Private Sub CenterFormOnScreen()
        Try
            ' Formular auf dem primären Bildschirm zentrieren
            Dim currentScreen As Screen = Screen.PrimaryScreen
            Dim x As Integer = currentScreen.WorkingArea.Left + (currentScreen.WorkingArea.Width - Me.Width) \ 2
            Dim y As Integer = currentScreen.WorkingArea.Top + (currentScreen.WorkingArea.Height - Me.Height) \ 2
            Me.Location = New Point(x, y)

            MyValidationLogger.Info("Formular wurde zentriert, da es außerhalb des sichtbaren Bereichs lag")
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try
    End Sub
    Private Sub frmValidation_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        ' === MESSPUNKT 1: Start ===
        Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing)
        Dim perfLastCheck As DateTime = perfStart
        If LOG_HOTSPOTS Then MyValidationLogger.Info($"[PERF frmValidation_Load] START")

        Try
            MyValidationLogger.Debug("###frmValidation_Load###")
            MyValidationLogger.Debug("Current User Language: [{0}]", USER_LANGUAGE)

            OperationMode = GetOperationMode()

            DD_Documentloader = New Loader(LOGCONFIG, OperationMode, Environment.Service.Client, Environment.User)
            ControlCreator = New ClassControlCreator(LOGCONFIG)
            Validator = New Validator(LOGCONFIG)
            _documentPathHandler = New DocumentPathHandler(LOGCONFIG)
            Override = False
            SplitContainer1.Panel2Collapsed = True
            first_control = Nothing
            _FormClosing = False
            _FormLoaded = False


            ' In Load_Next_Document (einmalig):
            If _CachedFinalIndexing Is Nothing AndAlso DTTBPM_PROFILE_FINAL_INDEXING IsNot Nothing Then
                Dim rows = DTTBPM_PROFILE_FINAL_INDEXING.Select($"PROFIL_ID = {CURRENT_ProfilGUID} AND ACTIVE = 1", "SEQUENCE")
                If rows.Length > 0 Then
                    _CachedFinalIndexing = rows.CopyToDataTable()
                End If
            End If


            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Initialisierung: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If


        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ Error in frmValidation_load1: {ex.Message}")
        End Try

        Try
            ' === MESSPUNKT 3: Form-Position wiederherstellen ===
            If My.Settings.frmValidatorPosition.IsEmpty = False Then
                If My.Settings.frmValidatorPosition.X > 0 And My.Settings.frmValidatorPosition.Y > 0 Then
                    Me.Location = My.Settings.frmValidatorPosition

                    ' Prüfen und ggf. zentrieren
                    EnsureFormIsVisible()
                Else
                    Me.StartPosition = FormStartPosition.CenterScreen
                End If
            End If

            If My.Settings.frmValidatorSize.IsEmpty = False Then
                If My.Settings.frmValidatorSize.Width > 0 And My.Settings.frmValidatorSize.Height > 0 Then
                    If My.Settings.frmValidatorWindowState = "Normal" Then
                        Size = My.Settings.frmValidatorSize
                    Else
                        Me.WindowState = FormWindowState.Maximized
                    End If
                End If
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Position/Size: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

        Catch ex As Exception
            MyValidationLogger.Info($"Error loading position: {ex.Message}")
        End Try

        Dim _step = 0
        Try
            ' === MESSPUNKT 4: DocumentViewer Init ===
            Dim oDVSettings As New DigitalData.Controls.DocumentViewer.DocumentViewer.ToolbarSettings() With {
                .ShowPrintButton = True,
                .ShowRotateButton = True,
                .ShowFlipButton = True,
                .ShowSettingButton = True
            }
            DocumentViewer1.Init(LOGCONFIG, GDPICTURE_LICENSE, oDVSettings)

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF frmValidation_Load] Nach DocumentViewer.Init: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try

        Try
            _step = 1
            _step = 2

            ' === MESSPUNKT 5: Profile Data laden (KRITISCH) ===
            DTVWCONTROL_INDEX.Clear()
            Dim oExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}"
            DTVWCONTROLS_INDEX.Select(oExpression, "Y_LOC, X_LOC").CopyToDataTable(DTVWCONTROL_INDEX, LoadOption.PreserveChanges)

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF frmValidation_Load] Nach DTVWCONTROL_INDEX laden ({DTVWCONTROL_INDEX.Rows.Count} Rows): {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            _step = 3
            MyValidationLogger.Debug("Profile Data loaded")

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("Error LOADING profile-data(" & _step.ToString & "):" & vbcrlf & ex.Message, MsgBoxStyle.Critical, "Attention:")
            MyValidationLogger.Info(">> Error in LOADING profile-data: " & ex.Message, True)
            Me.Close()
        End Try

        MyValidationLogger.Debug("frmValidation_Load finished till Step 3!")

        Try
            If CURRENT_DT_PROFILE.Rows.Count = 0 Then
                MyValidationLogger.Info(">> ProfileData could not be loaded - Profile: : " & CURRENT_ProfilName, True)
                MsgBox("ProfileData could not be loaded - Profile: " & CURRENT_ProfilName, MsgBoxStyle.Critical, "Attention:")
                Me.Close()
            End If

            _step = 4
            MyValidationLogger.Debug("Step 4")

            If CURRENT_DT_PROFILE.Rows.Count > 1 Then
                MsgBox("More than 1 profile (" & CURRENT_DT_PROFILE.Rows.Count & ") returned!!", MsgBoxStyle.Critical, "Attention:")
            Else
                _step = 5
                MyValidationLogger.Debug("Step 5")

                If CURRENT_DT_PROFILE.Rows.Count = 1 Then
                    _step = 6
                    MyValidationLogger.Debug("Step 6")

                    Dim profileLangAll = CURRENT_DT_PROFILE_LANGUAGE.AsEnumerable().
                        GroupBy(Function(r) r.Field(Of String)("TITLE")).
                        ToDictionary(Function(g) g.Key, Function(g) g.First())

                    Dim profileLangUser = CURRENT_DT_PROFILE_LANGUAGE.AsEnumerable().
                        Where(Function(r) r.Field(Of String)("LANGUAGE") = USER_LANGUAGE).
                        GroupBy(Function(r) r.Field(Of String)("TITLE")).
                        ToDictionary(Function(g) g.Key, Function(g) g.First())

                    ' === MESSPUNKT 6: Profile-Properties verarbeiten ===
                    For Each oProfileRow As DataRow In CURRENT_DT_PROFILE.Rows
                        PROFIL_FINISH_SQL = oProfileRow.Item("SQL_BTN_FINISH")
                        PROFIL_VEKTORINDEX = oProfileRow.Item("PM_VEKTOR_INDEX")
                        PROFIL_CURRENCY_ATTRIBUTE = oProfileRow.Item("CURRENCY_ATTRIBUTE")
                        PROFILE_NOT_RESP_COMMENT = oProfileRow.Item("NOT_RESP_COMMENT")
                        PROFIL_REJECT_ACTIONS_ATTRIBUTE = oProfileRow.Item("REJECT_ACTIONS_ATTRIBUTE")
                        PROFIL_REJECT_COMMENT_ATTRIBUTE = oProfileRow.Item("REJECT_COMMENT_ATTRIBUTE")
                        PROFIL_NOT_RESP_COMMENT_ATTR = oProfileRow.Item("NOT_RESP_COMMENT_ATTRIBUTE")
                        REJECTION_ACTIVE = False
                        PROFIL_LOGINDEX = oProfileRow.Item("LOG_INDEX")
                        CURRENT_PROFILE_LOG_INDEX = PROFIL_LOGINDEX

                        If LOG_HOTSPOTS Then
                            MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Profile-Properties: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                            perfLastCheck = DateTime.Now
                        End If

                        ' === MESSPUNKT 7: Language-Strings laden (optimiert) ===
                        Dim oProfileTitle As String = ""
                        Dim oProfileDescription As String = ""

                        Dim titleKey = $"PROFILE_TITLE{CURRENT_ProfilGUID}"
                        Dim descKey = $"PROFILE_DESCRIPTION{CURRENT_ProfilGUID}"
                        Dim finalKey = $"PROFILE_FINAL_TEXT{CURRENT_ProfilGUID}"
                        Dim rejectKey = $"PROFILE_REJECTION_CAPT{CURRENT_ProfilGUID}"
                        Dim notRespKey = $"PROFILE_NOT_RESPONSIBLE_CAPT{CURRENT_ProfilGUID}"
                        Dim notRespQKey = $"PROFILE_NOT_RESPONSIBLE_QUEST{CURRENT_ProfilGUID}"

                        Dim row As DataRow = Nothing

                        If profileLangAll.TryGetValue(titleKey, row) Then oProfileTitle = row.Item("STRING1")
                        If profileLangAll.TryGetValue(descKey, row) Then oProfileDescription = row.Item("STRING1")
                        If profileLangAll.TryGetValue(rejectKey, row) Then oProfileRejectionText = row.Item("STRING1")

                        If profileLangUser.TryGetValue(finalKey, row) Then
                            If row.Item("STRING1").ToString <> "" Then oProfileFinalText = row.Item("STRING1")
                        End If
                        If profileLangUser.TryGetValue(notRespKey, row) Then oProfileNotResponsibleText = row.Item("STRING1")
                        If profileLangUser.TryGetValue(notRespQKey, row) Then oProfileNotResponsibleQuestion = row.Item("STRING1")

                        If LOG_HOTSPOTS Then
                            MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Language-Loop ({CURRENT_DT_PROFILE_LANGUAGE.Rows.Count} Rows): {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                            perfLastCheck = DateTime.Now
                        End If

                        If oProfileTitle = "" Then
                            oProfileTitle = oProfileRow.Item("TITLE")
                        End If
                        Me.Text = ADDITIONAL_TITLE & " - " & oProfileTitle
                        If oProfileDescription = "" Then
                            IIf(IsDBNull(oProfileRow.Item("DESCRIPTION")), "", oProfileRow.Item("DESCRIPTION"))
                        End If
                        TITLELabel1.Text = oProfileTitle
                        Dim opnlPoint As New Point(8, 132)
                        If oProfileDescription <> String.Empty Then
                            DESCRIPTIONLabel.Text = oProfileDescription
                        Else
                            DESCRIPTIONLabel.Visible = False
                            opnlPoint = New Point(5, 35)
                            Dim oSize As New Size(PanelValidatorControl.Size.Width, SplitContainerButtons.Location.Y - 40)
                            PanelValidatorControl.Location = opnlPoint
                            PanelValidatorControl.Size = oSize
                        End If

                        If PROFIL_VEKTORINDEX.GetType.ToString.ToLower = "system.dbnull" Then
                            PROFIL_VEKTORINDEX = ""
                        End If
                        If PROFIL_LOGINDEX.GetType.ToString.ToLower = "system.dbnull" Then
                            PROFIL_LOGINDEX = ""
                        End If

                        finalProfile = oProfileRow.Item("FINAL_PROFILE")
                        Move2Folder = IIf(IsDBNull(oProfileRow.Item("MOVE2Folder")), "", oProfileRow.Item("MOVE2Folder"))

                        ' === MESSPUNKT 8: Button-Texte setzen ===
                        Try
                            If finalProfile = True Then
                                If oProfileFinalText = "" Then
                                    oProfileFinalText = IIf(IsDBNull(oProfileRow.Item("FINAL_TEXT")), "", oProfileRow.Item("FINAL_TEXT") & (" (F2)"))
                                Else
                                    oProfileFinalText = $"{oProfileFinalText} (F2)"
                                End If
                                btnSave.Text = oProfileFinalText
                            Else
                                oProfileFinalText = IIf(IsDBNull(oProfileRow.Item("FINAL_TEXT")), "", oProfileRow.Item("FINAL_TEXT") & (" (F2)"))
                                If oProfileFinalText = String.Empty Then
                                    oProfileFinalText = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.ValidationButton")
                                End If
                                btnSave.Text = oProfileFinalText
                            End If
                            MyValidationLogger.Debug("Buttontext validation loaded")

                            If LOG_HOTSPOTS Then
                                MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Button-Setup: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                                perfLastCheck = DateTime.Now
                            End If

                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            MsgBox("Error loading final profile text:" & vbcrlf & ex.Message, MsgBoxStyle.Critical, "Attention:")
                            MyValidationLogger.Info(">> Error loading final profile text: " & ex.Message, True)
                        End Try

                        ' === MESSPUNKT 9: Rejection/NotResponsible-Buttons konfigurieren ===
                        Dim PROF_BTN_RE_CAPT = oProfileRow.Item("BTN_REJECT_CAPTION")
                        Dim PROF_SQL_BTN_REJECT = oProfileRow.Item("SQL_BTN_REJECT")
                        oProfile_REJECT_SQL_REASONS = oProfileRow.Item("REJECT_SQL_REASONS")
                        oProfile_NOT_RESP_SQL = oProfileRow.Item("NOT_RESP_SQL")

                        If oProfileRejectionText = String.Empty Then
                            oProfileRejectionText = PROF_BTN_RE_CAPT
                        End If

                        MyValidationLogger.Debug($"oProfileRejectionText: " + oProfileRejectionText)
                        MyValidationLogger.Debug($"oProfile_REJECT_SQL_REASONS: " + oProfile_REJECT_SQL_REASONS)
                        MyValidationLogger.Debug($"oProfileNotResponsibleText: " + oProfileNotResponsibleText)
                        MyValidationLogger.Debug($"oProfile_NOT_RESP_SQL: " + oProfile_NOT_RESP_SQL)

                        Dim functBtnReject As Boolean = False
                        Dim functBtnNR As Boolean = False

                        If oProfileRejectionText <> String.Empty And oProfile_REJECT_SQL_REASONS <> String.Empty Then
                            functBtnReject = True
                        End If
                        If (oProfileNotResponsibleQuestion <> String.Empty Or oProfileNotResponsibleText <> String.Empty) And oProfile_NOT_RESP_SQL <> String.Empty Then
                            If IDB_ACTIVE = True Then
                                functBtnNR = True
                            End If
                        End If

                        If functBtnReject = False And functBtnNR = False Then
                            MyValidationLogger.Debug($"!Keine Ablehnung und Nicht zuständig Funktion konfiguriert!")
                            SplitContainerReject_NotResp.Visible = False
                            SplitContainerButtons.CollapsePanel = SplitCollapsePanel.None
                            SplitContainerButtons.PanelVisibility = SplitPanelVisibility.Panel2
                        Else
                            SplitContainerButtons.CollapsePanel = SplitCollapsePanel.Panel1
                            SplitContainerReject_NotResp.Visible = True
                            If functBtnReject = True And functBtnNR = True Then
                                MyValidationLogger.Debug($"Nicht zuständig und Ablehnungs-Buttons werden eingeblendet!")
                                SplitContainerReject_NotResp.CollapsePanel = SplitCollapsePanel.None
                                SplitContainerButtons.PanelVisibility = SplitPanelVisibility.Both
                                btnReject.Text = oProfileRejectionText
                                btnNotResponsible.Text = oProfileNotResponsibleText
                                If USER_GHOST_MODE_ACTIVE Then
                                    btnReject.Enabled = False
                                    btnNotResponsible.Enabled = False
                                Else
                                    btnReject.Enabled = True
                                    btnNotResponsible.Enabled = True
                                End If
                            Else
                                If functBtnNR = True Then
                                    MyValidationLogger.Debug($"Nicht zuständig Button wird eingeblendet!")
                                    SplitContainerReject_NotResp.CollapsePanel = SplitCollapsePanel.Panel1
                                    SplitContainerReject_NotResp.PanelVisibility = SplitPanelVisibility.Panel2
                                    btnReject.Visible = False
                                    SplitContainerReject_NotResp.Collapsed = True
                                    btnNotResponsible.Text = oProfileNotResponsibleText
                                    If USER_GHOST_MODE_ACTIVE Then
                                        btnNotResponsible.Enabled = False
                                    Else
                                        btnNotResponsible.Enabled = True
                                    End If
                                Else
                                    SplitContainerReject_NotResp.CollapsePanel = SplitCollapsePanel.Panel2
                                    SplitContainerReject_NotResp.PanelVisibility = SplitPanelVisibility.Panel1
                                    SplitContainerReject_NotResp.Collapsed = True
                                    btnNotResponsible.Visible = False
                                    btnReject.Text = oProfileRejectionText
                                    If USER_GHOST_MODE_ACTIVE Then
                                        btnReject.Enabled = False
                                    Else
                                        btnReject.Enabled = True
                                    End If
                                End If
                            End If
                        End If

                        If LOG_HOTSPOTS Then
                            MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Rejection/NR-Setup: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                            perfLastCheck = DateTime.Now
                        End If

                        bbtniNext.Visibility = BarItemVisibility.Never
                        If CURRENT_JUMP_DOC_GUID <> 0 Then
                            Amount_Docs2Validate = 1
                        Else
                            Amount_Docs2Validate = 0
                        End If

                    Next

                    MyValidationLogger.Debug(" >> profiledata saved:")
                    MyValidationLogger.Debug(" >> finalProfile: " & finalProfile)
                    MyValidationLogger.Debug(" >> Move2Folder: " & Move2Folder)
                    MyValidationLogger.Debug(" >> Right_Delete: " & USER_RIGHT_FILE_DELETE)

                    PROFIL_sortbynewest = CURRENT_DT_PROFILE.Rows(0).Item("SORT_BY_LATEST")
                    MyValidationLogger.Debug("PROFIL_sortbynewest: " & PROFIL_sortbynewest.ToString)

                    If USER_RIGHT_FILE_DELETE = True Then
                        bbtniDelete.Visibility = BarItemVisibility.Always
                    Else
                        bbtniDelete.Visibility = BarItemVisibility.Never
                    End If

                    If CBool(CURRENT_DT_PROFILE.Rows(0).Item("ANNOTATE_WORK_HISTORY_ENTRY")) = True Then
                        bbtniAnnotation.Visibility = BarItemVisibility.Always
                    Else
                        bbtniAnnotation.Visibility = BarItemVisibility.Never
                    End If

                    MyValidationLogger.Debug("Right_Delete: " & USER_RIGHT_FILE_DELETE.ToString)

                    ' === MESSPUNKT 10: Create_Controls (KRITISCH - wahrscheinlich größter Hotspot) ===
                    If LOG_HOTSPOTS Then MyValidationLogger.Info($"[PERF frmValidation_Load] Vor Create_Controls")
                    Create_Controls()
                    If LOG_HOTSPOTS Then
                        MyValidationLogger.Info($"[PERF frmValidation_Load] Nach Create_Controls: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                        perfLastCheck = DateTime.Now
                    End If
                End If
            End If

            MyValidationLogger.Debug("frmValidation_Load finished!")

            ' === MESSPUNKT 11: Gesamt-Zeit ===
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF frmValidation_Load] GESAMT frmValidation_Load: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("Error LOADING Profile-Data1:" & vbcrlf & ex.Message, MsgBoxStyle.Critical, "Attention:")
            MyValidationLogger.Info("Unexpected error in LOADING Profile-Data1: " & ex.Message)
        End Try
    End Sub
    Private _isClosingGuard As Boolean = False

    Private Sub DetachAllGridEvents(parent As Control)
        For Each ctrl As Control In parent.Controls
            If TypeOf ctrl Is GridControl Then
                Dim gc = DirectCast(ctrl, GridControl)
                Try
                    For Each view In gc.Views
                        If TypeOf view Is GridView Then
                            Dim gv = DirectCast(view, GridView)
                            RemoveHandler gv.CellValueChanged, AddressOf GridView_CellValueChanged
                            RemoveHandler gv.KeyDown, AddressOf GridView_KeyDown
                            RemoveHandler gv.RowDeleting, AddressOf GridView_RowDeleting
                            ' DataSource-Events ebenfalls trennen
                            If TypeOf gv.DataController.DataSource Is DataTable Then
                                Dim dt = DirectCast(gv.DataController.DataSource, DataTable)
                                RemoveHandler dt.RowDeleted, AddressOf GridDataSource_RowDeleted
                            End If
                        End If
                    Next
                Catch ex As Exception
                    MyValidationLogger.Warn($"[DetachAllGridEvents] Grid [{ctrl.Name}]: {ex.Message}")
                End Try
            End If
            If ctrl.Controls.Count > 0 Then
                DetachAllGridEvents(ctrl)
            End If
        Next
    End Sub
    Private Sub frmValidation_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ' Guard: Re-Entry und Post-Dispose-Aufrufe verhindern
        If _isClosingGuard Then
            MyValidationLogger.Warn("[FormClosing] Guard aktiv – Exit")
            Return
        End If
        _isClosingGuard = True
        _FormClosing = True

        ' KRITISCH: Dokument freigeben bevor Form schließt
        If Current_Document IsNot Nothing Then
            PRTF_PROFILE_FILES_WORK("FreeFile")
        End If

        ' ===== FIX: Grid-Events SOFORT deregistrieren =====
        ' Der GridControl-Lambda läuft noch asynchron weiter und greift sonst
        ' nach DocumentViewer.Done() auf bereits freigegebene UI-Objekte zu.
        Try
            DetachAllGridEvents(Me)
        Catch ex As Exception
            MyValidationLogger.Warn($"[FormClosing] DetachAllGridEvents: {ex.Message}")
        End Try
        ' ===== ENDE FIX =====

        Try
            If LOG_HOTSPOTS Then
                ' ========== DIAGNOSE: Wer schließt die Form? ==========
                MyValidationLogger.Debug($"LOG_HOTSPOTS - frmValidator_FormClosing aufgerufen!")
                MyValidationLogger.Debug($"LOG_HOTSPOTS - CloseReason: {e.CloseReason}")
                MyValidationLogger.Debug($"LOG_HOTSPOTS - Cancel: {e.Cancel}")

                Try
                    MyValidationLogger?.Debug($"LOG_HOTSPOTS - StackTrace NO ERROR: {System.Environment.StackTrace}")
                Catch ex As Exception
                    MyValidationLogger?.Debug($"LOG_HOTSPOTS - StackTrace konnte nicht ermittelt werden: {ex.Message}")
                End Try

                ' Zusätzliche Diagnostik
                MyValidationLogger.Debug($"LOG_HOTSPOTS - _FormClosing-Flag: {_FormClosing}")
                MyValidationLogger.Debug($"LOG_HOTSPOTS - CURRENT_DOC_GUID: {CURRENT_DOC_GUID}")
                MyValidationLogger.Debug($"LOG_HOTSPOTS - CURRENT_ProfilGUID: {CURRENT_ProfilGUID}")
                ' ========== ENDE DIAGNOSE ==========
            End If

            Dim perfStart As DateTime = DateTime.MinValue
            Dim perfLastCheck As DateTime = DateTime.MinValue
            If LOG_HOTSPOTS Then
                perfStart = DateTime.Now
                perfLastCheck = perfStart
                MyValidationLogger.Info("LOG_HOTSPOTS - [PERF frmValidation_FormClosing] START")
            End If

            _FormClosing = True

            If Not Me.IsDisposed AndAlso Application.OpenForms().OfType(Of frmValidator_Messages).Any Then
                If Not IsNothing(frmMessages) AndAlso Not frmMessages.IsDisposed Then
                    Try
                        frmMessages.Close()
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ [FormClosing] frmMessages.Close() failed: {ex.Message}")
                    End Try
                End If
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS -  frmValidation_FormClosing] nach Messages-Close: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            If Not Me.IsDisposed Then
                Try
                    ' Position und Größe speichern
                    My.Settings.frmValidatorSize = Me.Size
                    My.Settings.frmValidatorPosition = Me.Location
                    My.Settings.frmValidatorWindowState = If(Me.WindowState = FormWindowState.Maximized, "Maximized", "Normal")
                    My.Settings.Save()
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ [FormClosing] Settings.Save() failed: {ex.Message}")
                    MyValidationLogger.Error(ex)
                End Try
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS -  frmValidation_FormClosing] nach Settings.Save: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            If INACTIVITY_DURATION <> 0 Then
                Try
                    frmMain.Timer_Inactivity_Reset_Disable("FormClosing")
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ [FormClosing] Timer_Inactivity failed: {ex.Message}")
                End Try
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] nach Timer-Reset: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            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};"
                DatabaseFallback.ExecuteNonQueryECM(oSQL)
            Catch ex As Exception
                MyValidationLogger.Error(ex)
                MsgBox("Error in delete jumped files:" & vbcrlf & ex.Message, MsgBoxStyle.Critical)
            End Try

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] nach DB-Cleanup:  {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            Reset_CurrentReferences()

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] nach Reset_CurrentReferences: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            Try
                If Not IsNothing(DocumentViewer1) AndAlso Not DocumentViewer1.IsDisposed Then
                    DocumentViewer1.CloseDocument()
                    DocumentViewer1.Done()
                End If
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ Unexpected error in DocumentViewerValidator.Done: {ex.Message}")
            End Try


            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] nach DocumentViewer.Done: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            Try
                If _frmValidatorSearch IsNot Nothing AndAlso Not _frmValidatorSearch.IsDisposed Then
                    _frmValidatorSearch.Close()
                End If
            Catch ex As Exception
                MyValidationLogger.Error(ex)
            End Try


            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] nach ValidatorSearch.Close: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
            ' ========== NEU: Temp-Ordner bereinigen ==========
            Try
                If COPY_WMFILE_2TEMP = True Then
                    MyValidationLogger.Debug("🗑️ Bereinige Temp-Ordner beim Schließen...")
                    CleanupTempFolder()
                End If
            Catch cleanupEx As Exception
                MyValidationLogger.Warn($"⚠️ Fehler beim Bereinigen des Temp-Ordners: {cleanupEx.Message}")
            End Try
            ' ========== ENDE NEU ==========

            ' Overlay schließen (falls vorhanden)
            Try
                ForceCloseOverlay()
            Catch ex As Exception
                MyValidationLogger.Debug($"Overlay-Cleanup-Fehler ignoriert: {ex.Message}")
            End Try
            ' Cleanup DocumentPathHandler
            If _documentPathHandler IsNot Nothing Then
                _documentPathHandler.Cleanup()
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[LOG_HOTSPOTS - frmValidation_FormClosing] GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
            End If



        Finally
            ' WICHTIG: Guard wird NICHT zurückgesetzt, da die Form nun wirklich schließt.
            ' Ein Reset würde den erneuten BeginInvoke-Close wieder durchlassen.
            ' _isClosingGuard = False  ← absichtlich NICHT zurückgesetzt
        End Try
    End Sub
    Sub Reset_CurrentReferences()
        If Not IsNothing(DT_AdditionalSearches_Resultset_Docs) Then
            DT_AdditionalSearches_Resultset_Docs.Clear()
        End If
    End Sub

    Private Sub CleanupTempFolder()
        Try
            If String.IsNullOrEmpty(TEMP_DOCUMENT_FOLDER) Then
                MyValidationLogger.Debug("TEMP_DOCUMENT_FOLDER ist nicht gesetzt → Kein Cleanup erforderlich")
                Return
            End If

            If Not System.IO.Directory.Exists(TEMP_DOCUMENT_FOLDER) Then
                MyValidationLogger.Debug($"Temp-Ordner [{TEMP_DOCUMENT_FOLDER}] existiert nicht → Kein Cleanup erforderlich")
                Return
            End If

            ' Alle Dateien im Ordner ermitteln
            Dim files As String() = System.IO.Directory.GetFiles(TEMP_DOCUMENT_FOLDER)

            If files.Length = 0 Then
                MyValidationLogger.Debug($"Temp-Ordner [{TEMP_DOCUMENT_FOLDER}] ist bereits leer")
                Return
            End If

            ' Alle Dateien löschen
            Dim deletedCount As Integer = 0
            Dim errorCount As Integer = 0

            For Each filePath As String In files
                Try
                    System.IO.File.Delete(filePath)
                    deletedCount += 1
                    MyValidationLogger.Debug($"Datei gelöscht: [{System.IO.Path.GetFileName(filePath)}]")
                Catch fileEx As Exception
                    errorCount += 1
                    MyValidationLogger.Warn($"⚠️ Datei konnte nicht gelöscht werden: [{System.IO.Path.GetFileName(filePath)}] - {fileEx.Message}")
                End Try
            Next

            If errorCount = 0 Then
                MyValidationLogger.Debug($"✓ Temp-Ordner bereinigt: {deletedCount} Datei(en) gelöscht")
            Else
                MyValidationLogger.Warn($"⚠️ Temp-Ordner teilweise bereinigt: {deletedCount} gelöscht, {errorCount} Fehler")
            End If

        Catch ex As Exception
            MyValidationLogger.Error($"❌ Fehler beim Bereinigen des Temp-Ordners: {ex.Message}")
            MyValidationLogger.Error(ex)
        End Try
    End Sub

    Public Function Test_Additional_Data_Searches_Exist() As Boolean
        If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
            Dim oDataResultCommand As String
            Dim oDatatableDataResult As DataTable = Nothing

            If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
                'Check whether DocData is there
                oDataResultCommand = DT_FILTERED_PROFILE_SEARCHES_DATA.Rows(0).Item("SQL_COMMAND")
                oDataResultCommand = clsPatterns.ReplaceAllValues(oDataResultCommand, PanelValidatorControl, True)
                oDatatableDataResult = DatabaseFallback.GetDatatable(New GetDatatableOptions(oDataResultCommand, DatabaseType.ECM))
            End If

            Dim oDataResultsExist As Boolean = False

            If DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0 Then
                If Not IsNothing(oDatatableDataResult) Then
                    If oDatatableDataResult.Rows.Count > 0 Then
                        oDataResultsExist = True
                    End If
                End If

            End If

            Return oDataResultsExist
        Else
            Return False
        End If
    End Function
    Public Function Test_Additional_Doc_Searches_Exist() As Boolean
        If DT_FILTERED_PROFILE_SEARCHES_DOC.Rows.Count > 0 Then
            Dim oDocResultCommand As String
            Dim oDatatableDocResult As DataTable = Nothing

            'Check whether DocData is there
            Dim oConID = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("CONN_ID")
            oDocResultCommand = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("SQL_COMMAND")
            oDocResultCommand = clsPatterns.ReplaceAllValues(oDocResultCommand, PanelValidatorControl, True)
            oDatatableDocResult = DatabaseFallback.GetDatatableWithConnection(oDocResultCommand, oConID)

            Dim oDocResultsExist As Boolean = False
            If Not IsNothing(oDatatableDocResult) Then
                If oDatatableDocResult.Rows.Count > 0 Then
                    oDocResultsExist = True
                    DT_AdditionalSearches_Resultset_Docs = oDatatableDocResult
                End If
            End If

            Return oDocResultsExist
        Else
            Return False
        End If
    End Function
    Private Function IsValidDocSearchResult(pDt As DataTable) As Boolean
        If pDt Is Nothing Then Return False
        Return pDt.Columns.Contains("DocID") AndAlso pDt.Columns.Contains("FULL_FILENAME")
    End Function
    Public Sub Load_Additional_Searches(Preload As Boolean)
        If _isLoadingAdditionalSearches Then
            MyValidationLogger.Debug("Load_Additional_Searches: Reentrance erkannt, Aufruf wird übersprungen.")
            Exit Sub
        End If

        _isLoadingAdditionalSearches = True
        Try
            MyValidationLogger.Debug("========================================")
            MyValidationLogger.Debug("=== Load_Additional_Searches START ===")
            MyValidationLogger.Debug($"Parameter: Preload={Preload}")
            MyValidationLogger.Debug($"Current_Document: Id={Current_Document?.Id}, Path={Current_Document?.FullPath}")
            MyValidationLogger.Debug("========================================")

            Dim allSQLSearches As DataTable = DT_FILTERED_PROFILE_SEARCHES_DATA
            Dim allDocSearches As DataTable = DT_FILTERED_PROFILE_SEARCHES_DOC

            If allSQLSearches Is Nothing Then allSQLSearches = New DataTable()
            If allDocSearches Is Nothing Then allDocSearches = New DataTable()

            Dim hasDATASearches As Boolean = allSQLSearches.Rows.Count > 0
            Dim hasDOCSearches As Boolean = allDocSearches.Rows.Count > 0
            Dim hasConfiguredSearches As Boolean = hasDATASearches OrElse hasDOCSearches

            If Not hasConfiguredSearches Then
                AdditionalDataResultsExist = False
                AdditionalDocResultsExist = False
                rbnPgGroupAttmt.Visible = False
                Exit Sub
            End If

            If RibbonPageCustItm1 <> "" Then
                Attmt_bbtnitmShow.Caption = RibbonPageCustItm1
            End If
            rbnPgGroupAttmt.Visible = True
            Attmnt_bbtnitm_LoadonClick.Checked = CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK

            If _frmValidatorSearch Is Nothing OrElse _frmValidatorSearch.IsDisposed Then
                _frmValidatorSearch = New frmValidatorSearch(Me, Environment)
            End If

            MyValidationLogger.Debug("--- Ergebnisse werden geprüft (DATA/DOC) ---")
            Dim validSQLSearches As DataTable = allSQLSearches.Clone()
            Dim validDocSearches As DataTable = allDocSearches.Clone()

            If hasDATASearches Then
                For i As Integer = 0 To allSQLSearches.Rows.Count - 1
                    Dim searchRow = allSQLSearches.Rows(i)
                    Try
                        Dim tabTitle As String = If(searchRow.Item("TAB_TITLE")?.ToString(), $"SQL-Tab {i}")
                        Dim sqlCommand As String = searchRow.Item("SQL_COMMAND")?.ToString()
                        Dim connId As Integer = If(IsDBNull(searchRow.Item("CONN_ID")), 1, CInt(searchRow.Item("CONN_ID")))

                        If String.IsNullOrEmpty(sqlCommand) Then Continue For

                        Dim replacedSql As String = clsPatterns.ReplaceAllValues(sqlCommand, Me.PanelValidatorControl, True)
                        Dim testDT = DatabaseFallback.GetDatatable(New GetDatatableOptions(replacedSql, DatabaseType.ECM) With {.ConnectionId = connId})

                        If testDT IsNot Nothing AndAlso testDT.Rows.Count > 0 Then
                            validSQLSearches.ImportRow(searchRow)
                            MyValidationLogger.Info($"✓ SQL-Search '{tabTitle}': {testDT.Rows.Count} Ergebnisse gefunden")
                        Else
                            MyValidationLogger.Debug($"ℹ️ SQL-Search '{tabTitle}': Keine Ergebnisse gefunden")
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Error($"❌ Fehler beim Verarbeiten von SQL-Search Index {i}", ex)
                    End Try
                Next
            End If

            If hasDOCSearches Then
                For i As Integer = 0 To allDocSearches.Rows.Count - 1
                    Dim searchRow = allDocSearches.Rows(i)
                    Try
                        Dim tabTitle As String = If(searchRow.Item("TAB_TITLE")?.ToString(), $"Doc-Tab {i}")
                        Dim sqlCommand As String = searchRow.Item("SQL_COMMAND")?.ToString()
                        Dim connId As Integer = If(IsDBNull(searchRow.Item("CONN_ID")), 1, CInt(searchRow.Item("CONN_ID")))

                        If String.IsNullOrEmpty(sqlCommand) Then Continue For

                        Dim replacedSql As String = clsPatterns.ReplaceAllValues(sqlCommand, Me.PanelValidatorControl, True)
                        Dim testDT = DatabaseFallback.GetDatatable(New GetDatatableOptions(replacedSql, DatabaseType.ECM) With {.ConnectionId = connId})

                        If testDT IsNot Nothing AndAlso testDT.Rows.Count > 0 Then
                            If IsValidDocSearchResult(testDT) Then
                                validDocSearches.ImportRow(searchRow)
                                MyValidationLogger.Info($"✓ Doc-Search '{tabTitle}': {testDT.Rows.Count} Dokumente gefunden")
                            Else
                                MyValidationLogger.Warn($"⚠️ Doc-Search '{tabTitle}' liefert kein Dokument-Schema (DocID/FULL_FILENAME) und wird übersprungen.")
                            End If
                        Else
                            MyValidationLogger.Debug($"ℹ️ Doc-Search '{tabTitle}': Keine Ergebnisse gefunden")
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Error($"❌ Fehler beim Verarbeiten von Doc-Search Index {i}", ex)
                    End Try
                Next
            End If

            AdditionalDataResultsExist = validSQLSearches.Rows.Count > 0
            AdditionalDocResultsExist = validDocSearches.Rows.Count > 0
            MyValidationLogger.Debug($"Ergebnisprüfung abgeschlossen: AdditionalDataResultsExist={AdditionalDataResultsExist}, AdditionalDocResultsExist={AdditionalDocResultsExist}")
            rbnPgGroupAttmt.Visible = AdditionalDataResultsExist OrElse AdditionalDocResultsExist
            MyValidationLogger.Debug($"rbnPgGroupAttmt.Visible gesetzt auf: {rbnPgGroupAttmt.Visible} | Stack: {New System.Diagnostics.StackTrace(True).ToString().Split(vbCrLf)(1)}")

            If Not AdditionalDataResultsExist AndAlso Not AdditionalDocResultsExist Then
                If _frmValidatorSearch IsNot Nothing AndAlso Not _frmValidatorSearch.IsDisposed Then
                    Dim emptySql As DataTable = allSQLSearches.Clone()
                    Dim emptyDoc As DataTable = allDocSearches.Clone()
                    _frmValidatorSearch._DTDATASearches = emptySql
                    _frmValidatorSearch._DTDocSearches = emptyDoc
                    _frmValidatorSearch.TabPreload(0, 0, emptySql, emptyDoc)
                End If

                MyValidationLogger.Debug("Load_Additional_Searches: Keine Ergebnisse (DATA/DOC) -> Exit.")
                Exit Sub
            End If

            If Preload Then
                MyValidationLogger.Debug("--- PRELOAD-MODUS aktiviert (mit Show) ---")
                Dim preloadSQL As DataTable = If(allSQLSearches.Rows.Count > 0, allSQLSearches.Copy(), allSQLSearches.Clone())
                Dim preloadDoc As DataTable = If(allDocSearches.Rows.Count > 0, allDocSearches.Copy(), allDocSearches.Clone())

                _frmValidatorSearch._DTDATASearches = preloadSQL
                _frmValidatorSearch._DTDocSearches = preloadDoc
                _frmValidatorSearch.TabPreload(preloadSQL.Rows.Count, preloadDoc.Rows.Count, preloadSQL, preloadDoc)

                ' Sichtbarkeit explizit setzen, bevor Return
                rbnPgGroupAttmt.Visible = AdditionalDataResultsExist OrElse AdditionalDocResultsExist

                ' Vorgabe: Preload=True => Formular öffnen
                If Not _frmValidatorSearch.Visible Then
                    _frmValidatorSearch.Show()
                End If

                Return
            End If

            MyValidationLogger.Debug("--- NORMAL-MODUS aktiviert (nur vorbereiten, NICHT Show) ---")
            Dim sqlForUi As DataTable = If(validSQLSearches.Rows.Count > 0, validSQLSearches.Copy(), validSQLSearches.Clone())
            Dim docForUi As DataTable = If(validDocSearches.Rows.Count > 0, validDocSearches.Copy(), validDocSearches.Clone())

            _frmValidatorSearch._DTDATASearches = sqlForUi
            _frmValidatorSearch._DTDocSearches = docForUi
            _frmValidatorSearch.TabPreload(sqlForUi.Rows.Count, docForUi.Rows.Count, sqlForUi, docForUi)

            ' Vorgabe: Preload=False => nur vorbereiten, KEIN Show hier
            MyValidationLogger.Debug("Load_Additional_Searches: Vorbereitung abgeschlossen (Preload=False), Formular bleibt geschlossen.")

        Catch ex As Exception
            MyValidationLogger.Error("❌ Kritischer Fehler in Load_Additional_Searches", ex)
        Finally
            _isLoadingAdditionalSearches = False
            MyValidationLogger.Debug("=== Load_Additional_Searches END ===")
        End Try
    End Sub
    Private Sub EnsureSqlControlLookup()
        If _CachedSqlControlsByGuid IsNot Nothing Then
            Return
        End If

        _CachedSqlControlsByGuid = New Dictionary(Of Integer, List(Of DataRow))()

        If DTCONTROLS_WITH_SQL Is Nothing OrElse DTCONTROLS_WITH_SQL.Rows.Count = 0 Then
            Return
        End If

        For Each row As DataRow In DTCONTROLS_WITH_SQL.Rows
            If row.ItemEx("PROFIL_ID", 0) <> CURRENT_ProfilGUID Then
                Continue For
            End If

            Dim controlId As Integer
            If Not Integer.TryParse(row.Item("GUID").ToString(), controlId) Then
                Continue For
            End If

            Dim list As List(Of DataRow) = Nothing
            If Not _CachedSqlControlsByGuid.TryGetValue(controlId, list) Then
                list = New List(Of DataRow)()
                _CachedSqlControlsByGuid(controlId) = list
            End If
            list.Add(row)
        Next
    End Sub
    Sub LoadSQLData(control As Control, pControlId As Integer)
        Try
            If TypeOf control Is Label Then
                Exit Sub
            End If

            MyValidationLogger.Debug($"in LoadSQLData for ControlID [{pControlId}]...")

            EnsureSqlControlLookup()

            Dim rows As List(Of DataRow) = Nothing
            If _CachedSqlControlsByGuid Is Nothing OrElse Not _CachedSqlControlsByGuid.TryGetValue(pControlId, rows) Then
                Exit Sub
            End If

            For Each row As DataRow In rows
                Dim name As String = row.Item("NAME")
                Dim oGUID As String = row.Item("GUID")
                Dim oReadOnly As Boolean = row.Item("READ_ONLY")
                MyValidationLogger.Debug($"LoadSQLData for Control [{name}] with GUID [{oGUID}] ...")

                If oReadOnly = True Then
                    MyValidationLogger.Debug("Control for Index [{0}] is read-only. Continuing.")
                    Continue For
                End If

                Dim oConnectionId As Integer = 1
                If Not IsDBNull(row.Item("CONNECTION_ID")) Then
                    oConnectionId = row.Item("CONNECTION_ID")
                Else
                    MyValidationLogger.Warn($"CONNECTION_ID ist NULL für Control [{name}]. Verwende Default-Wert 1.")
                End If

                If IsDBNull(row.Item("SQL_UEBERPRUEFUNG")) Then
                    Continue For
                End If

                Dim oSQLStatement As String = row.Item("SQL_UEBERPRUEFUNG")

                If String.IsNullOrWhiteSpace(oSQLStatement) Then
                    Continue For
                End If

                oSQLStatement = clsPatterns.ReplaceAllValues(oSQLStatement, PanelValidatorControl, True)
                If String.IsNullOrWhiteSpace(oSQLStatement) Then
                    Continue For
                End If
                If clsPatterns.HasComplexPatterns(oSQLStatement) Then
                    MyValidationLogger.Warn($"⚠️ Unexpected error LoadSQLData2 - sql Statement still has complex patterns! [{oSQLStatement}]")
                    Continue For
                End If

                Dim oDTContent As DataTable = GetCachedDatatable(oSQLStatement, oConnectionId)
                If oDTContent Is Nothing OrElse oDTContent.Rows.Count = 0 Then
                    Continue For
                End If

                Dim oValue

                If TypeOf control Is LookupControl3 Then
                    Try
                        Dim lookup As LookupControl3 = control
                        MyValidationLogger.Debug($"[LoadSQLData DEBUG] Lookup [{name}] konfiguriert:")
                        MyValidationLogger.Debug($"  DataSource-Typ: {lookup.Properties.DataSource?.GetType()}")
                        MyValidationLogger.Debug($"  ValueMember: [{lookup.Properties.ValueMember}]")
                        MyValidationLogger.Debug($"  DisplayMember: [{lookup.Properties.DisplayMember}]")
                        Dim originalValueMember = lookup.Properties.ValueMember
                        Dim originalDisplayMember = lookup.Properties.DisplayMember

                        Dim previousSelectedValues As List(Of String) = Nothing
                        If lookup.Properties.SelectedValues IsNot Nothing AndAlso lookup.Properties.SelectedValues.Count > 0 Then
                            previousSelectedValues = New List(Of String)(lookup.Properties.SelectedValues)
                            MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Alte SelectedValues gesichert: [{String.Join(",", previousSelectedValues)}]")
                        End If

                        lookup.Properties.BeginUpdate()
                        Try
                            lookup.Properties.DataSource = oDTContent

                            Dim valueMember As String = originalValueMember
                            If String.IsNullOrWhiteSpace(valueMember) OrElse Not oDTContent.Columns.Contains(valueMember) Then
                                valueMember = oDTContent.Columns(0).ColumnName
                            End If

                            Dim displayMember As String = originalDisplayMember
                            If String.IsNullOrWhiteSpace(displayMember) OrElse Not oDTContent.Columns.Contains(displayMember) Then
                                displayMember = valueMember
                            End If

                            lookup.Properties.ValueMember = valueMember
                            lookup.Properties.DisplayMember = displayMember

                            If previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then
                                Dim validValues As New List(Of String)

                                For Each oldValue As String In previousSelectedValues
                                    Dim exists = oDTContent.AsEnumerable().
                                        Any(Function(r) r.Item(valueMember).ToString = oldValue)

                                    If exists Then
                                        validValues.Add(oldValue)
                                        MyValidationLogger.Debug($"[LoadSQLData BUGFIX] Wert [{oldValue}] existiert im neuen DataSource ✓")
                                    Else
                                        MyValidationLogger.Warn($"⚠️ [LoadSQLData BUGFIX] Wert [{oldValue}] existiert NICHT im neuen DataSource ✗")
                                    End If
                                Next

                                If validValues.Count > 0 Then
                                    lookup.Properties.SelectedValues = validValues
                                    MyValidationLogger.Debug($"[LoadSQLData BUGFIX] SelectedValues wiederhergestellt: [{String.Join(",", validValues)}]")
                                End If
                            End If
                        Finally
                            lookup.Properties.EndUpdate()
                        End Try

                    Catch ex As Exception
                        MyValidationLogger.Warn("⚠️ Error in LookUpLoadSQLData: " & ex.Message)
                    End Try

                ElseIf TypeOf control Is DevExpress.XtraEditors.TextEdit Or TypeOf control Is MemoEdit Then
                    Try
                        Dim firstRow As DataRow = oDTContent.Rows(0)

                        Dim value = firstRow.Item(0)

                        DirectCast(control, BaseEdit).EditValue = value
                        oValue = value
                    Catch ex As Exception
                        MyValidationLogger.Warn("⚠️ Error in TextBoxLoadSQLData: " & ex.Message)
                    End Try
                ElseIf TypeOf control Is Windows.Forms.ComboBox Then
                    Try
                        Dim oMyComboBox As Windows.Forms.ComboBox = control
                        ' Aktuellen TEXT sichern (nicht Index – der kann nach Refresh an anderer Position sein)
                        Dim previousText As String = oMyComboBox.Text

                        Dim oselectedIndex = oMyComboBox.SelectedIndex
                        MyValidationLogger.Debug($"oMyComboBox {oMyComboBox.Name} - Saving selected index {oselectedIndex}")
                        Dim list As New List(Of String)

                        For Each _row As DataRow In oDTContent.Rows
                            list.Add(_row.Item(0))
                        Next

                        oMyComboBox.DataSource = list
                        oMyComboBox.SelectedIndex = oselectedIndex

                    Catch ex As Exception
                        MyValidationLogger.Warn("⚠️ Error in ComboBoxLoadSQLData: " & ex.Message)
                    End Try

                ElseIf TypeOf control Is GridControl Then
                    Try
                        Dim dataGridView As GridControl = control
                        Dim oDataSource As DataTable = dataGridView.DataSource

                        If oDataSource Is Nothing Then
                            oDataSource = oDTContent.Clone()
                        End If

                        If oDataSource.Rows.Count = 0 Then
                            For Each oColumn As DataColumn In oDTContent.Columns
                                If oDataSource.Columns(oColumn.ColumnName) Is Nothing Then
                                    oDataSource.Columns.Add(oColumn.ColumnName, oColumn.DataType)
                                End If
                            Next

                            For Each oRow As DataRow In oDTContent.Rows
                                oDataSource.ImportRow(oRow)
                            Next

                            dataGridView.DataSource = oDataSource
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Warn("⚠️ Error in GridControlSQLData: " & ex.Message)
                    End Try
                End If
            Next
        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ {ex.Message} - Loading ControlID: {pControlId}")
            MsgBox("Error in LoadSQLData: " & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
        End Try
    End Sub
    Private Function PreventNulletc(myObject As Object, pType As String)
        If IsDBNull(myObject) Then
            If pType = "String" Then
                Return String.Empty
            Else
                Return 0
            End If

        ElseIf IsNothing(myObject) Then
            If pType = "String" Then
                Return String.Empty
            Else
                Return 0
            End If
        Else
            Return myObject
        End If
    End Function
    Sub Create_Controls()
        If LOG_PERF Then PerformanceLogger.Info("Create_Controls")

        Dim oControlInfo As String
        Try
            _CachedControlsByGuid = Nothing  ' Cache invalidieren
            PanelValidatorControl.Controls.Clear()
            _CachedLookupControlsByRepository = New Dictionary(Of RepositoryItemLookupControl3, LookupControl3)()
            Dim oSQL As String
            Dim oFilter As String = $"LANGUAGE = '{USER_LANGUAGE}' AND PROFIL_ID = {CURRENT_ProfilGUID}"
            DT_CONTROLS = GetControlMetaBySql(oFilter, "Y_LOC, X_LOC")
            ' ========== NEU: Einmalige Gruppierung für SetControlValues_FromControl ==========
            If DT_CONTROLS IsNot Nothing AndAlso DT_CONTROLS.Rows.Count > 0 Then
                _CachedControlsBySetControlData = New Dictionary(Of Integer, DataRow)()

                For Each row As DataRow In DT_CONTROLS.AsEnumerable().Where(Function(r) Not String.IsNullOrWhiteSpace(r.ItemEx("SET_CONTROL_DATA", String.Empty)))
                    Dim controlId As Integer = row.Item("GUID")
                    _CachedControlsBySetControlData(controlId) = row
                Next
            End If
            ' ========== ENDE ==========

            oSQL = $"SELECT IIF(LANG.CAPTION IS NULL,T.SPALTEN_HEADER,LANG.CAPTION) SPALTEN_HEADER_LANG, T.*  from TBPM_CONTROL_TABLE T WITH (NOLOCK) INNER JOIN TBPM_PROFILE_CONTROLS T1 WITH (NOLOCK) ON T.CONTROL_ID = T1.GUID
                LEFT JOIN (SELECT * FROM TBPM_CONTOL_TABLE_LANG WHERE LANG_CODE = '{USER_LANGUAGE}') LANG ON T.GUID = LANG.COL_ID WHERE T1.CONTROL_ACTIVE = 1  AND  T.CONTROL_ID = T1.GUID AND T1.PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY T.SEQUENCE"
            DT_COLUMNS_GRID = DatabaseFallback.GetDatatable("TBPM_CONTROL_TABLE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID} AND LANG_CODE = '{USER_LANGUAGE}' ",
                .SortByColumn = "SEQUENCE"
            })
            oSQL = "SELECT T1.GUID As CONTROL_ID, T1.PROFIL_ID, T.CONNECTION_ID, T.SQL_COMMAND, T.SPALTENNAME,T.FORMATTYPE,T.FORMATSTRING, T.ADVANCED_LOOKUP from TBPM_CONTROL_TABLE T WITH (NOLOCK), TBPM_PROFILE_CONTROLS T1 WITH (NOLOCK) WHERE T1.CONTROL_ACTIVE = 1 AND T.CONTROL_ID = T1.GUID AND T1.PROFIL_ID = " & CURRENT_ProfilGUID & " AND LEN(T.SQL_COMMAND) > 0 ORDER BY T.SEQUENCE"
            'DT_COLUMNS_GRID_WITH_SQL = DataASorDB.GetDatatable("DD_ECM", oSQL, "DTGRID_SQL_DEFINITION", $"PROFIL_ID = {CURRENT_ProfilGUID}", "SEQUENCE")
            DT_COLUMNS_GRID_WITH_SQL = DatabaseFallback.GetDatatable("DTGRID_SQL_DEFINITION", New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}",
                .SortByColumn = "SEQUENCE"
            })

            oSQL = "SELECT 
                    T1.GUID As CONTROL_ID, 
                    T1.PROFIL_ID, 
                    T.CONNECTION_ID, 
                    T.SQL_COMMAND, 
                    T.SPALTENNAME,
                    T.FORMATTYPE,
                    T.FORMATSTRING,
                    T.ADVANCED_LOOKUP 
                FROM 
                    TBPM_CONTROL_TABLE T,
                    TBPM_PROFILE_CONTROLS T1 
                WHERE 
                    T1.CONTROL_ACTIVE = 1 AND 
                    T.CONTROL_ID = T1.GUID AND 
                    T1.PROFIL_ID = " & CURRENT_ProfilGUID & " AND 
                    LEN(T.SQL_COMMAND) > 0 AND 
                    T.SQL_COMMAND LIKE '%{#CTRL%' 
                ORDER BY T.SEQUENCE"
            'DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER = DataASorDB.GetDatatable("DD_ECM", oSQL, "DTGRID_SQL_DEFINITION", $"PROFIL_ID = {CURRENT_ProfilGUID}", "SEQUENCE")
            DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER = DatabaseFallback.GetDatatable("DTGRID_SQL_DEFINITION", New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}",
                .SortByColumn = "SEQUENCE"
            })

            Dim oTabIndexCounter As Integer = 0

            For Each oControlRow As DataRow In DT_CONTROLS.Rows
                Dim oMyControl As Control
                Dim oIndexName = oControlRow.Item("INDEX_NAME")
                Dim oControlID = oControlRow.Item("GUID")
                oControlInfo = $"CtrlID: {oControlID} - CtrlName: {oControlRow.Item("NAME")} - CtrlIndex: {oControlRow.Item("INDEX_NAME")}"
                Try
                    If LOG_PERF Then PerformanceLogger.Info(oControlInfo + "")
                    Select Case oControlRow.Item("CTRL_TYPE").ToString.ToUpper
                        Case ClassControlCreator.PREFIX_TEXTBOX
                            If LOG_PERF Then PerformanceLogger.Info("Create_Controls/Textbox")

                            Try
                                oControlInfo = ClassControlCreator.PREFIX_TEXTBOX & "#" & oControlInfo
                                MyValidationLogger.Debug($"[{oControlInfo}] - TXT Try to create control...")

                                Dim txt As BaseEdit = ControlCreator.CreateExistingTextbox(oControlRow, False)
                                If oIndexName = "@@DISPLAY_ONLY" Then
                                    txt.ReadOnly = True
                                End If
                                AddHandler txt.GotFocus, AddressOf OnTextBoxFocus
                                AddHandler txt.LostFocus, AddressOf OnTextBoxLostFocus
                                AddHandler txt.KeyUp, AddressOf OnTextBoxKeyUp
                                AddHandler txt.KeyDown, AddressOf OnTextBoxKeyDown
                                AddHandler txt.EditValueChanged, AddressOf OnTextBoxEditValueChanged

                                oMyControl = txt
                                MyValidationLogger.Debug($"[{oControlInfo}] - TXT Created!!")
                            Catch ex As Exception
                                MyValidationLogger.Warn($"⚠️ Unexpected error in Create_Controls TXT [{oControlInfo}]: {ex.Message}")
                            End Try
                        Case "LBL"
                            oControlInfo = "LBL#" & oControlInfo
                            oMyControl = ControlCreator.CreateExistingLabel(oControlRow, False)
                        Case "CMB"
                            If LOG_PERF Then PerformanceLogger.Info("Create_Controls/ComboBox")

                            oControlInfo = "CMB#" & oControlInfo
                            MyValidationLogger.Debug($"[{oControlInfo}] - CMB Try to create control...")
                            If oControlRow.Item("READ_ONLY") Then
                                Dim cmbReadonly = ControlCreator.CreateExistingTextbox(oControlRow, False)
                                oMyControl = cmbReadonly
                            Else
                                Dim oComboBox = ControlCreator.CreateExistingCombobox(oControlRow, False)

                                AddHandler oComboBox.SelectedValueChanged, AddressOf OnCmbselectedIndex
                                AddHandler oComboBox.GotFocus, Sub(sender As Control, e As EventArgs)
                                                                   If DirectCast(oComboBox.Tag, ClassControlCreator.ControlMetadata).ReadOnly = False Then
                                                                       oComboBox.BackColor = Color.LightSteelBlue
                                                                   End If
                                                               End Sub
                                AddHandler oComboBox.LostFocus, Sub(sender As Control, e As EventArgs)
                                                                    If DirectCast(oComboBox.Tag, ClassControlCreator.ControlMetadata).ReadOnly = False Then
                                                                        oComboBox.BackColor = Color.White
                                                                    End If
                                                                End Sub

                                MyValidationLogger.Debug("In add_ComboBox - GUID: " & oControlID)
                                Dim oCONID = 1
                                If IsDBNull(oControlRow.Item("CONNECTION_ID")) Then
                                    MyValidationLogger.Warn($"⚠️ CONNECTION_ID is NULL for Control [{oControlInfo}]. Using default value 1.")
                                Else
                                    oCONID = oControlRow.Item("CONNECTION_ID")
                                End If


                                If oCONID >= 0 Then
                                    Dim oCommandSQL_UBPF
                                    Try
                                        oCommandSQL_UBPF = oControlRow.Item("SQL_UEBERPRUEFUNG")
                                    Catch ex As Exception
                                        oCommandSQL_UBPF = ""
                                    End Try
                                    MyValidationLogger.Debug("ConID <> String.Empty")
                                    If oCommandSQL_UBPF <> String.Empty Then
                                        MyValidationLogger.Debug("ConID > 0 And commandsql <> String.Empty")
                                        Try
                                            oSQL = PreventNulletc(oControlRow.Item("SQL_UEBERPRUEFUNG"), "String")

                                            If clsPatterns.HasOnlySimplePatterns(oSQL) Then
                                                MyValidationLogger.Debug("SQL HasOnlySimplePatterns!")
                                                oSQL = clsPatterns.ReplaceInternalValues(oSQL)
                                                oSQL = clsPatterns.ReplaceControlValues(oSQL, PanelValidatorControl, True)

                                                Dim oDT As DataTable = GetCachedDatatable(oSQL, oCONID)
                                                oComboBox.BeginUpdate()
                                                oComboBox.DataSource = Nothing
                                                If Not IsNothing(oDT) AndAlso oDT.Rows.Count > 0 Then
                                                    Dim list As New List(Of String)
                                                    For Each oRow As DataRow In oDT.Rows
                                                        list.Add(oRow.Item(0))
                                                    Next
                                                    oComboBox.DataSource = list
                                                End If
                                                oComboBox.SelectedIndex = -1
                                                oComboBox.EndUpdate()
                                            End If
                                        Catch ex As Exception
                                            MyValidationLogger.Warn($"⚠️ Unexpected error in CMB GetValues SQL - Error: {ex.Message}")
                                        End Try
                                    Else
                                        MyValidationLogger.Debug("Else Row 571")
                                    End If
                                Else
                                    MyValidationLogger.Debug("AListe Handling")
                                    Dim AListe As String = oControlRow.Item("CHOICE_LIST")
                                    MyValidationLogger.Debug("In add_ComboBox - AListe: " & AListe)
                                    If AListe Is Nothing = False Then
                                        'Dim liste = _windreamPM.GetValuesfromAuswahlliste(AListe)
                                        Dim liste = WINDREAM.GetValuesfromAuswahlliste(AListe)
                                        If liste IsNot Nothing Then
                                            oComboBox.Items.Add("")
                                            For Each index As String In liste
                                                oComboBox.Items.Add(index)
                                            Next
                                            oComboBox.SelectedIndex = -1
                                        Else
                                            MsgBox("Resultliste windream is nothing!", MsgBoxStyle.Exclamation, AListe)
                                        End If
                                    Else
                                        MsgBox("AListe from database is nothing!", MsgBoxStyle.Exclamation, AListe)
                                    End If
                                End If

                                oMyControl = oComboBox
                            End If

                            MyValidationLogger.Debug($"[{oControlInfo}] - CMB CONTROL created")

                        Case "DTP"
                            oControlInfo = "DTP#" & oControlInfo
                            oMyControl = ControlCreator.CreateExistingDatepicker(oControlRow, False)

                        Case "DGV"
                            Dim dgv = ControlCreator.CreateExistingDataGridView(oControlRow, False)

                            AddHandler dgv.RowValidating, AddressOf onDGVRowValidating

                            oMyControl = dgv

                        Case "LOOKUP"
                            If LOG_PERF Then PerformanceLogger.Info("Create_Controls/Lookup")

                            oControlInfo = "LOOKUP#" & oControlInfo
                            Dim oMultiselect = CBool(oControlRow.Item("MULTISELECT"))
                            Dim oReadonly = oControlRow.Item("READ_ONLY")

                            If oMultiselect = False And oReadonly = True Then
                                Dim lookupReadonly = ControlCreator.CreateExistingTextbox(oControlRow, False)
                                oMyControl = lookupReadonly
                            Else
                                Dim MyLookupControl As LookupControl3 = ControlCreator.CreateExistingLookupControl(oControlRow, False)

                                MyLookupControl.Properties.PreventDuplicates = oControlRow.Item("VKT_PREVENT_MULTIPLE_VALUES")
                                'MyLookupControl.Properties.AllowAddNewValues = oControlRow.Item("VKT_ADD_ITEM")
                                MyLookupControl.Properties.MultiSelect = oMultiselect
                                Dim oCommandSQL_UBPF
                                Try
                                    oCommandSQL_UBPF = oControlRow.Item("SQL_UEBERPRUEFUNG")
                                    oCommandSQL_UBPF = oControlRow.Item("SQL_UEBERPRUEFUNG")
                                Catch ex As Exception
                                    oCommandSQL_UBPF = ""
                                End Try
                                If oCommandSQL_UBPF <> String.Empty Then
                                    Try
                                        oSQL = PreventNulletc(oControlRow.Item("SQL_UEBERPRUEFUNG"), "String")

                                        If clsPatterns.HasOnlySimplePatterns(oSQL) Then
                                            oSQL = clsPatterns.ReplaceInternalValues(oSQL)
                                            oSQL = clsPatterns.ReplaceControlValues(oSQL, PanelValidatorControl, True)

                                            Dim oDT As DataTable = GetCachedDatatable(oSQL, 1)

                                            MyLookupControl.Properties.DataSource = Nothing
                                            If Not IsNothing(oDT) AndAlso oDT.Rows.Count > 0 Then
                                                MyLookupControl.Properties.DataSource = oDT
                                                MyLookupControl.Properties.ValueMember = oDT.Columns.Item(0).ColumnName
                                                MyLookupControl.Properties.DisplayMember = oDT.Columns.Item(0).ColumnName
                                            End If
                                        End If
                                    Catch ex As Exception
                                        MyValidationLogger.Warn($"⚠️ Unexpected error in LOOKUP GetValues SQL - Error: {ex.Message}")
                                    End Try
                                End If


                                If ObjectEx.NotNull(oControlRow.Item("DEFAULT_VALUE"), "") <> "" Then
                                    MyLookupControl.Properties.SelectedValues = New List(Of String) From {oControlRow.Item("DEFAULT_VALUE")}
                                End If

                                oMyControl = MyLookupControl
                                _CachedLookupControlsByRepository(MyLookupControl.Properties) = MyLookupControl
                                AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf LookupListChanged

                                Dim oFilteredData As DataTable = DT_CONTROLS.Clone()
                                Dim oExpression = $"SQL_UEBERPRUEFUNG like '%#CTRL#{oMyControl.Name}%'"
                                DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredData, LoadOption.PreserveChanges)
                                If oFilteredData.Rows.Count >= 1 Then
                                    MyValidationLogger.Debug($"createControlsLU - Found {oFilteredData.Rows.Count} Controls which are depending on {oMyControl.Name}")
                                    AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf onLookUpselectedValue
                                End If
                                oFilteredData = DT_CONTROLS.Clone()
                                oExpression = $"SQL_ENABLE like '%#CTRL#{oMyControl.Name}%'"
                                DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredData, LoadOption.PreserveChanges)
                                If oFilteredData.Rows.Count >= 1 Then
                                    MyValidationLogger.Debug($"createControlsLU - Found {oFilteredData.Rows.Count} Controls which' enable state is depending on {oMyControl.Name}")
                                    AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf onLookUpselectedValue
                                End If

                                oFilteredData = DT_CONTROLS.Clone()
                                oExpression = $"GUID = {oControlRow.Item("GUID")} and Len(SET_CONTROL_DATA) > 0"
                                DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredData, LoadOption.PreserveChanges)
                                If oFilteredData.Rows.Count = 1 Then
                                    AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf onLookUpselectedValue_Control2Set
                                End If
                                oFilteredData = DT_CONTROLS.Clone()

                                AddHandler MyLookupControl.GotFocus, Sub(sender As Control, e As EventArgs)
                                                                         If DirectCast(MyLookupControl.Tag, ClassControlCreator.ControlMetadata).ReadOnly = False Then
                                                                             MyLookupControl.BackColor = Color.LightSteelBlue
                                                                         End If
                                                                     End Sub
                                AddHandler MyLookupControl.LostFocus, Sub(sender As Control, e As EventArgs)
                                                                          If DirectCast(MyLookupControl.Tag, ClassControlCreator.ControlMetadata).ReadOnly = False Then
                                                                              MyLookupControl.BackColor = Color.White
                                                                          End If
                                                                      End Sub
                            End If

                        Case "CHK"
                            oControlInfo = "CHK#" & oControlInfo
                            oMyControl = ControlCreator.CreateExisingCheckbox(oControlRow, False)

                            Dim mycheckbox As CheckBox = oMyControl
                            AddHandler mycheckbox.CheckedChanged, AddressOf onCheckBox_CheckedChange


                        Case "TABLE"
                            If LOG_PERF Then PerformanceLogger.Info("Create_Controls/Table")

                            oControlInfo = "TABLE#" & oControlInfo

                            Dim oFilteredDatatable As DataTable = DT_COLUMNS_GRID.Clone()
                            Dim oExpression = $"CONTROL_ID = {oControlRow.Item("GUID")}"
                            DT_COLUMNS_GRID.Select(oExpression, "SEQUENCE").CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
                            If oFilteredDatatable.Rows.Count >= 1 Then
                                MyValidationLogger.Debug("We got a DTGRID_COLUMNS definition for [{0}] ", oControlInfo)
                            Else
                                MyValidationLogger.Debug("DTGRID_COLUMNS definition for control [{0}] does not contain any rows!", oControlInfo)
                                Continue For
                            End If

                            Dim oGrid = ControlCreator.CreateExistingGridControl(oControlRow, oFilteredDatatable, False, DocCurrency)
                            oMyControl = oGrid
                            ' NEU: GridView Event registrieren
                            AddHandler DirectCast(oGrid.MainView, GridView).CellValueChanged, AddressOf GridView_CellValueChanged
                            AddHandler DirectCast(oGrid.DataSource, DataTable).RowDeleted, AddressOf GridDataSource_RowDeleted
                            AddHandler DirectCast(oGrid.MainView, GridView).KeyDown, AddressOf GridView_KeyDown
                            AddHandler DirectCast(oGrid.MainView, GridView).RowDeleting, AddressOf GridView_RowDeleting
                        Case "LINE"

                            oMyControl = ControlCreator.CreateExistingLine(oControlRow, False)
                        Case "BUTTON"
                            Dim obutton = ControlCreator.CreateExistingButton(oControlRow, False)

                            AddHandler obutton.Click, AddressOf onCustomButtonClick
                            oMyControl = obutton
                    End Select
                    MyValidationLogger.Debug($"[{oControlInfo}]: End of Select...")
                    If TypeOf oMyControl IsNot Label Then

                        listofControls.Add(oMyControl.Name)
                        If first_control Is Nothing Then
                            ' If Not (oMyControl.GetType = GetType(LookupControl3) Or oMyControl.GetType = GetType(Button)) Then
                            first_control = oMyControl
                            'End If
                        End If
                        last_control = oMyControl
                        oMyControl.TabIndex = oTabIndexCounter
                    End If
                    ' oMyControl.Tag = CInt(oControlRow.Item("GUID"))
                    PanelValidatorControl.Controls.Add(oMyControl)

                    oTabIndexCounter += 1
                Catch ex As Exception
                    Dim st As New StackTrace(True)
                    st = New StackTrace(ex, True)
                    'MyValidationLogger.Error(ex)
                    Dim omsg = $"Unexpected Error in Create_Controls (Select Case) [{oControlInfo}] - ERROR: {ex.Message}"
                    MyValidationLogger.Warn(omsg)
                    If DEBUG = False Then MsgBox(omsg, MsgBoxStyle.Critical, "Attention:")
                End Try


            Next

            MyValidationLogger.Debug("Create_Controls finished!")

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            If DEBUG = False Then MsgBox("Error CreateControls: " & ex.Message, MsgBoxStyle.Critical, "Attention:")
        End Try
    End Sub
    Private Sub GridControlColumnWidthChanged(sender As System.Object, e As System.EventArgs)
        Try
            Dim oMyGridView As DevExpress.XtraGrid.Views.Grid.GridView = sender
            Dim oControlID = DirectCast(oMyGridView.GridControl.Tag, ClassControlCreator.ControlMetadata).Guid
            SaveDevExpressGridControl_Layout(CURRENT_ProfilGUID, oControlID, oMyGridView)
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try
    End Sub


    Sub Clear_all_Input()
        For Each inctrl As Control In Me.PanelValidatorControl.Controls
            Dim Type As Type = inctrl.GetType
            Select Case True
                Case Type = GetType(DevExpress.XtraEditors.TextEdit) Or Type = GetType(MemoEdit)
                    'inctrl.Text = ""
                    DirectCast(inctrl, BaseEdit).EditValue = Nothing
                Case Type = GetType(Windows.Forms.ComboBox)
                    Dim cmb As Windows.Forms.ComboBox = inctrl
                    cmb.SelectedIndex = -1
                    cmb.Text = String.Empty
                Case Type = GetType(DataGridView)
                    Dim dgv As DataGridView = inctrl
                    If dgv.Rows.Count > 0 Then
                        dgv.Rows.Clear()
                    End If
            End Select
        Next

        Focus_FirstControl()
    End Sub

    Public Sub OnTextBoxFocus(sender As Object, e As EventArgs)
        CountAction += 1
        Dim oTextbox As BaseEdit = sender
        Dim oMeta As ClassControlCreator.ControlMetadata = oTextbox.Tag
        Console.WriteLine($"[{CountAction}] OnFocus {oMeta.Name}")
        If oMeta.ReadOnly = False Then
            oTextbox.BackColor = Color.LightSteelBlue
            oTextbox.ForeColor = GraphicsEx.GetContrastedColor(Color.LightSteelBlue)
            oTextbox.SelectAll()
        End If
    End Sub

    Public Sub OnTextBoxLostFocus(sender As System.Object, e As System.EventArgs)
        CountAction += 1
        Dim oTextbox As BaseEdit = TryCast(sender, BaseEdit)

        ' ========== 1. NULL-Guards ==========
        If oTextbox Is Nothing Then
            Exit Sub
        End If

        Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oTextbox.Tag, ClassControlCreator.ControlMetadata)
        If oMeta Is Nothing Then
            Exit Sub
        End If

        ' ========== 2. Form-Closing Guard ==========
        If _FormClosing OrElse Me.IsDisposed Then
            Exit Sub
        End If

        ' ========== 3. Name-Guard für Cache ==========
        If String.IsNullOrEmpty(oMeta.Name) Then
            MyValidationLogger.Warn($"⚠️ [{CountAction}] oMeta.Name ist leer!")
            Exit Sub
        End If
        ' ========== ENDE Guards ==========

        Dim oeditvalue = oTextbox.EditValue
        Dim odisplayvalue = oTextbox.Text

        Console.WriteLine($"[{CountAction}] LostFocus - {oMeta.Name}")

        If oMeta.ReadOnly = False Then
            oTextbox.BackColor = oMeta.BackColor
            oTextbox.ForeColor = GraphicsEx.GetContrastedColor(oMeta.BackColor)
        End If

        If Not oMeta.IsDirty Then
            oMeta.IsDirty = True
            MyValidationLogger.Debug($"Control [{oMeta.Name}] marked as dirty")
        End If

        ' *** Cache aktualisieren (mit Try-Catch) ***
        Try
            clsPatterns.UpdateControlInCache(oMeta.Name, oTextbox.EditValue)
        Catch ex As Exception
            MyValidationLogger.Error($"Cache-Update failed: {ex.Message}")
        End Try

        SetControlValues_FromControl(oTextbox)
        Controls2beEnabled(oTextbox.Name)
        ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)
    End Sub

    Private Function GetControlID(ByVal PROFILEID As Integer, Controlname As String)
        For Each oROW As DataRow In DTVWCONTROL_INDEX.Rows

        Next
    End Function
    Private Sub OnTextBoxEditValueChanged(sender As Object, e As EventArgs)
        If _FormLoaded = False Or _Indexe_Loaded = False Then
            Exit Sub
        End If

        Dim oTextbox As BaseEdit = TryCast(sender, BaseEdit)
        If oTextbox Is Nothing Then
            Exit Sub
        End If

        Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oTextbox.Tag, ClassControlCreator.ControlMetadata)
        If oMeta Is Nothing OrElse oMeta.IsDirty Then
            Exit Sub
        End If

        oMeta.IsDirty = True
        MyValidationLogger.Debug($"TextBox [{oMeta.Name}] marked as dirty")
    End Sub
    Private Sub OnTextBoxKeyDown(sender As Object, e As KeyEventArgs)
        Dim oTextBox As BaseEdit = TryCast(sender, BaseEdit)
        If oTextBox Is Nothing Then
            Exit Sub
        End If

        If oTextBox.ReadOnly AndAlso e.Control AndAlso e.KeyCode = Keys.X Then
            e.Handled = True
            e.SuppressKeyPress = True
        End If
    End Sub
    Public Sub OnTextBoxKeyUp(sender As Object, e As KeyEventArgs)
        If _ControlHandleStarted = True Then
            _ControlHandleStarted = False
            Exit Sub
        End If

        Dim oTextBox As BaseEdit = sender
        If oTextBox.Text <> String.Empty And _FormClosing = False And _Indexe_Loaded = True And oTextBox.Height < 25 Then

            If (e.KeyCode = Keys.Return) Or (e.KeyCode = Keys.Tab) Or (e.KeyCode = Keys.Enter) Then
                Try
                    Dim oFilter = $"PROFIL_ID = {CURRENT_ProfilGUID} AND SQL_UEBERPRUEFUNG LIKE '%{oTextBox.Name}%'"

                    Dim DTCONTROLS_UEBP As DataTable = GetControlMetaBySql(oFilter)

                    If Not IsNothing(DTCONTROLS_UEBP) AndAlso DTCONTROLS_UEBP.Rows.Count > 0 Then
                        For Each oRow As DataRow In DTCONTROLS_UEBP.Rows
                            Try
                                Dim oControlName = oRow.Item("NAME").ToString
                                Dim oSqlStatement = oRow.Item("SQL_UEBERPRUEFUNG")
                                Dim oConnectionId = 1
                                If Not IsDBNull(oRow.Item("CONNECTION_ID")) Then
                                    oConnectionId = oRow.Item("CONNECTION_ID")
                                Else
                                    MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNull for control {oControlName} - Defaulting to 1")
                                End If

                                If Not IsDBNull(oSqlStatement) And Not IsDBNull(oConnectionId) Then
                                    oSqlStatement = clsPatterns.ReplaceAllValues(oSqlStatement, PanelValidatorControl, True)

                                    _DependingControl_In_Action = True
                                    Depending_Control_Set_Result(oControlName, oSqlStatement, oConnectionId)
                                    _DependingControl_In_Action = False
                                End If
                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                MyValidationLogger.Info("Unexpected Error in Display SQL result for control: " & oRow.Item("NAME") & " - ERROR: " & ex.Message)
                            End Try
                        Next
                    End If

                    ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)

                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    MyValidationLogger.Info("Unexpected Error in Eventhandler Variable SQL Result - ERROR: " & ex.Message)
                End Try
                If oTextBox.Name <> last_control.Name Then
                    Me.SelectNextControl(oTextBox, True, True, True, True)
                End If
            End If
        End If

    End Sub
    Private Sub onCustomButtonClick(sender As System.Object, e As System.EventArgs)
        Try
            Cursor = Cursors.WaitCursor
            Dim oButton As Windows.Forms.Button = sender
            Dim oControlID = DirectCast(oButton.Tag, ClassControlCreator.ControlMetadata).Guid
            Dim oSQL = ControlCreator.GET_CONTROL_PROPERTY(DT_CONTROLS, oControlID, "SQL_UEBERPRUEFUNG")
            If IsNothing(oSQL) OrElse String.IsNullOrWhiteSpace(oSQL.ToString()) Then
                MyValidationLogger.Warn(String.Format("⚠️ onCustomButtonClick - SQL_UEBERPRUEFUNG for ControlID {0} is empty!", oControlID))
                Exit Sub
            End If

            If Check_UpdateIndexe() = False Then
                MyValidationLogger.Warn("⚠️ onCustomButtonClick - Check_UpdateIndexe = False >> Exit Click")
                Exit Sub
            End If
            Override_SQLCommand = ControlCreator.GET_CONTROL_PROPERTY(DT_CONTROLS, oControlID, "SQL2")
            If IsNothing(Override_SQLCommand) Then
                Override_SQLCommand = ""
            End If
            oSQL = clsPatterns.ReplaceAllValues(oSQL, PanelValidatorControl, True)
            If IsNothing(oSQL) OrElse String.IsNullOrWhiteSpace(oSQL.ToString()) Then
                MyValidationLogger.Warn(String.Format("⚠️ onCustomButtonClick - SQL_UEBERPRUEFUNG for ControlID {0} is empty!", oControlID))
                Exit Sub
            End If
            Override_SQLCommand = clsPatterns.ReplaceAllValues(Override_SQLCommand, PanelValidatorControl, True)
            Dim oDT_ACTIONS As DataTable = DatabaseFallback.GetDatatableECM(oSQL) ', "onCustomButtonClick")
            If IsNothing(oDT_ACTIONS) Then
                MsgBox("Something went wrong in custom action - Please check Your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                Exit Sub
            ElseIf oDT_ACTIONS.Rows.Count = 0 Then
                MsgBox("Something went wrong in custom action (No row) - Please check Your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                Exit Sub
            End If
            Dim oAction
            Dim oControlName
            Dim oQuestion
            Dim oTitle
            Dim oCaption
            Dim oColor
            Dim oIncludeFI As Boolean = False
            Try
                oAction = oDT_ACTIONS?.Rows(0).Item("ActionType")
            Catch ex As Exception
                oAction = ""
            End Try
            Try
                oControlName = oDT_ACTIONS?.Rows(0).Item("Controlname")
            Catch ex As Exception
                oControlName = ""
            End Try
            Try
                oQuestion = oDT_ACTIONS?.Rows(0).Item("Question")
            Catch ex As Exception
                oQuestion = ""
            End Try
            Try
                oTitle = oDT_ACTIONS?.Rows(0).Item("Title")
            Catch ex As Exception
                oTitle = ""
            End Try
            Try
                oCaption = oDT_ACTIONS?.Rows(0).Item("CaptionButton").ToString
            Catch ex As Exception
                oCaption = ""
            End Try
            Try
                oColor = System.Drawing.Color.FromName(oDT_ACTIONS?.Rows(0).Item("Color"))
            Catch ex As Exception
                oColor = ""
            End Try
            Try
                oIncludeFI = oDT_ACTIONS?.Rows(0).Item("IncludeFI")
            Catch ex As Exception
            End Try
            Try
                OverrideAll = oDT_ACTIONS?.Rows(0).Item("OverrideAll")
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ Could not set OverrideAll {ex.Message}")
                OverrideAll = False
            End Try

            If OverrideAll = True Then
                MyValidationLogger.Info($"CURRENT_DOC_ID: {CURRENT_DOC_ID} - OverrideAll will be in Action!")
            End If
            MyValidationLogger.Debug($"ActionType [{oAction}]")
            Select Case oAction.ToString.ToUpper
                Case "SetButton".ToUpper
                    btnSave.Text = oCaption & " (F2)"
                    btnSave.Appearance.BackColor = oColor
                Case "Override_Question".ToUpper
                    If oQuestion <> "" Then
                        Dim result As MsgBoxResult
                        result = MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                        If result = MsgBoxResult.Yes Then
                            Override = True
                            Finish_WFStep(oIncludeFI)
                        End If
                    End If
                Case "Update_Single_Control".ToUpper
                    Dim oResult1 As Boolean = True
                    If oQuestion <> "" Then
                        Dim result As MsgBoxResult
                        result = MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                        If result = MsgBoxResult.No Then
                            oResult1 = False
                        End If
                    Else

                    End If
                    If oResult1 = True Then
                        Dim oREsult As Boolean = True
                        If Override_SQLCommand <> "" Then
                            oREsult = DatabaseFallback.ExecuteNonQueryECM(Override_SQLCommand)
                        End If
                        If oREsult = True Then
                            Reload_Controls(oControlName)
                        Else
                            MsgBox("Unexpected error in Button Refresh_Controls - Check Your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                        End If
                    End If
                Case "Update_Controls".ToUpper
                    If oQuestion <> "" Then
                        Dim result As MsgBoxResult
                        result = MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                        If result = MsgBoxResult.Yes Then
                            Dim oREsult As Boolean = True
                            If Override_SQLCommand <> "" Then
                                oREsult = DatabaseFallback.ExecuteNonQueryECM(Override_SQLCommand)
                            End If
                            If oREsult = True Then
                                SetStatusLabel("Refreshed single control", "Yellow")
                                FillIndexValues(False)
                            Else
                                MsgBox("Unexpected error in Button Refresh_Controls - Check Your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                            End If

                        End If
                    End If
                Case "Override_Direct".ToUpper
                    Override = True
                    If Check_UpdateIndexe() = True Then
                        Finish_WFStep(oIncludeFI)
                    End If

                Case "Override incFinal".ToUpper
                    If Check_UpdateIndexe() = True Then
                        Finish_WFStep(False)
                    End If
                Case "MsgboxResult".ToUpper
                    MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Case Else
                    MsgBox($"No configured action provided for onCustomButtonClick [{oAction}]", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                    MyValidationLogger.Warn($"⚠️ No configured action provided for onCustomButtonClick [{oAction}]")
            End Select
        Catch ex As Exception
            MyValidationLogger.Error(ex)

        End Try
        Cursor = Cursors.Default


    End Sub

    Public Sub onDGVRowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
        Dim dgv As DataGridView = sender
        Try
            Dim oFilter = String.Format("PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name)

            Dim DTFilteredRows As DataTable = GetControlMetaBySql(oFilter)

            If Not IsNothing(DTFilteredRows) And DTFilteredRows.Rows.Count > 0 Then
                For Each ROW As DataRow In DTFilteredRows.Rows
                    Try
                        Dim displayboxname = ROW.Item("NAME").ToString
                        Dim oConnectionID = 1
                        If Not IsDBNull(ROW.Item("CONNECTION_ID")) Then
                            oConnectionID = ROW.Item("CONNECTION_ID")
                        Else
                            MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNull for control {displayboxname} - Defaulting to 1")
                        End If
                        If Not IsDBNull(ROW.Item("SQL_UEBERPRUEFUNG")) Then
                            Dim sql_Statement = ROW.Item("SQL_UEBERPRUEFUNG")
                            Dim cellvalue = dgv.Rows(dgv.Rows.Count - 2).Cells(0).Value.ToString()
                            sql_Statement = sql_Statement.ToString.Replace(dgv.Name, cellvalue)

                            Dim resultDT As DataTable = GetCachedDatatable(sql_Statement, oConnectionID)

                            If resultDT.Rows.Count >= 1 Then
                                For Each row1 As DataRow In resultDT.Rows
                                    Dim result = row1.Item(0)
                                    If Not IsNothing(result) Then
                                        PanelValidatorControl.Controls(displayboxname).Text = result.ToString
                                        Exit For
                                    Else
                                        PanelValidatorControl.Controls(displayboxname).Text = "RESULT = NOTHING"
                                        Exit For
                                    End If
                                Next
                            Else
                                PanelValidatorControl.Controls(displayboxname).Text = "NO RESULT"
                            End If
                        Else
                            MyValidationLogger.Warn($"⚠️ SQL_UEBERPRUEFUNG is DBNull for control {displayboxname} - Cannot execute validation query")
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Error(ex)
                        MyValidationLogger.Info("Unexpected Error in Display SQL result for control: " & ROW.Item(0).ToString & " - ERROR: " & ex.Message)
                    End Try
                Next
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Unexpected Error in Eventhandler Variable SQL Result - ERROR: " & ex.Message)
        End Try

    End Sub
    Public Sub onLookUpselectedValue(sender As Object, SelectedValues As List(Of String))
        Try
            MyValidationLogger.Debug("onLookUpselectedValue")
            ' *** GLOBALER GUARD: Bei Refresh KOMPLETT blockieren ***
            If _FormLoaded = False Or _suppressLookupEvents Then
                MyValidationLogger.Debug("onLookUpselectedValue suppressed (global guard active)")

                ' FIX: Auch unter Guard tracken, wenn Formular bereits geladen ist.
                ' Verhindert, dass FillIndexValues-Resets das Dirty-Tracking überschreiben.
                If _FormLoaded Then
                    Dim oRepositoryItemTracking As RepositoryItemLookupControl3 = TryCast(sender, RepositoryItemLookupControl3)
                    If oRepositoryItemTracking IsNot Nothing Then
                        Dim oLookupTracking As LookupControl3 = Nothing
                        If _CachedLookupControlsByRepository IsNot Nothing Then
                            _CachedLookupControlsByRepository.TryGetValue(oRepositoryItemTracking, oLookupTracking)
                        End If
                        If oLookupTracking Is Nothing Then
                            oLookupTracking = TryCast(oRepositoryItemTracking.OwnerEdit, LookupControl3)
                        End If
                        If oLookupTracking IsNot Nothing Then
                            If Not listChangedLookup.Contains(oLookupTracking.Name) Then
                                listChangedLookup.Add(oLookupTracking.Name)
                                MyValidationLogger.Debug($"onLookUpselectedValue suppressed BUT tracked for Check_UpdateIndexe: [{oLookupTracking.Name}]")
                            End If
                        End If
                    End If
                End If

                Exit Sub
            End If

            If SelectedValues Is Nothing OrElse SelectedValues.Count < 1 Then
                MyValidationLogger.Debug("Attention: onLookUpselectedValue: SelectedValues.Count <> 1 ")
                Exit Sub
            End If

            ' *** WICHTIG: Auch hier globalen Guard setzen ***
            _suppressLookupEvents = True
            Try
                Dim oRepositoryItem As RepositoryItemLookupControl3 = sender
                Dim oLookup As LookupControl3 = Nothing

                If _CachedLookupControlsByRepository IsNot Nothing Then
                    _CachedLookupControlsByRepository.TryGetValue(oRepositoryItem, oLookup)
                End If

                If oLookup Is Nothing Then
                    oLookup = TryCast(oRepositoryItem.OwnerEdit, LookupControl3)
                End If

                If oLookup Is Nothing Then
                    MyValidationLogger.Warn("⚠️ onLookUpselectedValue: LookupControl not found for RepositoryItem")
                    Exit Sub
                End If

                LookupControl_DependingControls(oLookup, SelectedValues)
                LookupControl_EnablingControls(oLookup, SelectedValues)
                LookupControl_DependingColumn(oLookup, SelectedValues)

            Finally
                _suppressLookupEvents = False
            End Try

        Catch ex As Exception
            MyValidationLogger.Warn("⚠️ Unexpected error in onLookUpselectedValue - " + ex.Message)
            MyValidationLogger.Error(ex)
            _suppressLookupEvents = False  ' Sicherheits-Reset
        End Try

    End Sub

    Private _lookupUpdateDepth As Integer = 0
    Private Const MAX_LOOKUP_DEPTH As Integer = 5

    Public Sub LookupListChanged(sender As Object, SelectedValues As List(Of String))
        If _FormLoaded = False Or PanelValidatorControl.Enabled = False Then
            Exit Sub
        End If

        ' *** GLOBALER GUARD: Blockiert ALLE Lookup-Updates während Verarbeitung ***
        If _suppressLookupEvents Then
            MyValidationLogger.Debug("LookupListChanged suppressed (global guard active)")
            Exit Sub
        End If
        ' *** DEPTH-GUARD: Verhindert extrem tiefe Rekursionen ***
        If _lookupUpdateDepth >= MAX_LOOKUP_DEPTH Then
            MyValidationLogger.Warn($"⚠️ Lookup recursion depth exceeded ({_lookupUpdateDepth}). Aborting.")
            Exit Sub
        End If
        Try
            _suppressLookupEvents = True  ' <-- Globaler Guard aktivieren
            _lookupUpdateDepth += 1
            Dim oLookup As RepositoryItemLookupControl3 = sender
            Dim oLookupControl As LookupControl3 = Nothing

            If _CachedLookupControlsByRepository IsNot Nothing Then
                _CachedLookupControlsByRepository.TryGetValue(oLookup, oLookupControl)
            End If

            If oLookupControl Is Nothing Then
                For Each oControl In PanelValidatorControl.Controls
                    If TypeOf oControl Is LookupControl3 Then
                        Dim tmp As LookupControl3 = DirectCast(oControl, LookupControl3)
                        If tmp.Properties Is oLookup Then
                            oLookupControl = tmp
                            Exit For
                        End If
                    End If
                Next
            End If

            If oLookupControl IsNot Nothing Then
                Dim oMeta As ClassControlCreator.ControlMetadata = oLookupControl.Tag
                oMeta.IsDirty = True
                MyValidationLogger.Debug($"LookupControl [{oMeta.Name}] marked as dirty")
                listChangedLookup.Add(oLookupControl.Name)
                ' *** Cache aktualisieren ***
                clsPatterns.UpdateControlInCache(oLookupControl.Name, SelectedValues)
            Else
                listChangedLookup.Add(oLookup.Name)
                clsPatterns.UpdateControlInCache(oLookup.Name, SelectedValues)
            End If

            ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)

            Dim oFound As Boolean = False
            For Each oString As String In listofControls
                If oString = oLookup.Name And oFound = False Then
                    oFound = True
                ElseIf oFound = True Then
                    For Each oControl As Control In PanelValidatorControl.Controls
                        If oControl.Name = oString Then
                            oControl.Focus()
                            Exit For
                        End If
                    Next
                    Exit For
                End If
            Next

        Catch ex As Exception
            MyValidationLogger.Error(ex)
        Finally
            _lookupUpdateDepth -= 1
            _suppressLookupEvents = False  ' <-- Globaler Guard deaktivieren
        End Try
    End Sub
    Private Sub GridView_CellValueChanged(sender As Object, e As DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs)
        ' Prevent cascading events during validation
        If _isShowingErrorDialog Then
            MyValidationLogger.Debug("GridView_CellValueChanged suppressed (currently showing error dialog)")
            Return
        End If
        Dim oView As GridView = sender
        Dim oGrid As GridControl = oView.GridControl
        Dim oMeta As ClassControlCreator.ControlMetadata = oGrid.Tag

        oMeta.IsDirty = True
        MyValidationLogger.Debug($"GridControl [{oMeta.Name}] marked as dirty (Row {e.RowHandle}, Col {e.Column.FieldName})")
    End Sub
    Private Sub GridDataSource_RowDeleted(sender As Object, e As DataRowChangeEventArgs)
        If Me.IsDisposed OrElse _FormClosing Then Exit Sub
        Try
            ' DataSource → GridControl finden
            Dim oDataTable As DataTable = DirectCast(sender, DataTable)
            For Each oControl As Control In PanelValidatorControl.Controls
                If TypeOf oControl Is GridControl Then
                    Dim oGrid As GridControl = DirectCast(oControl, GridControl)
                    If oGrid.DataSource Is oDataTable Then
                        Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oGrid.Tag, ClassControlCreator.ControlMetadata)
                        If oMeta IsNot Nothing Then
                            oMeta.IsDirty = True
                            MyValidationLogger.Debug($"GridControl [{oMeta.Name}] marked as dirty (RowDeleted via DataSource)")
                        End If
                        Exit For
                    End If
                End If
            Next
        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ GridDataSource_RowDeleted: {ex.Message}")
        End Try
    End Sub

    ' ========== NEU: Cleanup-Methode für gelöschte Zeilen ==========
    ''' <summary>
    ''' Entfernt physisch alle Zeilen mit RowState = Deleted aus dem DataTable.
    ''' WICHTIG: Muss VOR der Validierung aufgerufen werden!
    ''' </summary>
    Private Sub CleanupDeletedRows(pGrid As GridControl)
        Try
            MyValidationLogger.Debug($"[6] CleanupDeletedRows START für Grid: [{pGrid.Name}]")
            Dim oDataSource As DataTable = TryCast(pGrid.DataSource, DataTable)
            If oDataSource Is Nothing Then Return

            ' Alle gelöschten Zeilen sammeln
            Dim deletedRows = oDataSource.Rows.Cast(Of DataRow)().
            Where(Function(r) r.RowState = DataRowState.Deleted).
            ToList()

            If deletedRows.Count > 0 Then
                MyValidationLogger.Debug($"Grid [{pGrid.Name}]: Entferne {deletedRows.Count} gelöschte Zeilen aus DataSource")

                ' Zeilen PHYSISCH entfernen (nicht nur markieren!)
                For Each row In deletedRows
                    oDataSource.Rows.Remove(row)
                Next

                ' AcceptChanges → alle RowState-Flags zurücksetzen
                oDataSource.AcceptChanges()
            End If
        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ CleanupDeletedRows: {ex.Message}")
        End Try
    End Sub
    ' ========== ENDE NEU ==========
    Private Sub GridView_KeyDown(sender As Object, e As KeyEventArgs)
        If Me.IsDisposed OrElse _FormClosing Then Exit Sub
        If e.KeyCode <> Keys.Delete Then Exit Sub
        MyValidationLogger.Debug($"[GridView_KeyDown] DEL-Taste gedrückt!")
        Try
            Dim oView As GridView = DirectCast(sender, GridView)

            ' Nur löschen wenn eine gültige Zeile fokussiert ist
            If oView.FocusedRowHandle < 0 Then Exit Sub
            ' Nicht löschen wenn eine Zelle gerade bearbeitet wird
            If oView.ActiveEditor IsNot Nothing Then Exit Sub
            Dim oGrid As GridControl = oView.GridControl
            Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oGrid.Tag, ClassControlCreator.ControlMetadata)

            If oMeta IsNot Nothing AndAlso oMeta.ReadOnly Then
                MyValidationLogger.Debug($"[GridView_KeyDown] Grid [{oMeta.Name}] ist ReadOnly → Löschen blockiert")
                e.Handled = True
                e.SuppressKeyPress = True
                Exit Sub
            End If


            If oMeta IsNot Nothing Then
                oMeta.IsDirty = True
                MyValidationLogger.Debug($"[GridView_KeyDown] Grid [{oMeta.Name}] marked as dirty")
            End If

            Dim oDataSource As DataTable = TryCast(oGrid.DataSource, DataTable)
            If oDataSource Is Nothing Then Exit Sub

            ' Mehrsprachige Texte abhängig von USER_LANGUAGE
            Dim oQuestion As String
            Dim oTitle As String
            Select Case USER_LANGUAGE
                Case "de-DE"
                    oQuestion = "Möchten Sie die markierte Zeile wirklich löschen?"
                    oTitle = "Zeile löschen"
                Case "fr-FR"
                    oQuestion = "Voulez-vous vraiment supprimer la ligne sélectionnée?"
                    oTitle = "Supprimer la ligne"
                Case Else ' en-US, en-GB, etc.
                    oQuestion = "Do you really want to delete the selected row?"
                    oTitle = "Delete row"
            End Select

            Dim oResult = MessageBox.Show(
                oQuestion,
                oTitle,
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question)

            If oResult = DialogResult.Yes Then
                Dim oDataSource1 As DataTable = TryCast(oGrid.DataSource, DataTable)
                If oDataSource1 IsNot Nothing Then
                    Dim oRowIndex = oView.GetDataSourceRowIndex(oView.FocusedRowHandle)
                    If oRowIndex >= 0 AndAlso oRowIndex < oDataSource.Rows.Count Then
                        ' ========== KRITISCHE ÄNDERUNG ==========
                        oDataSource.Rows(oRowIndex).Delete()  ' ← Statt RemoveAt()
                        ' ========== ENDE ÄNDERUNG ==========

                        MyValidationLogger.Debug($"GridControl [{oGrid.Name}] - Row {oRowIndex} marked as DELETED (RowState)")
                    End If
                End If
            End If

            e.Handled = True
        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ GridView_KeyDown (Delete): {ex.Message}")
        End Try
    End Sub
    Private Sub GridView_RowDeleting(sender As Object, e As RowDeletingEventArgs)
        If Me.IsDisposed OrElse _FormClosing Then Exit Sub

        ' Guard: Nur gültige Zeilen verarbeiten
        If e.RowHandle < 0 Then Exit Sub

        Try
            Dim oView As GridView = DirectCast(sender, GridView)
            Dim oGrid As GridControl = oView.GridControl

            Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oGrid.Tag, ClassControlCreator.ControlMetadata)
            If oMeta IsNot Nothing Then
                oMeta.IsDirty = True
                MyValidationLogger.Debug($"[GridView_RowDeleting] Grid [{oMeta.Name}] marked as dirty")
            End If

            Dim oDataSource As DataTable = TryCast(oGrid.DataSource, DataTable)
            If oDataSource Is Nothing Then Exit Sub

            Dim oRowIndex = oView.GetDataSourceRowIndex(e.RowHandle)
            If oRowIndex >= 0 AndAlso oRowIndex < oDataSource.Rows.Count Then
                Dim oRow As DataRow = oDataSource.Rows(oRowIndex)

                ' Guard: Nur löschen wenn noch nicht als Deleted markiert
                If oRow.RowState = DataRowState.Deleted Then
                    MyValidationLogger.Debug($"[GridView_RowDeleting] Row {oRowIndex} bereits als DELETED markiert - übersprungen")
                    e.Cancel = True
                    Return
                End If

                oRow.Delete()
                MyValidationLogger.Debug($"[GridView_RowDeleting] Grid [{oGrid.Name}] - Row {oRowIndex} marked as DELETED (RowState)")
            End If

            e.Cancel = True
            oView.RefreshData()
        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ GridView_RowDeleting: {ex.Message}")
        End Try
    End Sub
    Public Sub onCheckBox_CheckedChange(sender As Object, e As EventArgs)
        MyValidationLogger.Debug("onCheckBox_CheckedChange")

        If _FormLoaded = False Then
            Exit Sub
        End If
        Dim oCheckbox As CheckBox = sender
        ' Dirty-Flag setzen
        Dim oMeta As ClassControlCreator.ControlMetadata = oCheckbox.Tag
        oMeta.IsDirty = True
        MyValidationLogger.Debug($"CheckBox [{oMeta.Name}] marked as dirty")
        ' *** NEU: Cache aktualisieren ***
        clsPatterns.UpdateControlInCache(oCheckbox.Name, oCheckbox.Checked)

        Try
            CheckBox_DependingControls(oCheckbox)
            Checkbox_EnablingControls(oCheckbox)
            CheckBox_DependingColumn(oCheckbox)
            SetControlValues_FromControl(oCheckbox)
            ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try
    End Sub
    Public Sub onLookUpselectedValue_Control2Set(sender As Object, SelectedValues As List(Of String))

        If _FormLoaded = False Or PanelValidatorControl.Enabled = False Then
            Exit Sub
        End If
        MyValidationLogger.Debug("onLookUpselectedValue_Control2Set")
        Dim oRepositoryItem As RepositoryItemLookupControl3 = sender
        Dim oLookup As LookupControl3 = oRepositoryItem.OwnerEdit
        SetControlValues_FromControl(oLookup)
    End Sub

    Private _listForceReindex As New List(Of String)

    Private Sub SetControlValues_FromControl(pControl As Control)
        If _suppressLookupEvents Then
            MyValidationLogger.Debug("[SetControlValues_FromControl] BLOCKED by _suppressLookupEvents (FillIndexValues läuft)")
            Exit Sub
        End If
        If _SetControlValue_In_Action Then
            MyValidationLogger.Debug("[SetControlValues_FromControl] SetControlValue in action. Exiting.")
            Exit Sub
        End If

        Dim oControlName = pControl.Name
        Dim oControlMeta = DirectCast(pControl.Tag, ClassControlCreator.ControlMetadata)
        Dim oControlID = oControlMeta.Guid

        MyValidationLogger.Debug($"[SetControlValues_FromControl] START für Control: [{oControlName}], GUID: [{oControlID}]")

        If _SetControlValue_In_Action Then
            MyValidationLogger.Debug("[SetControlValues_FromControl] SetControlValue in action. Exiting.")
            Exit Sub
        End If

        Dim oRow As DataRow = Nothing
        If _CachedControlsBySetControlData Is Nothing OrElse Not _CachedControlsBySetControlData.TryGetValue(oControlID, oRow) Then
            MyValidationLogger.Debug($"[SetControlValues_FromControl] SET_CONTROL_DATA is empty for control [{oControlName}]. Exiting.")
            Exit Sub
        End If

        Dim oControlname2Set = oRow.Item("NAME")
        MyValidationLogger.Debug($"[SetControlValues_FromControl] Working on SetControlValue for {oControlname2Set} ...")

        Dim oConnectionId = 1

        If Not IsDBNull(oRow.Item("CONNECTION_ID")) Then
            oConnectionId = oRow.Item("CONNECTION_ID")
        Else
            MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNull for control {oControlName} - Defaulting to 1")
        End If

        Dim oControlDataSql = oRow.ItemEx("SET_CONTROL_DATA", String.Empty)

        If oControlDataSql = String.Empty Then
            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] SET_CONTROL_DATA is empty for control [{oControlName}].")
            Exit Sub
        End If

        MyValidationLogger.Debug($"[SetControlValues_FromControl] Original SQL: [{oControlDataSql}]")
        oControlDataSql = clsPatterns.ReplaceAllValues(oControlDataSql, PanelValidatorControl, True)
        MyValidationLogger.Debug($"[SetControlValues_FromControl] Nach ReplaceAllValues: [{oControlDataSql}]")

        Dim oControlDataResult As DataTable = GetCachedDatatable(oControlDataSql, oConnectionId)

        If oControlDataResult Is Nothing Then
            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] SQL returned Nothing for control [{oControlname2Set}]")
            Exit Sub
        End If

        MyValidationLogger.Debug($"[SetControlValues_FromControl] SQL returned {oControlDataResult.Rows.Count} rows")

        Dim oButtonFinishSet As Boolean = False

        ' ========== NEU: Liste der geänderten Controls für Enable-Check ==========
        Dim changedControlNames As New List(Of String)
        ' ========== ENDE NEU ==========

        For Each oResultRow As DataRow In oControlDataResult.Rows
            Try
                _SetControlValue_In_Action = True

                Dim oControl2Set = oResultRow.ItemEx("Control2Set", String.Empty)
                Dim oControlCaption = oResultRow.ItemEx("Caption", String.Empty)
                Dim oControlBackColor = Color.FromName(oResultRow.ItemEx("BackgroundColor", "Transparent"))
                Dim oControlFontColor = Color.FromName(oResultRow.ItemEx("FontColor", "Black"))
                Dim oControlTextOption = oResultRow.ItemEx("TextOption", "Replace")

                MyValidationLogger.Debug($"[SetControlValues_FromControl] Row: Control2Set=[{oControl2Set}], Caption=[{oControlCaption}], TextOption=[{oControlTextOption}]")

                If oControl2Set.ToString.ToUpper = "BTN_FINISH".ToUpper Then
                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Setting BTN_FINISH: [{oControlCaption}]")
                    btnSave.Text = oControlCaption & " (F2)"
                    btnSave.Appearance.BackColor = oControlBackColor
                    btnSave.Appearance.ForeColor = oControlFontColor
                    oButtonFinishSet = True
                    _SetControlValue_In_Action = False
                    Continue For
                End If

                Dim oControlObject2Set = PanelValidatorControl.Controls.Cast(Of Control).
                Where(Function(c)
                          Dim meta = DirectCast(c.Tag, ClassControlCreator.ControlMetadata)
                          Return oControl2Set = meta.Guid OrElse oControl2Set = meta.Name
                      End Function).FirstOrDefault()

                If oControlObject2Set Is Nothing Then
                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Could not find the Control2Set with ID {oControl2Set} on panel!!!")
                    Continue For
                End If

                Dim oControl As Control = oControlObject2Set
                Dim oMeta As ClassControlCreator.ControlMetadata = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)

                MyValidationLogger.Debug($"[SetControlValues_FromControl] Got the Control2Set: {oControl.Name} (Type: {oControl.GetType().Name})..Setting the values..")

                Select Case True
                    Case oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit)
                        Try
                            Dim oldValue = oControl.Text
                            If oControlTextOption = "Replace" Then
                                oControl.Text = oControlCaption
                            Else
                                oControl.Text &= oControlCaption
                            End If
                            MyValidationLogger.Debug($"[SetControlValues_FromControl] TextEdit [{oControl.Name}]: '{oldValue}' → '{oControl.Text}'")
                            oControl.BackColor = oControlBackColor
                            oControl.ForeColor = oControlFontColor
                            oMeta.IsDirty = True
                            ' FIX: IDB-Cache-Bypass → immer indexieren
                            If Not _listForceReindex.Contains(oControl.Name) Then
                                _listForceReindex.Add(oControl.Name)
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                            End If
                            clsPatterns.UpdateControlInCache(oMeta.Name, DirectCast(oControl, BaseEdit).EditValue)

                            ' ========== NEU: Control für Enable-Check vormerken ==========
                            If Not changedControlNames.Contains(oControl.Name) Then
                                changedControlNames.Add(oControl.Name)
                            End If
                            ' ========== ENDE NEU ==========
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error while Control2Set (TextEdit): {ex.Message}")
                        End Try

                    Case oControl.GetType() = GetType(LookupControl3)
                        Try
                            Dim oDependingLookup As LookupControl3 = oControl
                            Dim oldValues = If(oDependingLookup.Properties.SelectedValues IsNot Nothing,
                                          String.Join(",", oDependingLookup.Properties.SelectedValues),
                                          "<leer>")

                            If oDependingLookup.Properties.SelectedValues Is Nothing Then
                                oDependingLookup.Properties.SelectedValues = New List(Of String)()
                            End If

                            If oDependingLookup.Properties.MultiSelect = True Then
                                If oControlTextOption = "Replace" Then
                                    oDependingLookup.Properties.SelectedValues = New List(Of String) From {oControlCaption}
                                Else
                                    oDependingLookup.Properties.SelectedValues.Add(oControlCaption)
                                End If
                            Else
                                oDependingLookup.Properties.SelectedValues = New List(Of String) From {oControlCaption}
                            End If

                            Dim newValues = If(oDependingLookup.Properties.SelectedValues IsNot Nothing,
                                          String.Join(",", oDependingLookup.Properties.SelectedValues),
                                          "<leer>")
                            MyValidationLogger.Debug($"[SetControlValues_FromControl] Lookup [{oControl.Name}]: '{oldValues}' → '{newValues}' (Mode: {oControlTextOption})")
                            oMeta.IsDirty = True
                            ' FIX: IDB-Cache-Bypass → immer indexieren
                            If Not _listForceReindex.Contains(oControl.Name) Then
                                _listForceReindex.Add(oControl.Name)
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                            End If
                            clsPatterns.UpdateControlInCache(oMeta.Name, oDependingLookup.Properties.SelectedValues)

                            ' ========== NEU: Control für Enable-Check vormerken ==========
                            If Not changedControlNames.Contains(oControl.Name) Then
                                changedControlNames.Add(oControl.Name)
                            End If
                            ' ========== ENDE NEU ==========
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error while Control2Set (LookupControl3): {ex.Message}")
                        End Try

                    Case oControl.GetType() = GetType(Windows.Forms.ComboBox)
                        Try
                            Dim oDependingCombobox As Windows.Forms.ComboBox = oControl
                            Dim oIndex As Integer = oDependingCombobox.FindStringExact(oControlCaption)
                            Dim oldValue = oDependingCombobox.Text

                            If oIndex <> -1 Then
                                If oDependingCombobox.SelectedIndex <> oIndex Then
                                    oDependingCombobox.SelectedIndex = oIndex
                                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Combobox [{oControl.Name}]: '{oldValue}' → '{oControlCaption}' (Index: {oIndex})")
                                Else
                                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Combobox [{oControl.Name}]: Wert bereits gesetzt ('{oControlCaption}')")
                                End If
                                Try
                                    oDependingCombobox.BackColor = oControlBackColor
                                Catch ex As Exception
                                End Try
                                Try
                                    oDependingCombobox.ForeColor = oControlFontColor
                                Catch ex As Exception
                                End Try
                                oMeta.IsDirty = True
                                ' FIX: IDB-Cache-Bypass → immer indexieren
                                If Not _listForceReindex.Contains(oControl.Name) Then
                                    _listForceReindex.Add(oControl.Name)
                                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                                End If
                                clsPatterns.UpdateControlInCache(oMeta.Name, oDependingCombobox.Text)

                                ' ========== NEU: Control für Enable-Check vormerken ==========
                                If Not changedControlNames.Contains(oControl.Name) Then
                                    changedControlNames.Add(oControl.Name)
                                End If
                                ' ========== ENDE NEU ==========
                            Else
                                MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Combobox [{oControl.Name}]: Wert '{oControlCaption}' nicht in Liste gefunden!")
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error while Control2Set (Combobox): {ex.Message}")
                        End Try

                    Case oControl.GetType() = GetType(DevExpress.XtraEditors.DateEdit)
                        Try
                            Dim oDateEdit As DevExpress.XtraEditors.DateEdit = DirectCast(oControl, DevExpress.XtraEditors.DateEdit)
                            Dim parsed As DateTime
                            Dim oldValue = oDateEdit.EditValue

                            If String.IsNullOrWhiteSpace(oControlCaption) Then
                                oDateEdit.EditValue = Nothing
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] DateEdit [{oControl.Name}]: '{oldValue}' → <leer>")
                            ElseIf DateTime.TryParse(oControlCaption, parsed) Then
                                oDateEdit.EditValue = parsed
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] DateEdit [{oControl.Name}]: '{oldValue}' → '{parsed:dd.MM.yyyy}'")
                            ElseIf DateTime.TryParse(oControlCaption, CultureInfo.CurrentCulture, DateTimeStyles.None, parsed) Then
                                oDateEdit.EditValue = parsed
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] DateEdit [{oControl.Name}]: '{oldValue}' → '{parsed:dd.MM.yyyy}' (CurrentCulture)")
                            ElseIf DateTime.TryParse(oControlCaption, CultureInfo.InvariantCulture, DateTimeStyles.None, parsed) Then
                                oDateEdit.EditValue = parsed
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] DateEdit [{oControl.Name}]: '{oldValue}' → '{parsed:dd.MM.yyyy}' (InvariantCulture)")
                            Else
                                oDateEdit.EditValue = Nothing
                                MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] DateEdit [{oControl.Name}]: Konnte '{oControlCaption}' nicht als Datum parsen → <leer>")
                            End If
                            oMeta.IsDirty = True
                            ' FIX: IDB-Cache-Bypass → immer indexieren
                            If Not _listForceReindex.Contains(oControl.Name) Then
                                _listForceReindex.Add(oControl.Name)
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                            End If
                            clsPatterns.UpdateControlInCache(oMeta.Name, oDateEdit.EditValue)

                            ' ========== NEU: Control für Enable-Check vormerken ==========
                            If Not changedControlNames.Contains(oControl.Name) Then
                                changedControlNames.Add(oControl.Name)
                            End If
                            ' ========== ENDE NEU ==========
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error While Control2Set (DateEdit): {ex.Message}")
                        End Try

                    Case oControl.GetType() = GetType(System.Windows.Forms.DateTimePicker)
                        Try
                            Dim dtp As System.Windows.Forms.DateTimePicker = DirectCast(oControl, System.Windows.Forms.DateTimePicker)
                            Dim parsed As DateTime
                            Dim hasValue = Not String.IsNullOrWhiteSpace(oControlCaption)
                            Dim oldValue = dtp.Value

                            If hasValue AndAlso (DateTime.TryParse(oControlCaption, parsed) _
                            OrElse DateTime.TryParse(oControlCaption, CultureInfo.CurrentCulture, DateTimeStyles.None, parsed) _
                            OrElse DateTime.TryParse(oControlCaption, CultureInfo.InvariantCulture, DateTimeStyles.None, parsed)) Then
                                dtp.Value = parsed
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] DateTimePicker [{oControl.Name}]: '{oldValue:dd.MM.yyyy}' → '{parsed:dd.MM.yyyy}'")
                                oMeta.IsDirty = True
                                ' FIX: IDB-Cache-Bypass → immer indexieren
                                If Not _listForceReindex.Contains(oControl.Name) Then
                                    _listForceReindex.Add(oControl.Name)
                                    MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                                End If
                                clsPatterns.UpdateControlInCache(oMeta.Name, dtp.Value)

                                ' ========== NEU: Control für Enable-Check vormerken ==========
                                If Not changedControlNames.Contains(oControl.Name) Then
                                    changedControlNames.Add(oControl.Name)
                                End If
                                ' ========== ENDE NEU ==========
                            Else
                                dtp.Value = DateTimePicker.MinimumDateTime
                                MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] DateTimePicker [{oControl.Name}]: Konnte '{oControlCaption}' nicht parsen → MinimumDateTime")
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error While Control2Set (DateTimePicker): {ex.Message}")
                        End Try

                    Case oControl.GetType() = GetType(Windows.Forms.CheckBox)
                        Try
                            Dim oBitValue As Boolean = CBool(oControlCaption)
                            Dim oDependingCheckbox As Windows.Forms.CheckBox = oControl
                            Dim oldValue = oDependingCheckbox.Checked

                            oDependingCheckbox.Checked = oBitValue
                            MyValidationLogger.Debug($"[SetControlValues_FromControl] CheckBox [{oControl.Name}]: '{oldValue}' → '{oBitValue}'")
                            Try
                                oDependingCheckbox.BackColor = oControlBackColor
                            Catch ex As Exception
                            End Try
                            Try
                                oDependingCheckbox.ForeColor = oControlFontColor
                            Catch ex As Exception
                            End Try
                            oMeta.IsDirty = True
                            ' FIX: IDB-Cache-Bypass → immer indexieren
                            If Not _listForceReindex.Contains(oControl.Name) Then
                                _listForceReindex.Add(oControl.Name)
                                MyValidationLogger.Debug($"[SetControlValues_FromControl] Force-Reindex vorgemerkt für: [{oControl.Name}]")
                            End If
                            clsPatterns.UpdateControlInCache(oMeta.Name, oDependingCheckbox.Checked)

                            ' ========== NEU: Control für Enable-Check vormerken ==========
                            If Not changedControlNames.Contains(oControl.Name) Then
                                changedControlNames.Add(oControl.Name)
                            End If
                            ' ========== ENDE NEU ==========
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error while Control2Set (Checkbox) {ex.Message}")
                        End Try

                    Case Else
                        MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] SetControlData used on unsupported control type: {oControl.GetType().Name}")
                End Select

            Catch ex As Exception
                MyValidationLogger.Error(ex)
                MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Error in SetControlValues_FromControl for control [{pControl?.Name}]: {ex.Message}")
                CloseOverlaySafe()
            Finally
                _SetControlValue_In_Action = False
            End Try
        Next

        ' ========== NEU: Enable-Check für ALLE geänderten Controls NACH der Schleife ==========
        ' WICHTIG: Wird AUSSERHALB der For-Each-Schleife ausgeführt, damit ALLE Werte
        ' bereits gesetzt sind, bevor SQL_ENABLE-Statements die aktuellen Werte prüfen.
        ' Dies behebt das Problem, dass BTN_Kst2VA1 disabled bleibt, obwohl
        ' KstVerantwortliche bereits befüllt wurde.
        If changedControlNames.Count > 0 Then
            MyValidationLogger.Debug($"[SetControlValues_FromControl] Führe Controls2beEnabled für {changedControlNames.Count} geänderte Controls aus...")
            ' WICHTIG: SQL-Cache leeren ist NICHT nötig, da Controls2beEnabled bereits frische DB-Werte holt
            ' _CachedSqlScalarCache.Clear() wurde entfernt, um Performance zu verbessern
            For Each changedName As String In changedControlNames
                Try
                    Controls2beEnabled(changedName)
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ [SetControlValues_FromControl] Controls2beEnabled failed für [{changedName}]: {ex.Message}")
                End Try
            Next
        End If
        ' ========== ENDE NEU ==========

        MyValidationLogger.Debug($"[SetControlValues_FromControl] END für Control: [{oControlName}], ButtonFinishSet={oButtonFinishSet}")
    End Sub

    Private Sub LookupControl_DependingControls(LookupControl As LookupControl3, SelectedValues As List(Of String))
        If SelectedValues Is Nothing OrElse SelectedValues.Count = 0 Then
            MyValidationLogger.Debug("LookupControl_DependingControls: No values selected")
            Exit Sub
        End If

        Dim oLOOKUPValue = SelectedValues.Item(0)
        Dim oLOOKUPName = LookupControl.Name
        MyValidationLogger.Debug($"oLOOKUPValue Is  [{oLOOKUPValue}]!")

        Dim oControlID = DirectCast(LookupControl.Tag, ClassControlCreator.ControlMetadata).Guid

        ' ========== OPTIMIERUNG 1: Dictionary für Controls erstellen (einmalig) ==========
        If _CachedControlsByGuid Is Nothing Then
            _CachedControlsByGuid = New Dictionary(Of Integer, Control)()
            For Each ctrl As Control In PanelValidatorControl.Controls
                Try
                    Dim meta = DirectCast(ctrl.Tag, ClassControlCreator.ControlMetadata)
                    _CachedControlsByGuid(meta.Guid) = ctrl
                Catch
                    Continue For
                End Try
            Next
        End If
        ' ========== ENDE OPTIMIERUNG 1 ==========

        ' ========== OPTIMIERUNG 2: Gefilterte Rows mit LINQ (statt .Select()) ==========
        Dim dependingRows = DT_CONTROLS.AsEnumerable().
        Where(Function(r) Not IsDBNull(r("SQL_UEBERPRUEFUNG")) AndAlso
                         r("SQL_UEBERPRUEFUNG").ToString().Contains($"#CTRL#{oLOOKUPName}")).
        ToList()

        If dependingRows.Count = 0 Then
            MyValidationLogger.Debug($"Sorry NO depending controls for [{oLOOKUPName}]!")
            Exit Sub
        End If

        MyValidationLogger.Debug($"We got {dependingRows.Count} depending controls!!")
        ' ========== ENDE OPTIMIERUNG 2 ==========

        For Each oRowDependingControl As DataRow In dependingRows
            Dim oDEPENDING_GUID = CInt(oRowDependingControl.Item("GUID"))
            Dim oDEPENDING_CtrlName = oRowDependingControl.Item("NAME").ToString()
            MyValidationLogger.Debug($"Control {oDEPENDING_CtrlName} is depending on lookUp {oLOOKUPName}..")

            If _DependingControl_In_Action = True Then
                MyValidationLogger.Info($"..but _dependingControl_in_action = True ==> Exit Sub!")
                Exit Sub
            End If
            Dim oConnectionId = 1
            If Not IsDBNull(oRowDependingControl.Item("CONNECTION_ID")) Then
                oConnectionId = oRowDependingControl.Item("CONNECTION_ID")
            Else
                MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for Control [{oDEPENDING_CtrlName}] (GUID: {oDEPENDING_GUID}) - using default connection ID 1")
            End If
            If IsDBNull(oRowDependingControl.Item("SQL_UEBERPRUEFUNG")) Then
                MyValidationLogger.Warn($"⚠️ SQL_UEBERPRUEFUNG is DBNull for control {oDEPENDING_CtrlName}..")
                Continue For
            End If

            Dim oSqlCommand = oRowDependingControl.Item("SQL_UEBERPRUEFUNG").ToString()
            oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
            _DependingControl_In_Action = True

            Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oConnectionId)

            If oDTDEPENDING_RESULT Is Nothing Then
                MyValidationLogger.Warn($"⚠️ Datatable for Depending Controls was nothing! Check the SQL [{oSqlCommand}]")
                _DependingControl_In_Action = False
                Continue For
            End If

            ' ========== OPTIMIERUNG 3: Dictionary-Lookup statt Loop ==========
            Dim oControl As Control = Nothing
            If Not _CachedControlsByGuid.TryGetValue(oDEPENDING_GUID, oControl) Then
                MyValidationLogger.Debug($"Could not find the depending Control with ID {oDEPENDING_GUID} on panel!!!")
                _DependingControl_In_Action = False
                Continue For
            End If
            ' ========== ENDE OPTIMIERUNG 3 ==========

            MyValidationLogger.Debug($"Got the depending control ID:{oDEPENDING_GUID}..Setting the values..")

            ' *** WICHTIG: Während Suppress-Modus Updates durchführen ***
            Dim wasSuppressed = _suppressLookupEvents
            _suppressLookupEvents = True

            Try
                Select Case True
                    Case oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit)
                        Try
                            Dim oValue As Object = oDTDEPENDING_RESULT.Rows(0).Item(0)
                            MyValidationLogger.Debug(String.Format("Setting EditValue with value [{0}]", oValue))
                            oValue = ObjectEx.NotNull(Of Object)(oValue, Nothing)
                            DirectCast(oControl, DevExpress.XtraEditors.TextEdit).EditValue = oValue
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ Unexpected error in Checking oTEXT: {ex.Message}")
                        End Try

                        Try
                            Dim oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("BackgroundColor"))
                            oControl.BackColor = oColor
                        Catch
                            oControl.BackColor = Color.White
                        End Try

                        Try
                            Dim btntext = oDTDEPENDING_RESULT.Rows(0).Item("btnFinishCaption")
                            btnSave.Text = btntext & " (F2)"
                        Catch
                        End Try

                        Try
                            Dim oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("btnFinishColor"))
                            btnSave.BackColor = oColor
                        Catch
                            btnSave.BackColor = Color.Transparent
                        End Try

                    Case oControl.GetType() = GetType(LookupControl3)
                        Dim oDependingLookup As LookupControl3 = oControl
                        oDependingLookup.Properties.DataSource = oDTDEPENDING_RESULT
                        oDependingLookup.Properties.ValueMember = oDTDEPENDING_RESULT.Columns.Item(0).ColumnName
                        oDependingLookup.Properties.DisplayMember = oDTDEPENDING_RESULT.Columns.Item(0).ColumnName

                    Case oControl.GetType() = GetType(GridControl)
                    ' GridControl-Handling (unverändert)

                    Case oControl.GetType() = GetType(CheckBox)
                        Try
                            Dim oCheckState = CBool(oDTDEPENDING_RESULT.Rows(0).Item(0))
                            Dim oDependingChk As CheckBox = oControl
                            oDependingChk.CheckState = If(oCheckState, CheckState.Checked, CheckState.Unchecked)

                            Try
                                Dim oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("BackgroundColor"))
                                oControl.BackColor = oColor
                            Catch
                            End Try
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ Unexpected error in Checking oCheckBoxDependingControlLOOKUP: {ex.Message}")
                        End Try
                End Select

            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ Error while setting depending control-value for [{oDEPENDING_CtrlName}]: {ex.Message}")
            Finally
                _suppressLookupEvents = wasSuppressed
                _DependingControl_In_Action = False
                MyValidationLogger.Debug($"[LookupControl_DependingControls] _suppressLookupEvents zurückgesetzt auf [{wasSuppressed}]")
            End Try
        Next
    End Sub
    Private Sub CheckBox_DependingControls(pCheckbox As CheckBox)
        Dim oCheckboxname = pCheckbox.Name
        MyValidationLogger.Debug($"pCheckStateTrue  [{pCheckbox.Checked}]!")
        Dim oControlID = DirectCast(pCheckbox.Tag, ClassControlCreator.ControlMetadata).Guid
        Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
        Dim oExpression = $"SQL_UEBERPRUEFUNG like '%#CTRL#{oCheckboxname}%'"
        DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
        If oFilteredDatatable.Rows.Count > 0 Then
            MyValidationLogger.Debug($"We got {oFilteredDatatable.Rows.Count} depending controls!!")
        Else
            MyValidationLogger.Debug($"Sorry NO depending controls!!")
        End If
        For Each oRowDependingControl As DataRow In oFilteredDatatable.Rows
            Dim oDEPENDING_GUID = oRowDependingControl.Item("GUID")
            Dim oDEPENDING_CtrlName = oRowDependingControl.Item("NAME")
            MyValidationLogger.Debug($"Control {oDEPENDING_CtrlName} is depending on lookUp {oCheckboxname}..")
            If _DependingControl_In_Action = True Then
                MyValidationLogger.Debug($"..but _dependingControl_in_action = True ==> Exit Sub!")
                Exit Sub
            End If
            Dim oConnectionId = 1
            If Not IsDBNull(oRowDependingControl.Item("CONNECTION_ID")) Then
                oConnectionId = oRowDependingControl.Item("CONNECTION_ID")
            Else
                MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for Control [{oDEPENDING_CtrlName}] (GUID: {oDEPENDING_GUID}) - using default connection ID 1")
            End If

            If Not IsDBNull(oRowDependingControl.Item("SQL_UEBERPRUEFUNG")) Then
                Dim oSqlCommand = IIf(IsDBNull(oRowDependingControl.Item("SQL_UEBERPRUEFUNG")), "", oRowDependingControl.Item("SQL_UEBERPRUEFUNG"))
                oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
                _DependingControl_In_Action = True
                MyValidationLogger.Debug($"_DependingControl_In_Action: Control {oDEPENDING_CtrlName} ...")

                Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oConnectionId)
                Try
                    Dim oFound As Boolean = False
                    'Dim oDependingLookup As LookupControl3 = pnldesigner.Controls.Find(oDEPENDING_CtrlName, False).FirstOrDefault()
                    For Each oControl As Control In PanelValidatorControl.Controls
                        If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid = oDEPENDING_GUID Then
                            oFound = True
                            MyValidationLogger.Debug($"Got the depending control ID:{oDEPENDING_GUID}..Setting the values..")
                            Select Case True
                                Case oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType = GetType(MemoEdit)
                                    Try
                                        Dim oValue As Object = oDTDEPENDING_RESULT.Rows(0).Item(0)
                                        oValue = ObjectEx.NotNull(Of Object)(oValue, Nothing)
                                        Try
                                            'oControl.Text = oValue
                                            DirectCast(oControl, DevExpress.XtraEditors.TextEdit).EditValue = oValue
                                        Catch ex As Exception
                                            MyValidationLogger.Warn($"⚠️ Unexpected error in Checking oTEXT: {ex.Message}")
                                        End Try

                                    Catch ex As Exception
                                        MyValidationLogger.Warn($"⚠️ Unexpected error in Dim oTEXT = oDTDEPENDING_RESULT.Rows(0).Item(0): {ex.Message}")
                                    End Try

                                    Dim oColor
                                    Try
                                        oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("BackgroundColor"))
                                        oControl.BackColor = oColor
                                    Catch ex As Exception
                                        oControl.BackColor = Color.White
                                    End Try
                                    Try
                                        Dim btntext = oDTDEPENDING_RESULT.Rows(0).Item("btnFinishCaption")
                                        btnSave.Text = btntext & " (F2)"
                                    Catch ex As Exception

                                    End Try
                                    Try
                                        oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("btnFinishColor"))
                                        btnSave.BackColor = oColor
                                    Catch ex As Exception
                                        btnSave.BackColor = Color.Transparent
                                    End Try
                                Case oControl.GetType = GetType(LookupControl3)
                                    Dim oDependingLookup As LookupControl3 = oControl
                                    oDependingLookup.Properties.DataSource = oDTDEPENDING_RESULT
                                    oDependingLookup.Properties.ValueMember = oDTDEPENDING_RESULT.Columns.Item(0).ColumnName
                                    oDependingLookup.Properties.DisplayMember = oDTDEPENDING_RESULT.Columns.Item(0).ColumnName
                                Case oControl.GetType = GetType(GridControl)
                                    'ClassControlCreator.GridTables
                                Case oControl.GetType = GetType(CheckBox)
                                    Try
                                        Dim oCheckState = CBool(oDTDEPENDING_RESULT.Rows(0).Item(0))
                                        Dim oDependingChk As CheckBox = oControl
                                        oDependingChk.CheckState = oCheckState
                                        Dim oColor
                                        Try
                                            oColor = System.Drawing.Color.FromName(oDTDEPENDING_RESULT.Rows(0).Item("BackgroundColor"))
                                            oControl.BackColor = oColor
                                        Catch ex As Exception

                                        End Try
                                    Catch ex As Exception
                                        MyValidationLogger.Warn($"⚠️ Unexpected error in Checking oCheckBoxDependingControlCHK: {ex.Message}")
                                    End Try


                            End Select
                            _DependingControl_In_Action = False
                            Exit For
                        End If

                    Next
                    If oFound = False Then
                        MyValidationLogger.Debug($"Could not find the depending Control with ID {oDEPENDING_GUID} on panel!!!")
                    End If
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ Error while setting depending control-value for [{oDEPENDING_CtrlName}]:  " & ex.Message)
                    _DependingControl_In_Action = False
                End Try

            Else
                MyValidationLogger.Warn($"⚠️ SQL_UEBERPRUEFUNG is DBNull for control {oDEPENDING_CtrlName}..")
            End If
        Next
    End Sub
    Private Sub LookupControl_EnablingControls(LookupControl As LookupControl3, SelectedValues As List(Of String))
        Dim oLOOKUPValue = SelectedValues.Item(0)
        MyValidationLogger.Debug($"LookupControl_EnablingControls [{LookupControl.Name()}] - oLOOKUPValue is  [{oLOOKUPValue}]!")
        Dim oControlID = DirectCast(LookupControl.Tag, ClassControlCreator.ControlMetadata).Guid
        Controls2beEnabled(LookupControl.Name)

    End Sub
    Private Sub Checkbox_EnablingControls(pCheckbox As CheckBox)
        Dim oControlID = DirectCast(pCheckbox.Tag, ClassControlCreator.ControlMetadata).Guid
        Controls2beEnabled(pCheckbox.Name)

    End Sub
    Private Sub LookupControl_DependingColumn(LookupControl As LookupControl3, SelectedValues As List(Of String))
        Dim oSQLColumnDatatable As DataTable = DT_COLUMNS_GRID_WITH_SQL.Clone()
        Dim oExpression = $"SQL_COMMAND like '%#CTRL#{LookupControl.Name}%'"
        DT_COLUMNS_GRID_WITH_SQL.Select(oExpression).CopyToDataTable(oSQLColumnDatatable, LoadOption.PreserveChanges)
        If oSQLColumnDatatable.Rows.Count > 0 Then
            For Each oRow As DataRow In oSQLColumnDatatable.Rows
                Dim oDEPENDING_CONTROL_ID = oRow.Item("CONTROL_ID")
                Dim oCONNID = 1
                If Not IsDBNull(oRow.Item("CONNECTION_ID")) Then
                    oCONNID = oRow.Item("CONNECTION_ID")
                Else
                    MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for CONTROL_ID [{oDEPENDING_CONTROL_ID}] - using default connection ID 1")
                End If
                Dim oDEPENDING_COLUMN = oRow.Item("SPALTENNAME")
                Dim oSqlCommand = oRow.Item("SQL_COMMAND")
                Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
                If _DependingColumn_In_Action = True Then
                    Exit Sub
                End If
                oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)

                _DependingColumn_In_Action = True
                Try
                    'Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With {
                    '    .ConnectionId = oCONNID
                    '})
                    Dim oDTDEPENDING_RESULT As DataTable = GetCachedDatatable(oSqlCommand, oCONNID)
                    If Not IsNothing(oDTDEPENDING_RESULT) Then
                        MyValidationLogger.Debug($"Trying to fill the DropDown (DC) for ControlID [{oDEPENDING_CONTROL_ID}]..RowCount: [{oDTDEPENDING_RESULT.Rows.Count}] ")
                        For Each oControl As Control In PanelValidatorControl.Controls
                            Dim oControlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid

                            If oControlId = oDEPENDING_CONTROL_ID Then
                                ControlCreator.GridTables_CacheDatatableForColumn(oControlId, oDEPENDING_COLUMN, oSqlCommand, oCONNID, oAdvancedLookup)
                                _DependingColumn_In_Action = False
                                Exit For
                            End If
                        Next
                    End If

                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    _DependingColumn_In_Action = False
                End Try
            Next
        End If
    End Sub
    Private Sub CheckBox_DependingColumn(pCheckbox As CheckBox)
        Dim oSQLColumnDatatable As DataTable = DT_COLUMNS_GRID_WITH_SQL.Clone()
        Dim oExpression = $"SQL_COMMAND like '%#CTRL#{pCheckbox.Name}%'"
        DT_COLUMNS_GRID_WITH_SQL.Select(oExpression).CopyToDataTable(oSQLColumnDatatable, LoadOption.PreserveChanges)
        If oSQLColumnDatatable.Rows.Count > 0 Then
            For Each oRow As DataRow In oSQLColumnDatatable.Rows
                Dim oDEPENDING_CONTROL_ID = oRow.Item("CONTROL_ID")
                Dim oCONNID = 1
                If Not IsDBNull(oRow.Item("CONNECTION_ID")) Then
                    oCONNID = oRow.Item("CONNECTION_ID")
                Else
                    MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for CONTROL_ID [{oDEPENDING_CONTROL_ID}] - using default connection ID 1")
                End If
                Dim oDEPENDING_COLUMN = oRow.Item("SPALTENNAME")
                Dim oSqlCommand = oRow.Item("SQL_COMMAND")
                Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")

                If _DependingColumn_In_Action = True Then
                    Exit Sub
                End If

                oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)

                _DependingColumn_In_Action = True
                Try
                    'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oCONNID, $"CheckBox_DependingColumn - oDEPENDING_CONTROL_ID: {oDEPENDING_CONTROL_ID}")
                    Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With {
                        .ConnectionId = oCONNID
                    })

                    If Not IsNothing(oDTDEPENDING_RESULT) Then
                        MyValidationLogger.Debug($"Trying to fill the DropDown (DC) for ControlID [{oDEPENDING_CONTROL_ID}]..RowCount: [{oDTDEPENDING_RESULT.Rows.Count}] ")
                        For Each oControl As Control In PanelValidatorControl.Controls
                            Dim oControlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid
                            If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid = oDEPENDING_CONTROL_ID Then
                                ControlCreator.GridTables_CacheDatatableForColumn(oControlId, oDEPENDING_COLUMN, oSqlCommand, oCONNID, oAdvancedLookup)
                                _DependingColumn_In_Action = False
                                Exit For
                            End If
                        Next
                    End If

                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    _DependingColumn_In_Action = False
                End Try
            Next
        End If
    End Sub

    Public Sub OnCmbselectedIndex(sender As System.Object, e As System.EventArgs)
        ' Prevent cascading events during validation
        If _isShowingErrorDialog Then
            MyValidationLogger.Debug($"OnCmbselectedIndex: Currently showing error dialog, skipping event handling to prevent cascade.")
            Return
        End If

        Dim oCombobox As Windows.Forms.ComboBox = sender
        If oCombobox.SelectedIndex <> -1 And _Indexe_Loaded = True Then
            Dim oMeta As ClassControlCreator.ControlMetadata = oCombobox.Tag
            oMeta.IsDirty = True
            ' *** NEU: Cache aktualisieren ***
            clsPatterns.UpdateControlInCache(oCombobox.Name, oCombobox.Text)
            MyValidationLogger.Debug($"ComboBox [{oMeta.Name}] marked as dirty")
            If oCombobox.Name = last_control.Name Then
                'Abschluss()
            Else
                Try
                    Dim oFilter = String.Format("PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name)

                    Dim DT As DataTable = GetControlMetaBySql(oFilter)

                    If Not IsNothing(DT) And DT.Rows.Count > 0 Then
                        If _DependingControl_In_Action = True Then
                            Exit Sub
                        End If
                        Dim _Step = 0
                        For Each ROW As DataRow In DT.Rows
                            Try
                                Dim displayboxname = ROW.Item(0).ToString
                                _Step = 1
                                Dim oConnectionId = 1
                                If Not IsDBNull(ROW.Item("CONNECTION_ID")) Then
                                    oConnectionId = ROW.Item("CONNECTION_ID")
                                Else
                                    MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for control [{displayboxname}] - using default connection ID 1")
                                End If
                                If Not IsDBNull(ROW.Item("SQL_UEBERPRUEFUNG")) Then
                                    _Step = 2
                                    Dim sql_Statement = IIf(IsDBNull(ROW.Item("SQL_UEBERPRUEFUNG")), "", ROW.Item("SQL_UEBERPRUEFUNG"))

                                    sql_Statement = clsPatterns.ReplaceAllValues(sql_Statement, PanelValidatorControl, True)
                                    _Step = 3

                                    _DependingControl_In_Action = True
                                    _Step = 4
                                    Depending_Control_Set_Result(displayboxname, sql_Statement, ROW.Item(1))
                                    _Step = 5
                                    _DependingControl_In_Action = False
                                Else
                                    MyValidationLogger.Warn($"⚠️ SQL_UEBERPRUEFUNG is DBNull for control [{displayboxname}]..")
                                End If
                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                MyValidationLogger.Info("Unexpected Error in Display SQL result (Combobox) for control: (" & _Step.ToString & ")" & ROW.Item(0).ToString & " - ERROR: " & ex.Message)
                            End Try
                        Next
                    End If

                    ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)

                    Controls2beEnabled(oCombobox.Name)

                    SetControlValues_FromControl(oCombobox)
                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    MyValidationLogger.Info("Unexpected Error in Eventhandler Variable SQL Result ComboBox - ERROR: " & ex.Message)
                End Try
                _ControlHandleStarted = True
            End If
        End If
    End Sub
    Private Sub Controls2beEnabled(pControlName As String)
        Try
            If _FormLoaded = False Then
                MyValidationLogger.Debug("[EXIT 1] Controls2beEnabled: Form noch nicht geladen")
                Exit Sub
            End If

            ' ========== OPTIMIERUNG: Dictionary-Lookup ==========
            If _CachedControlsByGuid Is Nothing Then
                _CachedControlsByGuid = New Dictionary(Of Integer, Control)()
                For Each ctrl As Control In PanelValidatorControl.Controls
                    Try
                        Dim meta = DirectCast(ctrl.Tag, ClassControlCreator.ControlMetadata)
                        _CachedControlsByGuid(meta.Guid) = ctrl
                    Catch
                        Continue For
                    End Try
                Next
            End If

            Dim enablingRows = DT_CONTROLS.AsEnumerable().
            Where(Function(r)
                      Dim sql = r.ItemEx("SQL_ENABLE", String.Empty).ToString()
                      If String.IsNullOrEmpty(sql) Then Return False
                      Return sql.Contains($"#CTRL#{pControlName}") OrElse Not sql.Contains("#CTRL#")
                  End Function).
            ToList()

            If enablingRows.Count = 0 Then
                MyValidationLogger.Debug($"[EXIT 2] Controls2beEnabled: Keine Controls mit SQL_ENABLE für [{pControlName}]")
                Return
            End If

            MyValidationLogger.Debug($"Controls2beEnabled für [{pControlName}]: {enablingRows.Count} Controls zu prüfen")

            ' ========== NEU: Fehlersammlung ==========
            Dim failedControls As New List(Of String)

            For Each oRowEnablingControl As DataRow In enablingRows
                Try
                    ' ========== FIX: FormClosing-Guard ==========
                    If _FormClosing OrElse Me.IsDisposed Then
                        MyValidationLogger.Debug("[EXIT 3] Controls2beEnabled aborted (FormClosing)")
                        Exit For
                    End If

                    ' ========== FIX: _DependingControl_In_Action mit Logging ==========
                    If _DependingControl_In_Action Then
                        MyValidationLogger.Debug($"[SKIP] Control übersprungen (_DependingControl_In_Action aktiv)")
                        Continue For
                    End If

                    Dim oENABLE_GUID As Integer = CInt(oRowEnablingControl.Item("GUID"))
                    Dim oENABLE_CtrlName = oRowEnablingControl.Item("NAME")
                    Dim oConnectionId As Integer = oRowEnablingControl.ItemEx("CONNECTION_ID", 1)
                    Dim oSqlCommand As String = oRowEnablingControl.ItemEx("SQL_ENABLE", String.Empty)

                    If String.IsNullOrEmpty(oSqlCommand) Then
                        MyValidationLogger.Debug($"[SKIP] Control [{oENABLE_CtrlName}]: Ungültiges SQL_ENABLE")
                        Continue For
                    End If

                    oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
                    _DependingControl_In_Action = True

                    Try
                        ' ========== KRITISCH: SQL-Execution mit Start/End-Log ==========
                        MyValidationLogger.Debug($"[SQL START] Control [{oENABLE_CtrlName}]: Führe SQL_ENABLE aus...")
                        Dim oResult = GetCachedScalar(oSqlCommand, oConnectionId)
                        MyValidationLogger.Debug($"[SQL ENDE] Control [{oENABLE_CtrlName}]: Result = [{oResult}]")

                        Dim oENABLERESULT As Boolean = False
                        If oResult IsNot Nothing AndAlso Not IsDBNull(oResult) Then
                            oENABLERESULT = CBool(oResult)
                        End If

                        ' Dictionary-Lookup
                        Dim oControl As Control = Nothing
                        If _CachedControlsByGuid.TryGetValue(oENABLE_GUID, oControl) Then
                            oControl.Enabled = oENABLERESULT
                            MyValidationLogger.Debug($"Control [{oENABLE_CtrlName}] Enabled = [{oENABLERESULT}]")
                        Else
                            MyValidationLogger.Debug($"Control [{oENABLE_GUID}] nicht im Panel gefunden")
                        End If

                    Catch sqlEx As Exception
                        failedControls.Add($"[{oENABLE_CtrlName}]: {sqlEx.Message}")
                        MyValidationLogger.Error($"[Controls2beEnabled] SQL-Fehler bei [{oENABLE_CtrlName}]: {sqlEx.Message}")
                    Finally
                        _DependingControl_In_Action = False
                    End Try

                Catch rowEx As Exception
                    Dim ctrlName = oRowEnablingControl.ItemEx("NAME", "<unknown>")
                    failedControls.Add($"[{ctrlName}]: {rowEx.Message}")
                    MyValidationLogger.Error($"[Controls2beEnabled] Loop-Fehler bei [{ctrlName}]: {rowEx.Message}")
                    Continue For
                End Try
            Next

            ' ========== NEU: Fehler-Report ==========
            If failedControls.Count > 0 Then
                MyValidationLogger.Warn($"⚠️ Controls2beEnabled: {failedControls.Count} Controls konnten nicht verarbeitet werden:")
                For Each errorMsg In failedControls
                    MyValidationLogger.Warn($"   - {errorMsg}")
                Next
            End If

            MyValidationLogger.Debug($"[EXIT 4] Controls2beEnabled: Normale Beendigung")

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Error($"[EXCEPTION EXIT] Controls2beEnabled: {ex.Message}")
            MyValidationLogger.Error($"[EXCEPTION STACK] {ex.StackTrace}")
        End Try
    End Sub
    Private Sub Controls2B_EnDisabled_onLoad()
        If LOG_PERF Then PerformanceLogger.Debug("Controls2B_EnDisabled")

        Try
            If _CachedControlsByGuid Is Nothing Then
                _CachedControlsByGuid = New Dictionary(Of Integer, Control)()
                For Each ctrl As Control In PanelValidatorControl.Controls
                    Try
                        Dim meta = DirectCast(ctrl.Tag, ClassControlCreator.ControlMetadata)
                        _CachedControlsByGuid(meta.Guid) = ctrl
                    Catch
                        Continue For
                    End Try
                Next
            End If

            Dim enablingRows = DT_CONTROLS.AsEnumerable().
        Where(Function(r) Not String.IsNullOrWhiteSpace(r.ItemEx("SQL_ENABLE_ON_LOAD", String.Empty))).
        ToList()

            If enablingRows.Count = 0 Then
                MyValidationLogger.Debug("No controls with SQL_ENABLE_ON_LOAD configured")
                MyValidationLogger.Debug("[EXIT 1] Controls2B_EnDisabled_onLoad: Keine Controls konfiguriert")
                Return
            End If

            MyValidationLogger.Debug($"We got {enablingRows.Count} controls which need to be checked dis/enable on load!")

            Dim failedControls As New List(Of String)

            For Each oRowEnablingControl As DataRow In enablingRows
                Try
                    If _FormClosing OrElse Me.IsDisposed Then
                        MyValidationLogger.Debug("[EXIT 2] Controls2B_EnDisabled aborted (FormClosing)")
                        Exit For
                    End If

                    Dim oENABLE_GUID As Integer = CInt(oRowEnablingControl.Item("GUID"))
                    Dim oENABLE_CtrlName = oRowEnablingControl.Item("NAME")
                    MyValidationLogger.Debug($"Checking Control [{oENABLE_CtrlName}] (ID: {oENABLE_GUID}) for SQL_ENABLE_ON_LOAD...")
                    ' WICHTIG: Prüfe ob Control existiert
                    If Not _CachedControlsByGuid.ContainsKey(oENABLE_GUID) Then
                        MyValidationLogger.Warn($"Controls2B_EnDisabled_onLoad -> Control [{oENABLE_CtrlName}] (ID: {oENABLE_GUID}) not found in cache")
                        Continue For
                    End If
                    Dim oControl As Control = Nothing
                    If Not _CachedControlsByGuid.TryGetValue(oENABLE_GUID, oControl) Then
                        MyValidationLogger.Debug($"Control [{oENABLE_CtrlName}] (ID: {oENABLE_GUID}) not found in panel")
                        Continue For
                    End If

                    MyValidationLogger.Debug($"Found Control [{oENABLE_CtrlName}] (ID: {oENABLE_GUID}) on panel which needs to be checked")
                    Dim oConnectionId As Integer = oRowEnablingControl.ItemEx("CONNECTION_ID", 1)
                    Dim oSqlCommand = oRowEnablingControl.ItemEx("SQL_ENABLE_ON_LOAD", String.Empty)

                    If String.IsNullOrWhiteSpace(oSqlCommand) Then
                        MyValidationLogger.Debug("Skipping: Invalid SQL_ENABLE_ON_LOAD")
                        Continue For
                    End If
                    MyValidationLogger.Debug($"[Controls2B_EnDisabled_onLoad] BEFORE ReplaceAllValues for Control [{oENABLE_CtrlName}]")
                    MyValidationLogger.Debug($"   SQL Command: [{oSqlCommand}]")
                    MyValidationLogger.Debug($"   Panel Controls Count: [{PanelValidatorControl?.Controls?.Count - 1}]")
                    Try
                        oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
                        MyValidationLogger.Debug($"[Controls2B_EnDisabled_onLoad] AFTER ReplaceAllValues: [{oSqlCommand}]")
                    Catch replaceEx As Exception
                        MyValidationLogger.Error(replaceEx)
                        MyValidationLogger.Error($"❌ [Controls2B_EnDisabled_onLoad] ReplaceAllValues CRASH für [{oENABLE_CtrlName}]: {replaceEx.Message}")
                        MyValidationLogger.Error($"   Original SQL: [{oSqlCommand}]")
                        Continue For  ' ← Überspringe dieses Control und mache weiter
                    End Try
                    ' FIX: Null/Empty-Check nach ReplaceAllValues — verhindert Crash bei leeren Control-Werten
                    If oSqlCommand Is Nothing OrElse String.IsNullOrWhiteSpace(oSqlCommand) Then
                        MyValidationLogger.Warn($"[Controls2B_EnDisabled_onLoad] ReplaceAllValues returned Nothing/Empty for [{oENABLE_CtrlName}]. Skipping control.")
                        Continue For
                    End If

                    ' FIX: Prüfen ob noch unaufgelöste Placeholder vorhanden sind (z.B. weil LU_Person leer war)
                    If clsPatterns.HasAnyPatterns(oSqlCommand) Then
                        MyValidationLogger.Warn($"[Controls2B_EnDisabled_onLoad] SQL for [{oENABLE_CtrlName}] still contains unresolved patterns after replacement. Skipping.")
                        MyValidationLogger.Debug($"   Unresolved SQL: [{oSqlCommand}]")
                        Continue For
                    End If

                    MyValidationLogger.Debug($"[SQL START] Control [{oENABLE_CtrlName}]: Führe SQL aus...")
                    Dim oResult = GetCachedScalar(oSqlCommand, oConnectionId)
                    MyValidationLogger.Debug($"[SQL ENDE] Control [{oENABLE_CtrlName}]: Result = [{oResult}]")

                    Try
                        MyValidationLogger.Debug($"Result of Enable SQL [{oResult}]...")
                        oControl.Enabled = CBool(oResult)
                    Catch convEx As Exception
                        failedControls.Add($"[{oENABLE_CtrlName}]: {convEx.Message}")
                        MyValidationLogger.Warn($"⚠️ Could not convert value [{oResult}] to Boolean for control [{oENABLE_CtrlName}]")
                        MyValidationLogger.Warn($"⚠️ Error: {convEx.Message}")
                        oControl.Enabled = True
                    End Try

                Catch rowEx As Exception
                    Dim ctrlName = oRowEnablingControl.Item("NAME")
                    MyValidationLogger.Error($"[Controls2B_EnDisabled] Fehler bei Control [{ctrlName}]: {rowEx.Message}")
                    failedControls.Add($"[{ctrlName}]: {rowEx.Message}")

                    Continue For
                End Try
            Next

            If failedControls.Count > 0 Then
                MyValidationLogger.Warn($"⚠️ Controls2B_EnDisabled: {failedControls.Count} Controls konnten nicht verarbeitet werden:")
                For Each errorMsg In failedControls
                    MyValidationLogger.Warn($"   - {errorMsg}")
                Next

                ' ========== NEU: Sprachabhängige Meldung ==========
                Dim oTitle As String
                Dim oMessage As String

                Select Case USER_LANGUAGE
                    Case "de-DE"
                        oTitle = "Warnung"
                        oMessage = $"Einige Controls konnten nicht aktiviert/deaktiviert werden.{vbCrLf}Details im Log."
                    Case "fr-FR"
                        oTitle = "Avertissement"
                        oMessage = $"Certains contrôles n'ont pas pu être activés/désactivés.{vbCrLf}Détails dans le journal."
                    Case Else ' en-US, en-GB, etc.
                        oTitle = "Warning"
                        oMessage = $"Some controls could not be enabled/disabled.{vbCrLf}Details in the log."
                End Select

                MsgBox(oMessage, MsgBoxStyle.Exclamation, oTitle)
            End If

            MyValidationLogger.Debug("[EXIT 3] Controls2B_EnDisabled_onLoad: Normale Beendigung")

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Error($"[EXCEPTION EXIT] Controls2B_EnDisabled_onLoad: {ex.Message}")
            MyValidationLogger.Error($"[EXCEPTION STACK] {ex.StackTrace}")
        End Try
    End Sub
    Private Sub Depending_Control_Set_Result(displayboxname As String, sqlCommand As String, sqlConnection As String)
        Try
            MyValidationLogger.Debug("Setting Values for Control [{0}]", displayboxname)

            'Dim oResultTable As DataTable = ClassDatabase.Return_Datatable_ConId(sqlCommand, sqlConnection)
            Dim oResultTable As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(sqlCommand, DatabaseType.ECM) With {
                .ConnectionId = sqlConnection
            })

            If Not IsNothing(oResultTable) Then
                MyValidationLogger.Debug("Result Table has [{0}] rows", oResultTable.Rows.Count)
                MyValidationLogger.Debug("Result Table has [{0}] columns", oResultTable.Columns.Count)

                'Ist das Control ein Control was mehrfachwerte enthalten kann
                If displayboxname.StartsWith(ClassControlCreator.PREFIX_COMBOBOX) Or displayboxname.StartsWith(ClassControlCreator.PREFIX_LOOKUP) Or displayboxname.StartsWith(ClassControlCreator.PREFIX_TABLE) Then
                    MyValidationLogger.Debug("Control is Multivalue")

                    If displayboxname.StartsWith(ClassControlCreator.PREFIX_COMBOBOX) Then
                        MyValidationLogger.Debug("Filling Combobox with Results")

                        Dim oCombobox As Windows.Forms.ComboBox = PanelValidatorControl.Controls(displayboxname)

                        If IsNothing(oCombobox) Then
                            Exit Sub
                        End If

                        MyValidationLogger.Debug("Control exists, setting results.")

                        oCombobox.DataSource = Nothing
                        oCombobox.DataSource = oResultTable
                        oCombobox.DisplayMember = oResultTable.Columns(0).ColumnName
                        oCombobox.ValueMember = oResultTable.Columns(0).ColumnName

                    ElseIf displayboxname.StartsWith(ClassControlCreator.PREFIX_LOOKUP) Then
                        MyValidationLogger.Debug("Filling Lookup Control with Results")

                        Dim oLookup As LookupControl3 = PanelValidatorControl.Controls(displayboxname)

                        If IsNothing(oLookup) Then
                            Exit Sub
                        End If

                        MyValidationLogger.Debug("Control exists, setting results.")

                        oLookup.Properties.DataSource = Nothing
                        oLookup.Properties.DataSource = oResultTable

                    Else
                        'not implemented     
                        MyValidationLogger.Warn("⚠️ Depending_Control_Set_Result for [{0}] NOT IMPLEMENTED", displayboxname)
                    End If
                Else
                    If oResultTable.Rows.Count = 1 Then
                        PanelValidatorControl.Controls(displayboxname).Text = oResultTable.Rows(0).Item(0).ToString
                    Else
                        PanelValidatorControl.Controls(displayboxname).Text = "RESULT = resultDT.Rows.Count <> 1"
                        MyValidationLogger.Info(">> Datatable-SQL: " & sqlCommand)
                    End If
                End If
            Else
                MyValidationLogger.Warn("⚠️ Result Table is nothing!")
            End If
        Catch ex As Exception
            MyValidationLogger.Info("Unexpected Ersror in Depending_Control_Set_Result - ERROR: " & ex.Message)
            MsgBox("Unexpected error in Depending_Control_Set_Result: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
    Public Sub OnDTPValueChanged(sender As System.Object, e As System.EventArgs)
        Dim dtp As DateTimePicker = sender
        If _Indexe_Loaded = True Then
            If dtp.Name = last_control.Name Then
                ' Abschluss()
            Else
                SendKeys.Send("{TAB}")
                _ControlHandleStarted = True
            End If
        End If
    End Sub
    Private Function GetControlMetaBySql(filter As String, Optional SortBy As String = "") As DataTable
        Dim dt As DataTable = Nothing
        Dim cacheKey = $"META|{filter}|{SortBy}"

        If _CachedSqlDataCache.TryGetValue(cacheKey, dt) Then
            Return dt
        End If

        If BASEDATA_TBPM_PROFILE_CONTROLS IsNot Nothing Then
            Try
                Dim rows As DataRow()

                If String.IsNullOrWhiteSpace(filter) Then
                    rows = BASEDATA_TBPM_PROFILE_CONTROLS.Select()
                Else
                    rows = BASEDATA_TBPM_PROFILE_CONTROLS.Select(filter, SortBy)
                End If

                dt = BASEDATA_TBPM_PROFILE_CONTROLS.Clone()
                If rows.Length > 0 Then
                    dt = rows.CopyToDataTable()
                End If

                _CachedSqlDataCache(cacheKey) = dt
                Return dt
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ GetControlMetaBySql cache filter failed, fallback to DB: {ex.Message}")
            End Try
        End If

        ' Fallback zu SQL
        Dim query As String
        If String.IsNullOrWhiteSpace(filter) Then
            query = "SELECT * FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1"
        Else
            query = $"SELECT * FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND {filter}"
        End If

        If Not String.IsNullOrWhiteSpace(SortBy) Then
            query &= $" ORDER BY {SortBy}"
        End If
        dt = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(query, DatabaseType.ECM))
        If dt IsNot Nothing Then
            _CachedSqlDataCache(cacheKey) = dt
        End If

        Return dt
    End Function
    Private Function GetCachedDatatable(sql As String, connectionId As Integer) As DataTable
        Dim dt As DataTable = Nothing
        Dim cacheKey = $"{connectionId}|{sql}"

        If Not _CachedSqlDataCache.TryGetValue(cacheKey, dt) Then
            dt = DatabaseFallback.GetDatatable(New GetDatatableOptions(sql, DatabaseType.ECM) With {
                .ConnectionId = connectionId
            })
            If dt IsNot Nothing Then
                _CachedSqlDataCache(cacheKey) = dt
            End If
        End If

        Return dt
    End Function

    Private Function GetCachedScalar(sql As String, connectionId As Integer) As Object
        Dim result As Object = Nothing
        Dim cacheKey = $"SCALAR|{connectionId}|{sql}"

        If Not _CachedSqlScalarCache.TryGetValue(cacheKey, result) Then
            result = DatabaseFallback.GetScalarValueWithConnection(sql, connectionId)
            _CachedSqlScalarCache(cacheKey) = result
        End If

        Return result
    End Function
    Private Function CheckValueExists(ByVal control As Control)
        Try

            For Each dr As DataRow In DTVWCONTROL_INDEX.Rows
                If dr.Item("PROFIL_ID") = CURRENT_ProfilGUID And dr.Item("CTRL_NAME") = control.Name Then
                    Dim check = dr.Item("SQL_UEBERPRUEFUNG")
                    If IsDBNull(check) Then
                        MyValidationLogger.Debug("SQL Check is not configured!")
                        Return True
                    End If
                    If check.ToString.Length > 0 And Not {"@@DISPLAY_ONLY", "DD PM-ONLY FOR DISPLAY"}.Contains(dr.Item("INDEX_NAME")) Then
                        Dim oConnectionId = 1
                        If Not IsDBNull(dr.Item("CONNECTION_ID")) Then
                            oConnectionId = dr.Item("CONNECTION_ID")
                        Else
                            MyValidationLogger.Warn($"⚠️ CONNECTION_ID is DBNULL for control [{control.Name}] - using default connection ID 1")
                        End If
                        Dim cs As String = DatabaseFallback.GetConnectionString(oConnectionId)

                        If allgFunk.CheckValue_Exists(dr.Item("SQL_UEBERPRUEFUNG"), "@Eingabe", control.Text, dr.Item("TYP"), cs, CURRENT_ProfilGUID) = True Then
                            Return True
                        Else
                            errormessage = "the input-value '" & control.Text & "' is not existing in database!"
                            My.Settings.Save()
                            Return False
                        End If
                    Else
                        Return True
                    End If
                End If
            Next
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Unexpected error in CheckValueExists:" & ex.Message)
            Return False
        End Try
    End Function

    Public Function IsProcessRunning(name As String) As Boolean
        'here we're going to get a list of all running processes on
        'the computer
        For Each Process As Process In Process.GetProcesses()
            If Process.ProcessName.StartsWith(name) Then
                'process found so it's running so return true
                Return True
            End If
        Next
        'process not found, return false
        Return False
    End Function
    Function Get_Next_GUID() As Integer
        Try
            MyValidationLogger.Debug("Get_Next_GUID...")
            Dim oNewGUID As Integer
            Dim oBIT As Integer = 0
            If PROFIL_sortbynewest = True Then
                oBIT = 1
            End If
            Dim oSQL = $"EXEC PRPM_GET_NEXT_DOC_INFO {CURRENT_ProfilGUID},{CURRENT_DOC_ID},{USER_ID}"

            Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL)
            CURRENT_DOC_ID = 0
            CURRENT_DOC_GUID = 0
            If oDT.Rows.Count > 0 Then
                Try
                    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($"⚠️ ERRORMESSAGE [{ex.Message}]")
                End Try

                Try
                    CURRENT_DOC_ID = oDT.Rows(0).Item(1)
                    MyValidationLogger.Info($"Get_Next_GUID: CURRENT_DOC_ID [{CURRENT_DOC_ID}]...")
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ >> Attention: in GetNextGUID - Could not get the next DocID - SQL [{oSQL}]")
                    MyValidationLogger.Warn($"⚠️ ERRORMESSAGE [{ex.Message}]")
                End Try

                Try
                    Amount_Docs2Validate = CInt(oDT.Rows(0).Item(2))
                    MyValidationLogger.Debug($"Get_Next_GUID: Amount_Docs2Validate [{Amount_Docs2Validate}]...")
                Catch ex As Exception
                    Amount_Docs2Validate = 0
                    MyValidationLogger.Warn("⚠️ Amount_Docs2Validate Error: " & ex.Message)
                End Try
            Else
                MyValidationLogger.Info($">> Attention: GetNextGUID - Could not get the next GUID - SQL [{oSQL}]")
                If User.IsAdmin And LOGCONFIG.Debug = True Then
                    My.Computer.Clipboard.SetText(oSQL)
                    MsgBox($">> Attention: in GetNextGUID - Could not get a GUID(1)" & vbCrLf &
                             $"SQL kopiert: {oSQL.Substring(0, Math.Min(100, oSQL.Length))}...",
                                 MsgBoxStyle.Exclamation)
                End If
                oNewGUID = 0
                Return oNewGUID
            End If
            'newGUID = ClassDatabase.Execute_Scalar(oSQL, CONNECTION_STRING, True)

            WMDocPathWindows = ""
            CURRENT_DOC_PATH = ""
            CURRENT_WMFILE = Nothing
            If oNewGUID > 0 Then
                MyValidationLogger.Debug("newGUID: " & oNewGUID.ToString)

            ElseIf oNewGUID <> 0 Then
                MyValidationLogger.Info(" >> Attention: in GetNextGUID - Could not get a GUID(2)")
                oNewGUID = 0
            End If

            Return oNewGUID
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            oErrMsgMissingInput = "Unexpected error in Get_Next_GUID: " & ex.Message
            MyValidationLogger.Info(">> Unexpected error in Get_Next_GUID:: " & ex.Message, True)
            Return 0
        End Try

    End Function



    Private Function CreateWMObject() As Boolean
        Dim oWMOwnPath As String
        Try
            MyValidationLogger.Debug($"in GetWMDocFileString...'")


            If WM_AHWF_docPath <> String.Empty Then
                oWMOwnPath = WM_AHWF_docPath
                DocPathWindows = oWMOwnPath
            Else
                oWMOwnPath = DocPathWindows.Replace(WMSUFFIX, "")
            End If

            Try
                Dim oNormalizedPath = WINDREAM_MOD.GetNormalizedPath(oWMOwnPath, 1)
                CURRENT_WMFILE = WINDREAM_MOD.Session.GetWMObjectByPath(WMEntity.WMEntityDocument, oNormalizedPath)
                MyValidationLogger.Debug("CURRENT_WMFILE: [{0}]", CURRENT_WMFILE)
                Return True  ' ← Erfolg

            Catch comEx As System.Runtime.InteropServices.COMException
                ' ========== OPTIMIERT: Detaillierte COM-Fehlerbehandlung ==========
                MyValidationLogger.Error($"COM-Fehler HRESULT: {comEx.ErrorCode:X8}, Pfad: [{oWMOwnPath}]")

                Select Case comEx.ErrorCode
                    Case &H8004C005 ' Objekt nicht gefunden
                        errormessage = $"Dokument [{oWMOwnPath}] existiert nicht in windream!"
                    Case &H80040E14 ' Zugriff verweigert
                        errormessage = $"Keine Berechtigung für [{oWMOwnPath}]!"
                    Case Else
                        errormessage = $"windream-Fehler: {comEx.Message}"
                End Select

                ' ========== FIX 2: OpenfrmError() statt frmError.ShowDialog() ==========
                OpenfrmError(errormessage)
                ' ========== ENDE FIX 2 ==========

                Return False  ' ← Fehler
            End Try

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Unexpected error creating WMObject(1) in GetWMDocFileString: " & ex.Message)
            MyValidationLogger.Info("Error Number: " & Err.Number.ToString)
            errormessage = $"Could not create a WMObject(1) for [{oWMOwnPath}]!"
            ' ========== FIX 4: Auch hier OpenfrmError() verwenden ==========
            OpenfrmError(errormessage)
            Return False
            ' ========== ENDE FIX 4 ==========
        End Try
    End Function
    Private Function GetDocPathWindows(_CheckStandard As Integer)
        Try
            If ActiveWorkflowType = ConstAHWorkflow_BlindFile Then
                WMDocPathWindows = WM_AHWF_docPath
                CURRENT_DOC_PATH = WM_AHWF_docPath
                Return True
            End If

            Dim oFilePath_from_DB As String

            WMDocPathWindows = String.Empty
            If OPERATION_MODE_FS <> ClassConstants.OpModeFS_ZF Then
                Dim oSQL = $"SELECT dbo.FNPM_GET_FILEPATH({CURRENT_DOC_GUID},{_CheckStandard}) AS PATH0, dbo.FNPM_GET_FILEPATH({CURRENT_DOC_GUID},1) AS PATH1"
                Dim oDT As DataTable = DatabaseFallback.GetDatatableECM(oSQL)

                If oDT Is Nothing OrElse oDT.Rows.Count = 0 Then
                    MyValidationLogger.Warn("⚠️ GetDocPathWindows: No result for file paths!")
                    Return False
                End If

                Dim oPath0 = ObjectEx.NotNull(oDT.Rows(0).Item("PATH0"), String.Empty).ToString
                Dim oPath1 = ObjectEx.NotNull(oDT.Rows(0).Item("PATH1"), String.Empty).ToString

                MyValidationLogger.Debug($"First Checking file [{oPath0}] exists?...")

                If oPath0 <> String.Empty AndAlso File.Exists(oPath0) Then
                    oFilePath_from_DB = oPath0
                Else
                    MyValidationLogger.Info($"Getting filepath with standard 1 ...")
                    MyValidationLogger.Debug($"Second Checking file [{oPath1}] exists?...")
                    If oPath1 <> String.Empty AndAlso File.Exists(oPath1) Then
                        oFilePath_from_DB = oPath1
                    Else
                        MyValidationLogger.Info($"Second FileExists also returned false [{oPath1}]!")
                        DocPathWindows = oPath1
                        MyValidationLogger.Warn($"⚠️ GetDocPathWindows: File [{oPath1}] not existing!")
                        Return False
                    End If
                End If

            Else
                oFilePath_from_DB = ClassConstants.OpModeFS_ZF
                MyValidationLogger.Debug($"GetDocPathWindows: Filestore is {ClassConstants.OpModeFS_ZF}")
            End If


            If COPY_WMFILE_2TEMP = True Then
                ' Optionen konfigurieren
                Dim options As New DocumentPathHandler.DocumentPathOptions With {
        .EnableMapping = True,
        .WMSuffix = WMSUFFIX,
        .SpecificDrive = If(Len(MAP_SHARE_DRIVE) = 1, MAP_SHARE_DRIVE, ""),
        .DriveBlacklist = MAP_BLACKLIST,
        .CopyToTemp = True,
        .TempFolder = TEMP_DOCUMENT_FOLDER,
        .UnmapAfterCopy = True
    }

                ' Verarbeiten
                Dim result = _documentPathHandler.ProcessDocumentPath(oFilePath_from_DB, options)

                ' Guard: FinalPath muss nutzbar sein
                If result.Success AndAlso
                    Not String.IsNullOrWhiteSpace(result.FinalPath) AndAlso
                    File.Exists(result.FinalPath) Then

                    DocPathWindows = result.FinalPath
                    WMDocPathWindows = oFilePath_from_DB
                    MyValidationLogger.Info($"✓ Dokument verarbeitet: [{Path.GetFileName(result.FinalPath)}]")
                Else
                    MyValidationLogger.Warn($"⚠️ Dokumentpfad-Verarbeitung fehlgeschlagen: {result.ErrorMessage}")
                    MyValidationLogger.Warn($"⚠️ Fallback auf Originalpfad: [{oFilePath_from_DB}]")

                    DocPathWindows = oFilePath_from_DB
                    WMDocPathWindows = oFilePath_from_DB

                    ' Sicherheitsprüfung des Fallbacks
                    If Not File.Exists(DocPathWindows) Then
                        MyValidationLogger.Error($"❌ Auch Fallback-Pfad existiert nicht: [{DocPathWindows}]")
                        Return False
                    End If
                End If
            Else
                DocPathWindows = oFilePath_from_DB
                MyValidationLogger.Info($"📄 Verwende Originalpfad: [{oFilePath_from_DB}]")
            End If
            MyValidationLogger.Info($"GetWMDocPathWindows CURRENT_DOC_PATH: {CURRENT_DOC_PATH}")
            Return True
        Catch ex As Exception
            WMDocPathWindows = ""
            CURRENT_DOC_PATH = ""
            errormessage = $"Unexpected error in GetDocPathWindows: [{ex.Message}]!"
            frmError.ShowDialog()
            Return False
        End Try


    End Function
    Private Sub CleanupCurrentTempFile()
        Try
            ' Prüfen ob DocPathWindows eine Temp-Datei ist
            If COPY_WMFILE_2TEMP = True AndAlso
           Not String.IsNullOrEmpty(DocPathWindows) AndAlso
           Not String.IsNullOrEmpty(TEMP_DOCUMENT_FOLDER) AndAlso
           DocPathWindows.StartsWith(TEMP_DOCUMENT_FOLDER, StringComparison.OrdinalIgnoreCase) Then

                If System.IO.File.Exists(DocPathWindows) Then
                    System.IO.File.Delete(DocPathWindows)
                    MyValidationLogger.Debug($"🗑️ Temp-Datei gelöscht: [{System.IO.Path.GetFileName(DocPathWindows)}]")
                End If
            End If

        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ Temp-Datei konnte nicht gelöscht werden: {ex.Message}")
        End Try
    End Sub
    Sub Load_IDB_DOC_DATA()
        Try
            Dim oSQl As String = IDB_DOC_DATA_SQL
            oSQl = oSQl.Replace("@DOC_GUID", CURRENT_DOC_GUID)
            oSQl = oSQl.Replace("@DOC_ID", CURRENT_DOC_ID)
            oSQl = oSQl.Replace("@DocID", CURRENT_DOC_ID)
            MyValidationLogger.Debug($"Load_IDB_DOC_DATA SQL: {oSQl}")
            IDB_DT_DOC_DATA = DatabaseFallback.GetDatatableECM(oSQl)
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try
    End Sub


    Sub Load_Next_Document(first As Boolean)
        If LOG_HOTSPOTS Then
            ' ========== DIAGNOSE START ==========
            MyValidationLogger.Info($"LOG_HOTSPOTS - Load_Next_Document START - first: {first}")
            MyValidationLogger.Info($"LOG_HOTSPOTS - frmValidator.IsDisposed: {Me.IsDisposed}")
            MyValidationLogger.Info($"LOG_HOTSPOTS - frmValidator.Visible: {Me.Visible}")
            MyValidationLogger.Info($"LOG_HOTSPOTS - _FormClosing: {_FormClosing}")
            MyValidationLogger.Info($"LOG_HOTSPOTS - CURRENT_DOC_GUID: {CURRENT_DOC_GUID}")
            ' ========== ENDE DIAGNOSE ==========
        End If

        Dim oMilliseconts As Double
        clsPatterns.ClearControlCache()  ' Cache-Invalidierung
        Dim perfStart As DateTime = DateTime.MinValue
        Dim perfLastCheck As DateTime = DateTime.MinValue
        If LOG_HOTSPOTS Then
            perfStart = DateTime.Now
            perfLastCheck = perfStart
            MyValidationLogger.Info("LOG_HOTSPOTS - Load_Next_Document START")
        End If

        _CachedSqlDataCache.Clear()
        _CachedSqlScalarCache.Clear()
        _CachedSqlControlsByGuid = Nothing
        CURRENT_WMFILE = Nothing
        activate_controls(False)
        oErrMsgMissingInput = ""
        WMDocPathWindows = ""

        Override = False
        OverrideAll = False
        _Indexe_Loaded = False
        MyValidationLogger.Debug("In Load_Next_Document")
        If Not first AndAlso COPY_WMFILE_2TEMP = True Then
            Try
                CleanupCurrentTempFile()
            Catch cleanupEx As Exception
                MyValidationLogger.Warn($"⚠️ Fehler beim Löschen der vorherigen Temp-Datei: {cleanupEx.Message}")
            End Try
        End If
        Dim layoutSuspended As Boolean = False
        Try
            If first = True Then
                MyValidationLogger.Debug("First Document")
                CURRENT_WMFILE = Nothing
            Else
                MyValidationLogger.Debug("Following Document ")
            End If

            If first = False Then
                PanelValidatorControl.SuspendLayout()
                layoutSuspended = True
                Clear_all_Input()
            End If

            MyValidationLogger.Debug($"CURRENT_JUMP_DOC_GUID: {CURRENT_JUMP_DOC_GUID}'")
            If CURRENT_JUMP_DOC_GUID = 0 Then
                CURRENT_DOC_GUID = Get_Next_GUID()
                MyValidationLogger.Debug($"CURRENT_JUMP_DOC_GUID = 0 ## NEW CURRENT_DOC_GUID: {CURRENT_DOC_GUID}'")
            ElseIf first = False Then
                CURRENT_DOC_GUID = 0
            End If

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Get_Next_GUID: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            MyValidationLogger.Info("LoadNextDocument - Dokument-GUID: '" & CURRENT_DOC_GUID.ToString & "'")
            If CURRENT_DOC_GUID > 0 Then
                If (OPERATION_MODE_FS = ClassConstants.OpModeFS_PWM Or OPERATION_MODE_FS = ClassConstants.OpModeFS_IDBWM) And GetDocPathWindows(0) = False Then
                    SetStatusLabel($"File not accessible: {DocPathWindows}", "DarkOrange")
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"LOG_HOTSPOTS - Nach GetDocPathWindows: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                If IDB_ACTIVE = False Then
                    If CreateWMObject() = False Then
                        Exit Sub
                    End If
                Else
                    Load_IDB_DOC_DATA()

                    If LOG_HOTSPOTS Then
                        MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Load_IDB_DOC_DATA: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                        perfLastCheck = DateTime.Now
                    End If
                    If IsNothing(IDB_DT_DOC_DATA) Then
                        MyValidationLogger.Warn("⚠️ ATTENTION: IDB-Data is nothing. Check the IDB_DOC_DATA_SQL Variable Source")
                        Exit Sub
                    Else
                        If IDB_DT_DOC_DATA.Rows.Count = 1 Then
                            MyValidationLogger.Debug("Got one IDB DocData Result")
                        End If
                    End If
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"LOG_HOTSPOTS - Nach CreateWMObject/Load_IDB_DOC_DATA: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If
                PRTF_PROFILE_FILES_WORK("InWork")
                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"LOG_HOTSPOTS - Nach IN_WORK-UPDATE: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                If Amount_Docs2Validate > 1 Then
                    Dim omsg = String.Format(Translation_Strings.Verbleibende_Vorgänge___0_, Amount_Docs2Validate - 1)
                    bsiInformation.Caption = omsg
                    bsiInformation.Caption = omsg
                    If RbnPgGrpActions.Visible = False Then
                        RbnPgGrpActions.Visible = True
                    End If
                    bbtniNext.Visibility = BarItemVisibility.Always
                Else
                    bbtniNext.Visibility = BarItemVisibility.Never
                    If bbtniDelete.Visibility = BarItemVisibility.Never And bbtniAnnotation.Visibility = BarItemVisibility.Never Then
                        RbnPgGrpActions.Visible = False
                    End If
                    bsiInformation.Caption = ""
                End If

                bsiDocID.Caption = "Document-ID: " & CURRENT_DOC_ID & " - GUID: " & CURRENT_DOC_GUID

                MyValidationLogger.Debug("AllDocInfo created...")
                If IDB_ACTIVE = False Then
                    oErrMsgMissingInput = Windream_get_Doc_info()
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Windream_get_Doc_info: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If



                If oErrMsgMissingInput = "" Then
                    If DocPathWindows <> String.Empty Or OPERATION_MODE_FS = ClassConstants.OpModeFS_ZF Then
                        LoadDocument_DDViewer()
                        If Current_Document.Extension <> "pdf" Then
                            bbtniAnnotation.Visibility = BarItemVisibility.Never
                        End If
                    End If

                    If LOG_HOTSPOTS Then
                        oMilliseconts = (DateTime.Now - perfLastCheck).TotalMilliseconds
                        If oMilliseconts > 6000 Then
                            MyValidationLogger.Warn($"LOG_HOTSPOTS - ⚠️ LoadDocument_DDViewer lasted far to long: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                        Else
                            MyValidationLogger.Info($"LOG_HOTSPOTS - Nach LoadDocument_DDViewer: {oMilliseconts}ms")
                        End If
                        perfLastCheck = DateTime.Now
                    End If

                    If String.IsNullOrWhiteSpace(DocCurrency) OrElse DocCurrency = "EUR" Then
                        Try
                            Dim oCurrency As String = "EUR"  ' Default

                            If Not String.IsNullOrWhiteSpace(PROFIL_CURRENCY_ATTRIBUTE) Then
                                Dim rawValue = GetVariableValuefromSource(PROFIL_CURRENCY_ATTRIBUTE, 1, False)

                                If rawValue IsNot Nothing AndAlso Not IsDBNull(rawValue) Then
                                    Dim currencyCandidate = rawValue.ToString().Trim().ToUpper()

                                    ' Validierung: ISO 4217 (3 Zeichen)
                                    If currencyCandidate.Length = 3 AndAlso Not currencyCandidate.Contains(" ") Then
                                        oCurrency = currencyCandidate
                                        MyValidationLogger.Debug($"✓ Währung aus Attribut [{PROFIL_CURRENCY_ATTRIBUTE}]: {oCurrency}")
                                    Else
                                        MyValidationLogger.Warn($"⚠️ Ungültige Währung [{currencyCandidate}] (Länge: {currencyCandidate.Length}) → Fallback EUR")
                                    End If
                                Else
                                    MyValidationLogger.Warn($"⚠️ Währungsattribut [{PROFIL_CURRENCY_ATTRIBUTE}] ist Nothing/DBNull → EUR")
                                End If
                            Else
                                MyValidationLogger.Debug("Kein PROFIL_CURRENCY_ATTRIBUTE konfiguriert → EUR")
                            End If

                            DocCurrency = oCurrency
                            MyValidationLogger.Info($"[FINAL] DocCurrency = [{DocCurrency}]")

                        Catch ex As Exception
                            MyValidationLogger.Error($"Währungsladung fehlgeschlagen: {ex.Message}")
                            DocCurrency = "EUR"
                        End Try
                    End If

                    FillIndexValues(first, "")


                    UpdateGridCurrencyFormats()

                    If LOG_HOTSPOTS Then
                        oMilliseconts = (DateTime.Now - perfLastCheck).TotalMilliseconds
                        If oMilliseconts > 6000 Then
                            MyValidationLogger.Warn($"LOG_HOTSPOTS - ⚠️ FillIndexValues lasted far to long: {oMilliseconts}ms")
                        Else
                            MyValidationLogger.Info($"LOG_HOTSPOTS - Nach FillIndexValues: {oMilliseconts}ms")
                        End If

                        perfLastCheck = DateTime.Now
                    End If

                    Dim sqlControls As DataRow() = Nothing
                    If DTCONTROLS_WITH_SQL IsNot Nothing AndAlso DTCONTROLS_WITH_SQL.Rows.Count > 0 Then
                        sqlControls = DTCONTROLS_WITH_SQL.Select($"PROFIL_ID = {CURRENT_ProfilGUID}")
                    End If

                    If sqlControls IsNot Nothing AndAlso sqlControls.Length > 0 Then
                        Dim sqlControlIds As New HashSet(Of Integer)()
                        For Each r As DataRow In sqlControls
                            Dim controlId As Integer = 0
                            If Integer.TryParse(r.Item("GUID").ToString, controlId) Then
                                sqlControlIds.Add(controlId)
                            End If
                        Next

                        For Each oControl As Control In PanelValidatorControl.Controls
                            Dim controlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid
                            If sqlControlIds.Contains(controlId) Then
                                LoadSQLData(oControl, controlId)
                            End If
                        Next
                    End If

                    If LOG_HOTSPOTS Then
                        MyValidationLogger.Info($"LOG_HOTSPOTS - Nach LoadSQLData-Loop: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                        perfLastCheck = DateTime.Now
                    End If

                    If PROFIL_LOGINDEX <> "" Then
                        Dim oLogString = $"PMProfile loaded: [{CURRENT_ProfilGUID}-{CURRENT_ProfilName}]{PMDelimiter}{USER_USERNAME}{PMDelimiter}{Now.ToString}"
                        If IDB_ACTIVE = False Then
                            WMIndexVectofield(oLogString, PROFIL_LOGINDEX)
                        Else
                            oLogString = $"PMProfile loaded: [{CURRENT_ProfilGUID}-{CURRENT_ProfilName}]"
                            IDBData.SetVariableValue(PROFIL_LOGINDEX, oLogString)
                        End If
                    End If
                    activate_controls(True)
                Else
                    errormessage = oErrMsgMissingInput
                    frmError.ShowDialog()
                End If
            Else
                If oErrMsgMissingInput <> "" Then
                    errormessage = oErrMsgMissingInput
                    frmError.ShowDialog()
                Else
                    Dim oMsg = Translation_Strings.Ende_des_Profils___Keine_weiteren_Vorgänge
                    MyValidationLogger.Info(oMsg)
                    MyValidationLogger.Debug(oMsg)
                    activate_controls(True)
                    MyValidationLogger.Debug("Closing the form...")
                    Me.Close()
                End If
            End If

            Try
                If DocCurrency <> String.Empty Then
                    If DocCurrency.ToString.Length <> 3 Then
                        DocCurrency = "EUR"
                    End If
                    For Each oControl As Control In PanelValidatorControl.Controls
                        Try
                            If TypeOf oControl Is GridControl Then
                                Dim oGrid As GridControl = DirectCast(oControl, GridControl)
                                Dim oControlMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)
                                Dim oFilteredDatatable As DataTable = DT_COLUMNS_GRID.Clone()
                                Dim oExpression = $"CONTROL_ID = {oControlMeta.Guid}"
                                DT_COLUMNS_GRID.Select(oExpression, "SEQUENCE").CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)

                                Dim oCultureInfo As CultureInfo = New CultureInfo("de-DE")
                                oCultureInfo.NumberFormat.CurrencySymbol = DocCurrency
                                Dim riTextEdit As RepositoryItemTextEdit = New RepositoryItemTextEdit()
                                riTextEdit.MaskSettings.Configure(Of MaskSettings.Numeric)(Sub(settings)
                                                                                               settings.MaskExpression = "c"
                                                                                               settings.Culture = oCultureInfo
                                                                                           End Sub)
                                riTextEdit.UseMaskAsDisplayFormat = True
                                oGrid.RepositoryItems.Add(riTextEdit)

                                Dim oGridView As GridView = DirectCast(oGrid.FocusedView, GridView)
                                For Each oCol As GridColumn In oGridView.Columns
                                    Dim oColumnData As DataRow = oFilteredDatatable.Select($"SPALTENNAME = '{oCol.FieldName}'").FirstOrDefault()
                                    If oColumnData Is Nothing Then
                                        Continue For
                                    End If
                                    Dim oColumnType As String = oColumnData.Item("TYPE_COLUMN")
                                    If oColumnType = "CURRENCY" Then
                                        oCol.DisplayFormat.FormatType = FormatType.Custom
                                        oCol.ColumnEdit = riTextEdit
                                    End If
                                Next
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                        End Try
                    Next
                End If
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ Unexpected error in display format Currency: " & ex.Message)
            End Try

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Currency-Format: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            Try
                Show_WF_Messages(False)
            Catch ex As Exception
                MyValidationLogger.Error(ex)
            End Try
            If LOG_HOTSPOTS Then
                oMilliseconts = (DateTime.Now - perfLastCheck).TotalMilliseconds
                If oMilliseconts > 6000 Then
                    MyValidationLogger.Warn($"LOG_HOTSPOTS - ⚠️ Show_WF_Messages lasted far to long: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                Else
                    MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Show_WF_Messages: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                End If

                perfLastCheck = DateTime.Now
            End If
            _FormLoaded = True
            MyValidationLogger.Debug($"[DIAGNOSE] VOR Controls2B_EnDisabled_onLoad:")
            MyValidationLogger.Debug($"   _FormLoaded = [{_FormLoaded}]")
            MyValidationLogger.Debug($"   _FormClosing = [{_FormClosing}]")
            MyValidationLogger.Debug($"   IsDisposed = [{Me.IsDisposed}]")

            Controls2B_EnDisabled_onLoad()

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"LOG_HOTSPOTS - Nach Controls2B_EnDisabled: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
            MyValidationLogger.Debug("frmValidator: LoadNextDocument finished!")

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            errormessage = "unexpected error in Load_Next_Document:" & ex.Message
            My.Settings.Save()
            PRTF_PROFILE_FILES_WORK("FreeFile")
            MyValidationLogger.Info("unexpected error in Load_Next_Document: " & ex.Message)

            frmError.ShowDialog()
        Finally
            If layoutSuspended Then
                PanelValidatorControl.ResumeLayout()
            End If
            CloseOverlaySafe()
            If LOG_HOTSPOTS Then
                ' ========== DIAGNOSE ENDE ==========
                MyValidationLogger.Info($"LOG_HOTSPOTS - Load_Next_Document ENDE")
                MyValidationLogger.Info($"LOG_HOTSPOTS - frmValidator.IsDisposed: {Me.IsDisposed}")
                MyValidationLogger.Info($"LOG_HOTSPOTS - frmValidator.Visible: {Me.Visible}")
                ' ========== ENDE DIAGNOSE ==========
                MyValidationLogger.Info($"LOG_HOTSPOTS - Load_Next_Document GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
            End If
        End Try
    End Sub
    ''' <summary>
    ''' Aktualisiert die Währungsformatierung aller GridControls basierend auf DocCurrency.
    ''' Wird nach FillIndexValues aufgerufen, wenn DocCurrency ≠ "EUR".
    ''' </summary>
    Private Sub UpdateGridCurrencyFormats()
        Try
            Dim currencySymbol As String = GetCurrencySymbol(DocCurrency)

            ' *** FIX: Währungssymbol IMMER für alle Grids im Shared Cache setzen,
            ' auch bei EUR. Sonst bleibt ein veraltetes Symbol (z.B. CHF) vom
            ' vorherigen Dokument im Cache stehen, weil der Early-Return den
            ' Cache-Reset überspringt. ***
            For Each oControl As Control In PanelValidatorControl.Controls
                If TypeOf oControl Is GridControl Then
                    taskFLOW.ControlCreator.GridControl.SetCurrencySymbolForGrid(oControl.Name, currencySymbol)
                End If
            Next

            ' Nur die aufwändige Format-Aktualisierung (ColumnEdit, DisplayFormat etc.)
            ' ist bei EUR nicht nötig, da EUR der Default beim Erstellen der Controls ist.
            If String.IsNullOrEmpty(DocCurrency) OrElse DocCurrency = "EUR" Then
                MyValidationLogger.Debug("[UpdateGridCurrencyFormats] DocCurrency is EUR or empty, cache updated but skipping format rebuild.")
                Return
            End If

            MyValidationLogger.Info("[UpdateGridCurrencyFormats] Updating all GridControls to currency [{0}]", DocCurrency)

            ' Alle Controls auf dem Panel durchlaufen
            For Each oControl As Control In PanelValidatorControl.Controls
                Try
                    ' Prüfe ob es ein GridControl ist
                    If TypeOf oControl Is GridControl Then
                        Dim oGrid As GridControl = DirectCast(oControl, GridControl)
                        Dim oView As GridView = TryCast(oGrid.MainView, GridView)

                        If oView Is Nothing Then
                            Continue For
                        End If

                        ' Control-Metadaten abrufen
                        Dim oMeta As ClassControlCreator.ControlMetadata = TryCast(oGrid.Tag, ClassControlCreator.ControlMetadata)
                        If oMeta Is Nothing Then
                            MyValidationLogger.Warn("[UpdateGridCurrencyFormats] No metadata found for GridControl [{0}]", oGrid.Name)
                            Continue For
                        End If

                        Dim oControlId As Integer = oMeta.Guid

                        ' Spalten-Definition für dieses GridControl abrufen
                        Dim oColumnTable As DataTable = Nothing
                        If Not ControlCreator.GridColumns.ContainsKey(oControlId) Then
                            MyValidationLogger.Warn("[UpdateGridCurrencyFormats] No column definition found for GridControl [{0}] (ID: {1})", oGrid.Name, oControlId)
                            Continue For
                        End If

                        oColumnTable = ControlCreator.GridColumns(oControlId)

                        ' Prüfe ob überhaupt CURRENCY-Spalten vorhanden sind
                        Dim hasCurrencyColumns As Boolean = False
                        For Each row As DataRow In oColumnTable.Rows
                            If row.Item("TYPE_COLUMN").ToString() = "CURRENCY" Then
                                hasCurrencyColumns = True
                                Exit For
                            End If
                        Next

                        If Not hasCurrencyColumns Then
                            MyValidationLogger.Debug("[UpdateGridCurrencyFormats] GridControl [{0}] has no CURRENCY columns, skipping.", oGrid.Name)
                            Continue For
                        End If

                        ' GridControl-Helper erstellen und Währungsformat aktualisieren
                        Dim oGridControlHelper As New ControlCreator.GridControl(LOGCONFIG, ControlCreator.GridTables, currencySymbol)
                        oGridControlHelper.UpdateCurrencyFormat(oColumnTable, oView, oGrid, currencySymbol)

                        MyValidationLogger.Info("[UpdateGridCurrencyFormats] ✓ Updated GridControl [{0}] to currency [{1}]", oGrid.Name, DocCurrency)
                    End If

                Catch ex As Exception
                    MyValidationLogger.Error("[UpdateGridCurrencyFormats] Error updating GridControl [{0}]: {1}", oControl.Name, ex.Message)
                    MyValidationLogger.Error(ex)
                End Try
            Next

            MyValidationLogger.Info("[UpdateGridCurrencyFormats] ✓ Currency format update completed for all GridControls")

        Catch ex As Exception
            MyValidationLogger.Error("[UpdateGridCurrencyFormats] Fatal error: {0}", ex.Message)
            MyValidationLogger.Error(ex)
        End Try
    End Sub

    ''' <summary>
    ''' Ermittelt das Währungssymbol basierend auf dem Währungscode (ISO 4217).
    ''' </summary>
    Private Function GetCurrencySymbol(currencyCode As String) As String
        If String.IsNullOrEmpty(currencyCode) Then
            Return "EUR"
        End If

        ' Währungscode normalisieren (Großbuchstaben, trimmen)
        currencyCode = currencyCode.Trim().ToUpper()

        Try
            ' Versuche CultureInfo zu finden, die diese Währung verwendet
            Dim cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures)

            For Each culture As CultureInfo In cultures
                Try
                    Dim region As New RegionInfo(culture.Name)
                    If region.ISOCurrencySymbol.Equals(currencyCode, StringComparison.OrdinalIgnoreCase) Then
                        Return region.ISOCurrencySymbol
                    End If
                Catch
                    ' Culture unterstützt keine RegionInfo, weitermachen
                End Try
            Next

        Catch ex As Exception
            MyValidationLogger.Warn("[GetCurrencySymbol] Could not determine symbol for currency [{0}]: {1}", currencyCode, ex.Message)
        End Try

        ' Fallback: Manuelle Zuordnung für häufige Währungen
        Select Case currencyCode
            Case "EUR"
                Return "EUR"
            Case "USD"
                Return "USD"
            Case "GBP"
                Return "GBP"
            Case "CHF"
                Return "CHF"
            Case "JPY"
                Return "JPY"
            Case "CNY"
                Return "CNY"
            Case "PLN"
                Return "PLN"
            Case "CZK"
                Return "CZK"
            Case "HUF"
                Return "HUF"
            Case Else
                ' Fallback: Währungscode selbst verwenden
                MyValidationLogger.Info("[GetCurrencySymbol] Using currency code [{0}] as symbol (no symbol found)", currencyCode)
                Return currencyCode
        End Select
    End Function
    Sub Show_WF_Messages(pShow As Boolean)
        Try
            If Not Application.OpenForms().OfType(Of frmValidator_Messages).Any Then
                Dim oSQLMessage = $"SELECT 
	                                CONVERT(VARCHAR(30), A.ADDED_WHEN,20) + ' - ' +  B.STRING1 as MSG,A.ImageIndex 
                                FROM 
	                                TBTFVALIDATOR_MESSAGE A INNER JOIN 
	                                (SELECT * FROM TBDD_GUI_LANGUAGE_PHRASE 
	                                WHERE MODULE = 'PM' AND OBJ_NAME = 'frmValidator' AND CAPT_TYPE = 'WF_MESSAGE') B ON A.GUI_LANG_TITLE = B.TITLE
                                WHERE 
	                                A.Active = 1 and (A.DocID = {CURRENT_DOC_ID}) AND B.LANGUAGE = '{USER_LANGUAGE}' ORDER BY A.ADDED_WHEN DESC"
                If SQL_WF_MESSAGES <> String.Empty Then
                    oSQLMessage = SQL_WF_MESSAGES
                    oSQLMessage = oSQLMessage.Replace("@DocID", CURRENT_DOC_ID)
                    oSQLMessage = oSQLMessage.Replace("@LANGUAGE", USER_LANGUAGE)
                    oSQLMessage = oSQLMessage.Replace("@UserID", USER_ID)
                    oSQLMessage = oSQLMessage.Replace("@UserName", USER_USERNAME)
                End If
                DTInfoDoc = DatabaseFallback.GetDatatableECM(oSQLMessage)
                If DTInfoDoc.Rows.Count > 0 Then
                    rbnPgGroupHinweise.Visible = True
                    bchkitmNotes.Checked = CONFIG.Config.NOTES_ONCLICK
                    If CONFIG.Config.NOTES_ONCLICK = False Or pShow = True Then
                        Dim ofrmMessage As New frmValidator_Messages(DTInfoDoc)
                        frmMessages = ofrmMessage
                        ofrmMessage.Show()
                    End If

                Else
                    rbnPgGroupHinweise.Visible = False
                End If
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try
    End Sub
    Sub LoadDocument_DDViewer()
        Try
            Dim oDocument As DocumentResultList.Document = Nothing
            ' Load DocumentInfo 
            oDocument = DD_Documentloader.Load(CURRENT_DOC_ID, DocPathWindows)
            If oDocument Is Nothing Then
                Exit Sub
            End If
            Current_Document = oDocument
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            Exit Sub
        End Try
        If ActiveWorkflowType = ConstAHWorkflow_BlindFile Or PROFILE_SHOW_DOCUMENT = False Then
            If PROFILE_SHOW_DOCUMENT = False And ActiveWorkflowType <> ConstAHWorkflow_BlindFile Then
                MyValidationLogger.Warn("⚠️ PROFILE_SHOW_DOCUMENT = False - DocumentViewer won't be displayed. Configuration error?")
            End If
            SplitContainer1.Panel2Collapsed = True
            If Not IsNothing(DocumentViewer1) Then
                DocumentViewer1.Visible = False
            End If

            RibbonPageFile.Visible = False
            Exit Sub
        Else
            If Not IsNothing(DocumentViewer1) Then
                DocumentViewer1.Visible = True
            End If

        End If


        ' Load Document in Document Viewer
        Dim oFileName = $"{CURRENT_DOC_ID}.{Current_Document.Extension}"
        If Not IsNothing(DocumentViewer1) Then
            MyValidationLogger.Info("LoadDocument_DDViewer - Current_Document.FullPath: " & Current_Document.FullPath)
            If (OPERATION_MODE_FS = ClassConstants.OpModeFS_PWM Or OPERATION_MODE_FS = ClassConstants.OpModeFS_IDBWM) Then
                DocumentViewer1.LoadFile_FromPath(Current_Document.FullPath)
                'Erstmal auskommentiert
                'DocumentViewer1.LoadFile(oFileName, New MemoryStream(Current_Document.Contents))
            Else
                'DocumentViewer1.LoadFile(oFileName, New MemoryStream(Current_Document.Contents))


            End If

            DocumentViewer1.RightOnlyView(USER_RIGHT_VIEW_ONLY) 'war auskommentiert.....WARUM?
        End If

        If USER_RIGHT_VIEW_ONLY = True Then
            RibbonPageFile.Visible = False
            LOGGER.Debug("User has view-only rights, hiding RibbonPageFile.")
        Else
            RibbonPageFile.Visible = True
        End If
        SplitContainer1.Panel2Collapsed = False
    End Sub
    Sub activate_controls(pStatus As Boolean)
        Try
            MyValidationLogger.Debug("Sub activate_controls - status = " + pStatus.ToString)
            Me.PanelValidatorControl.Enabled = pStatus
            Me.btnSave.Enabled = pStatus
        Catch ex As Exception
            MyValidationLogger.Error(ex)
        End Try

    End Sub
    Private Function Windream_get_Doc_info()
        Try

            'If CultureInfo.CurrentUICulture.ThreeLetterISOLanguageName = "eng" Then
            '    My.Settings.vIDX_DMS_ERSTELLT = "DMS Created"
            '    dmsCreated = "DMS Created"
            '    My.Settings.vIDX_DMS_ERSTELLT_Zeit = "DMS Created Time"
            '    dmscreatedtime = "DMS Created Time"
            '    My.Settings.Save()
            'Else

            'End If
            Try
                MyValidationLogger.Debug($"GetVariableValue [{INDEX_DMS_ERSTELLT}]...")
                CURRENT_DOC_CREATION_DATE = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT)
            Catch ex As Exception
                MyValidationLogger.Error(ex)
                If ex.Message.Contains("Variable: " & INDEX_DMS_ERSTELLT & " not found!") Then
                    MyValidationLogger.Info("1. Ausnahme in Windream_get_Doc_info: Variable: " & INDEX_DMS_ERSTELLT & " not found", True)
                    MyValidationLogger.Info("1. Ausnahme-Fehler: " & ex.Message)
                    If INDEX_DMS_ERSTELLT = "DMS Created" Then

                        INDEX_DMS_ERSTELLT = "DMS erstellt"
                        INDEX_DMS_ERSTELLT_ZEIT = "DMS erstellt (Zeit)"
                        CONFIG.Config.IndexDmsErstellt = INDEX_DMS_ERSTELLT
                        CONFIG.Config.IndexDmsErstelltZeit = INDEX_DMS_ERSTELLT_ZEIT
                        CONFIG.Save()

                        'SaveMySettingsValue("IDX_DMS_ERSTELLT_ZEIT", "DMS erstellt (Zeit)")
                        'SaveMySettingsValue("IDX_DMS_ERSTELLT", "DMS erstellt")
                    Else
                        INDEX_DMS_ERSTELLT = "DMS Created"
                        INDEX_DMS_ERSTELLT_ZEIT = "DMS Created Time"
                        CONFIG.Config.IndexDmsErstellt = INDEX_DMS_ERSTELLT
                        CONFIG.Config.IndexDmsErstelltZeit = INDEX_DMS_ERSTELLT_ZEIT
                        'SaveMySettingsValue("IDX_DMS_ERSTELLT", "DMS Created")
                        'SaveMySettingsValue("IDX_DMS_ERSTELLT_ZEIT", "DMS erstellt Time")
                    End If

                    CURRENT_DOC_CREATION_DATE = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT)
                Else
                    MyValidationLogger.Info("error in Windream_get_Doc_info 1: " & ex.Message)
                    Return "error in Windream_get_Doc_info 1: " & ex.Message
                End If
            End Try

            MyValidationLogger.Debug("DMS-Erstellt aus WD: " & CURRENT_DOC_CREATION_DATE)

            Try
                MyValidationLogger.Debug($"GetVariableValue [{INDEX_DMS_ERSTELLT_ZEIT}]...")
                CURRENT_DOC_CREATION_TIME = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT_ZEIT)
            Catch ex As Exception

                If ex.Message.Contains("Variable: " & INDEX_DMS_ERSTELLT_ZEIT & " not found!") Then
                    MyValidationLogger.Info("1. Ausnahme in Windream_get_Doc_info: Variable: " & INDEX_DMS_ERSTELLT_ZEIT & " not found", True)
                    If INDEX_DMS_ERSTELLT = "DMS Created" Then

                        INDEX_DMS_ERSTELLT = "DMS erstellt"
                        INDEX_DMS_ERSTELLT_ZEIT = "DMS erstellt (Zeit)"

                        CONFIG.Config.IndexDmsErstellt = INDEX_DMS_ERSTELLT
                        CONFIG.Config.IndexDmsErstelltZeit = INDEX_DMS_ERSTELLT_ZEIT
                        CONFIG.Save()

                        'SaveMySettingsValue("IDX_DMS_ERSTELLT_ZEIT", "DMS erstellt (Zeit)")
                    Else
                        INDEX_DMS_ERSTELLT = "DMS Created"
                        INDEX_DMS_ERSTELLT_ZEIT = "DMS Created Time"

                        CONFIG.Config.IndexDmsErstellt = INDEX_DMS_ERSTELLT
                        CONFIG.Config.IndexDmsErstelltZeit = INDEX_DMS_ERSTELLT_ZEIT
                        CONFIG.Save()

                        'SaveMySettingsValue("IDX_DMS_ERSTELLT", "DMS Created")
                        'SaveMySettingsValue("IDX_DMS_ERSTELLT_ZEIT", "DMS Created Time")
                    End If
                    MyValidationLogger.Debug($"GetVariableValue (2) [{INDEX_DMS_ERSTELLT_ZEIT}]...")
                    CURRENT_DOC_CREATION_TIME = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT_ZEIT)
                Else
                    MyValidationLogger.Error(ex)
                    MyValidationLogger.Info("error in Windream_get_Doc_info 3: " & ex.Message)
                    Return "error in Windream_get_Doc_info 3: " & ex.Message
                End If
            End Try

            MyValidationLogger.Debug("DMSErstelltZeit aus WD: " & CURRENT_DOC_CREATION_TIME)

            If CURRENT_DOC_CREATION_TIME.Length > 11 Then
                CURRENT_DOC_CREATION_DATE = CURRENT_DOC_CREATION_DATE & " " & CURRENT_DOC_CREATION_TIME.Substring(10)
            Else
                CURRENT_DOC_CREATION_DATE = CURRENT_DOC_CREATION_DATE & " " & CURRENT_DOC_CREATION_TIME
            End If

            Return ""
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("error in Windream_get_Doc_info (GENERELL): " & ex.Message)
            Return "error in Windream_get_Doc_info (GENERELL): " & ex.Message
        End Try

    End Function
    Private Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, NIIndexe As Object, CheckDuplikat As Boolean, vType As Object)
        Dim ValueArray()

        ' Try
        Dim missing As Boolean = False
        Dim Anzahl As Integer = 0

        'Jeden Wert des Vektorfeldes durchlaufen
        Dim wertWD = oDocument.GetVariableValue(vktIndexName)
        If wertWD Is Nothing = False Then
            'Nochmals prüfen ob wirklich Array
            If wertWD.GetType.ToString.Contains("System.Object") Then
                'Keine Duplikatprüfung also einfach neues Array füllen
                If CheckDuplikat = False Then
                    For Each value As Object In wertWD
                        'Das Array anpassen
                        ReDim Preserve ValueArray(Anzahl)
                        'Den Wert im Array speichern
                        ValueArray(Anzahl) = ConvertVectorType(vType, value)
                        Anzahl += 1
                    Next
                    'Und jetzt den/die Neuen Wert(e) anfügen
                    For Each NewValue As Object In NIIndexe
                        If NewValue Is Nothing = False Then
                            'Das Array anpassen
                            ReDim Preserve ValueArray(Anzahl)
                            'Den Wert im Array speichern
                            ValueArray(Anzahl) = ConvertVectorType(vType, NewValue)
                            Anzahl += 1

                        End If
                    Next
                Else

                    'Duplikat Prüfung an, also nur anhängen wenn Wert <>
                    For Each WDValue As Object In wertWD
                        If WDValue Is Nothing = False Then
                            'Erst einmal die ALten Werte schreiben
                            ReDim Preserve ValueArray(Anzahl)
                            'Den Wert im Array speichern
                            ValueArray(Anzahl) = ConvertVectorType(vType, WDValue)
                            Anzahl += 1
                        End If
                    Next
                    'Jetzt die Neuen Werte auf Duplikate überprüfen
                    For Each NewValue As Object In NIIndexe
                        If NewValue Is Nothing = False Then
                            If ValueArray.Contains(NewValue) = False Then
                                'Das Array anpassen
                                ReDim Preserve ValueArray(Anzahl)
                                'Den Wert im Array speichern
                                ValueArray(Anzahl) = ConvertVectorType(vType, NewValue)
                                Anzahl += 1
                            Else
                            End If
                        End If
                    Next
                End If
            End If
        Else
            'Den/die Neuen Wert(e) anfügen
            For Each NewValue As Object In NIIndexe
                If NewValue Is Nothing = False Then
                    If CheckDuplikat = True Then
                        If ValueArray Is Nothing = False Then
                            If ValueArray.Contains(NewValue) = False Then
                                'Das Array anpassen
                                ReDim Preserve ValueArray(Anzahl)
                                'Den Wert im Array speichern
                                ValueArray(Anzahl) = ConvertVectorType(vType, NewValue)
                                Anzahl += 1
                            Else
                            End If
                        Else 'Dererste Wert, also hinzufügen
                            'Das Array anpassen
                            ReDim Preserve ValueArray(Anzahl)
                            'Den Wert im Array speichern
                            ValueArray(Anzahl) = ConvertVectorType(vType, NewValue)
                            Anzahl += 1

                        End If

                    Else
                        'Das Array anpassen
                        ReDim Preserve ValueArray(Anzahl)
                        'Den Wert im Array speichern
                        ValueArray(Anzahl) = ConvertVectorType(vType, NewValue)
                        Anzahl += 1
                    End If
                End If
            Next
        End If

        Return ValueArray
        'Catch ex As Exception
        '    Return ValueArray
        'End Try


    End Function

    Public Function ConvertVectorType(vType As Object, value As String)
        Select Case vType
            Case 36865 ' 36865
                'Umwandeln in String
                Return value
            Case 4097 '4097
                'Umwandeln in String
                Return value
            Case 4098 '4098
                'Umwandeln in Integer
                value = value.Replace(" ", "")
                Return CInt(value)
            Case 4099  '4099
                value = value.
                    Replace(" ", "").
                    Replace(".", ",")
                'Umwandeln in Double
                Return CDbl(value)
            Case 4100 '4100
                'Umwandeln in Boolean
                Return CBool(value)
            Case 4101 '4101
                'Umwandeln in Date
                Return CDate(value)
            Case 4107 '4107
                Return Convert.ToInt64(value)
            Case 4103 '4103
                'Umwandeln in Datum Uhrzeit
                Return value
            Case Else
                'Umwandeln in String
                Return value
        End Select
    End Function

    Private Function ReturnVektor_IndexValue(VKTBezeichner As String)
        Try
            Dim value
            Dim name = VKTBezeichner.Replace("[%VKT", "")
            Dim Sort_Arr() As String
            Dim i As Integer = 0
            'Jetzt im Vektorfeld des Profils nachsehen ob der WErt bereits vorhanden ist
            Dim wertWD = CURRENT_WMFILE.GetVariableValue(PROFIL_VEKTORINDEX)
            If wertWD Is Nothing = False Then
                'Es wird gegen ein Vektorfeld nachindexiert
                If wertWD.GetType.ToString.Contains("System.Object") Then
                    'es handelt sich um ein Vektorfeld - Zuweisen der Indexwerte des Vektorfeldes zu Array
                    For Each obj As Object In wertWD
                        If obj Is Nothing = False Then
                            ReDim Preserve Sort_Arr(i)
                            Sort_Arr(i) = obj.ToString()
                            i += 1
                        End If
                    Next
                    'Das Ergebnis-Array nun Rückwärts sortieren, um die letzte Änderung zu finden
                    For Each _string As Object In Sort_Arr.Reverse()
                        Dim DDPM_String As String = _string.ToString()
                        ' 
                        Dim VektorArray() = Split(DDPM_String, PMDelimiter)
                        If VektorArray(1).ToString.ToLower = name.ToLower Then
                            value = VektorArray(2)
                            Exit For
                        End If

                    Next

                End If
            End If
            If value Is Nothing Then value = ""
            Return value
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("error in ReturnVektor_IndexValue: " & vbCrLf & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
            MyValidationLogger.Info("error in ReturnVektor_IndexValue: " & ex.Message)
            Return ""
        End Try




    End Function
    Private Function GetVariableValuefromSource(oSourceIndexName As String, Optional oIDBTyp As Integer = 0, Optional FromIDB As Boolean = False) As Object
        Try
            Dim oValuefromSource
            If IDB_ACTIVE = False Then
                If oSourceIndexName = "@@DISPLAY_ONLY" Then
                    MyValidationLogger.Debug($"GetVariableValuefromSource - @@DISPLAY_ONLY - Returning Empty")
                    Return String.Empty
                Else
                    oValuefromSource = CURRENT_WMFILE.GetVariableValue(oSourceIndexName)
                End If

            Else
                MyValidationLogger.Debug($"GetVariableValuefromSource - IDBCase - IndexName: {oSourceIndexName}, IDBTyp: {oIDBTyp}, FromIDB: {FromIDB}")
                oValuefromSource = IDBData.GetVariableValue(oSourceIndexName, oIDBTyp, FromIDB)
            End If
            Return oValuefromSource
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            Return Nothing
        End Try

    End Function

    Sub FillIndexValues(first As Boolean, Optional SingleAttribute As String = "")
        If _SetControlValue_In_Action AndAlso Not String.IsNullOrWhiteSpace(SingleAttribute) Then
            MyValidationLogger.Debug("FillIndexValues", $"⛔ BLOCKIERT während SetControlValue - Attribut [{SingleAttribute}] nicht aus IDB neu laden")
            Exit Sub
        End If

        Dim perfStart As DateTime = DateTime.MinValue
        Dim perfLastCheck As DateTime = DateTime.MinValue
        If LOG_HOTSPOTS Then
            perfStart = DateTime.Now
            perfLastCheck = perfStart
            MyValidationLogger.Info($"[PERF FillIndexValues] START - Controls: {PanelValidatorControl.Controls.Count}")
        End If

        If LOG_PERF Then PerformanceLogger.Info("FillIndexValues")

        Dim oControlType As String
        Dim oIndexName As String
        Dim oControName As String
        Dim oIDBOverride As Boolean = False

        ' ========== OPTIMIERUNG 1: Einmalige Gruppierung von Grid-Spalten ==========
        ' VORHER: Für jedes Grid wurde DT_COLUMNS_GRID.Select() aufgerufen → O(n * m)
        ' NACHHER: Einmalig gruppieren, dann Dictionary-Lookup → O(n + m)
        Dim columnsByControl As Dictionary(Of Integer, DataTable) = Nothing
        If DT_COLUMNS_GRID IsNot Nothing AndAlso DT_COLUMNS_GRID.Rows.Count > 0 Then
            columnsByControl = New Dictionary(Of Integer, DataTable)()

            For Each groupRow In DT_COLUMNS_GRID.AsEnumerable().GroupBy(Function(r) r.Field(Of Integer)("CONTROL_ID"))
                Dim controlId As Integer = groupRow.Key
                Dim dt = groupRow.OrderBy(Function(r) r.Field(Of Integer)("SEQUENCE")).CopyToDataTable()
                columnsByControl(controlId) = dt
            Next

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF FillIndexValues] Nach columnsByControl-Gruppierung: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
        End If
        ' ========== ENDE OPTIMIERUNG 1 ==========

        ' ========== OPTIMIERUNG 2: Control-Dictionary für schnellere Suche ==========
        ' VORHER: Verschachtelte Loops für Control-Suche → O(n²)
        ' NACHHER: Dictionary-Lookup → O(1)
        If _CachedControlsByGuid Is Nothing Then
            _CachedControlsByGuid = New Dictionary(Of Integer, Control)()
            For Each ctrl As Control In PanelValidatorControl.Controls
                Try
                    Dim meta = DirectCast(ctrl.Tag, ClassControlCreator.ControlMetadata)
                    _CachedControlsByGuid(meta.Guid) = ctrl
                Catch
                    Continue For
                End Try
            Next

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF FillIndexValues] Nach _CachedControlsByGuid-Erstellung: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
        End If

        ' ========== ENDE OPTIMIERUNG 2 ==========

        ' ========== OPTIMIERUNG 3: UI-Updates pausieren (kritisch für Performance!) ==========
        ' VORHER: Jede Zuweisung triggerte Repaint → tausende UI-Updates
        ' NACHHER: Alle Updates gebündelt → nur ein Repaint am Ende
        PanelValidatorControl.SuspendLayout()
        _suppressLookupEvents = True    ' ← NEU: Events während FillIndexValues unterdrücken
        Try
            ' ========== ENDE OPTIMIERUNG 3 ==========

            If DTVWCONTROL_INDEX.Rows.Count > 0 Then
                Dim oCount As Integer = 0
                For Each oControl As Control In Me.PanelValidatorControl.Controls
                    Dim oValueFromSource
                    Dim oFormattedValue As String = ""

                    ' ========== OPTIMIERUNG 4: LINQ statt Loop für Control-Row-Suche ==========
                    ' VORHER: Implizite Loop über DTVWCONTROL_INDEX
                    ' NACHHER: Optimierter LINQ-Query mit SingleOrDefault
                    Dim oControlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid
                    Dim oControlRow = (From form In DTVWCONTROL_INDEX.AsEnumerable()
                                       Where form.Item("GUID") = oControlId).SingleOrDefault()

                    If oControlRow Is Nothing Then Continue For
                    ' ========== ENDE OPTIMIERUNG 4 ==========

                    Dim oTyp As String = oControlRow.Item("CTRL_TYPE")
                    Dim oIDBTyp As String
                    If IDB_ACTIVE Then
                        oIDBTyp = oControlRow.Item("IDB_TYP")
                    End If

                    Dim oSourceIndexName As String = oControlRow.Item("INDEX_NAME")
                    Dim oDefaultValue As String = ObjectEx.NotNull(oControlRow.Item("DEFAULT_VALUE"), String.Empty)
                    oIndexName = oSourceIndexName
                    oControName = oControl.Name
                    Dim oLoadIndex As Boolean = oControlRow.Item("LOAD_IDX_VALUE")
                    If oIndexName = "@@DISPLAY_ONLY" Then
                        oLoadIndex = False
                    End If
                    MyValidationLogger.Debug("INDEX: " & oSourceIndexName & " - CONTROLNAME: " & oControl.Name & " - LOAD IDXVALUES: " & oLoadIndex.ToString)

                    Select Case True
                        Case oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType = GetType(MemoEdit)
                            If LOG_PERF Then PerformanceLogger.Info("FillIndexValues/TextEdit")

                            Try
                                oControlType = "Textbox"
                                Dim oTextBox As DevExpress.XtraEditors.TextEdit = oControl
                                Dim oMeta As ClassControlCreator.ControlMetadata = oTextBox.Tag

                                If oSourceIndexName = "" Then
                                    MsgBox("Attention wrong configuration:" & vbCrLf & "for control " & oControl.Name & " no INDEX configured!" & vbCrLf & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical)
                                    Exit For
                                End If
                                If oSourceIndexName Is Nothing = False Then
                                    If oLoadIndex = False Then
                                        MyValidationLogger.Debug($" oControl {oControl.Name}: Indexwert soll nicht geladen werden.")
                                        If Not {"@@DISPLAY_ONLY", "DD PM-ONLY FOR DISPLAY"}.Contains(oSourceIndexName) Then
                                            oTextBox.EditValue = oDefaultValue
                                        End If
                                        Exit Select
                                    End If

                                    If oSourceIndexName.StartsWith("[%VKT") And PROFIL_VEKTORINDEX <> "" Then
                                        oValueFromSource = ReturnVektor_IndexValue(oSourceIndexName)
                                    Else
                                        oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)

                                        If oValueFromSource Is Nothing Then
                                            oValueFromSource = ""
                                        Else
                                            If oValueFromSource.ToString = "System.Object[]" Then
                                                MyValidationLogger.Debug("TextBox with VektorField: " & oSourceIndexName)
                                                Try
                                                    MyValidationLogger.Debug($"Length of Vektorarray: {oValueFromSource.length}")
                                                Catch ex As Exception
                                                    MyValidationLogger.Info($"Error in gettin the lenth of vektorfield {oSourceIndexName} - {ex.Message}")
                                                End Try
                                                If oValueFromSource.length = 1 Then
                                                    oValueFromSource = oValueFromSource(0)
                                                Else
                                                    MyValidationLogger.Info(" >> Vectorfield " & oSourceIndexName & "' contains more then one value - First value will be used")
                                                    oValueFromSource = oValueFromSource(0)
                                                End If
                                                MyValidationLogger.Debug($"wertWD has been saved...")
                                            End If
                                        End If
                                    End If

                                    MyValidationLogger.Debug("Value from Source: [{0}]", oValueFromSource)

                                    Try
                                        Dim oFormatString As String = oControlRow.ItemEx("CTRL_FORMAT_STRING", "")
                                        oTextBox.EditValue = ObjectEx.NotNull(oValueFromSource, oDefaultValue)

                                        If oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) And oFormatString = "CURRENCY" Then
                                            ApplyCurrencyMask(oTextBox)
                                        End If

                                        ' BackColor-Logik
                                        Try
                                            Dim oBackColor As String = oControlRow.Item("CTRL_BACKCOLOR_IF")
                                            If oBackColor <> String.Empty Then
                                                Dim oSPlit = Split(oBackColor, ";")
                                                If oSPlit.Length = 3 Then
                                                    Dim oValueConverted
                                                    If IsNumeric(oValueFromSource) Then
                                                        oValueConverted = oValueFromSource.ToString.Replace(",", ".")
                                                    Else
                                                        oValueConverted = oValueFromSource
                                                    End If
                                                    Dim oExpression = $"{oValueConverted} {oSPlit(0)}"

                                                    Dim oSQl = $"SELECT CASE WHEN {oExpression} THEN CONVERT(BIT,1) ELSE CONVERT(BIT,0) END "
                                                    Dim oColorName = IIf(DatabaseECM.GetScalarValue(oSQl), oSPlit(1), oSPlit(2))

                                                    oControl.BackColor = Color.FromName(oColorName)
                                                    oMeta.BackColor = oControl.BackColor
                                                    oControl.ForeColor = GraphicsEx.GetContrastedColor(oControl.BackColor)
                                                End If
                                            End If
                                        Catch ex As Exception
                                            MyValidationLogger.Warn($"⚠️ Unexpected error in Set Backcolor [{oControl.Name}]: {ex.Message}")
                                            MyValidationLogger.Error(ex)
                                        End Try

                                        ' ========== OPTIMIERUNG 5: GridTables erst NACH allen TextBox-Updates ==========
                                        ' NACHHER wird dies EINMAL am Ende aufgerufen (siehe unten)
                                        ' ========== ENDE OPTIMIERUNG 5 ==========

                                    Catch ex As Exception
                                        MyValidationLogger.Info("Error While converting defaultValue [" & oDefaultValue & "]: " & ex.Message)
                                        oTextBox.EditValue = ""
                                    End Try
                                End If
                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                errormessage = $"Unvorhergesehener Fehler bei FillIndexValues TextBox [{oControl.Name}]:" & vbCrLf & ex.Message & vbCrLf & "Check Logfile"
                                My.Settings.Save()
                                frmError.ShowDialog()
                                MyValidationLogger.Info("Unexpected error in FillIndexValuesTextBox: " & ex.Message, True)
                                MyValidationLogger.Info(">> Controltype: " & oControlType)
                                MyValidationLogger.Info(">> Indexname windream: " & oIndexName)
                                Exit Sub
                            End Try

                        Case oControl.GetType = GetType(Windows.Forms.ComboBox)
                            If LOG_PERF Then PerformanceLogger.Info("FillIndexValues/ComboBox")

                            oControlType = "ComboBox"
                            Dim oMyCombobox As Windows.Forms.ComboBox = oControl
                            Try
                                If oSourceIndexName = "" Then
                                    MsgBox("Attention wrong configuration:" & vbCrLf & "for control " & oControl.Name & " no INDEX configured!" & vbCrLf & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical)
                                    Exit For
                                End If
                                If oSourceIndexName Is Nothing = False Then
                                    If oLoadIndex = False Then
                                        MyValidationLogger.Debug($" oMyComboBox {oMyCombobox.Name}: Indexwert soll nicht geladen werden.")
                                        If Not {"@@DISPLAY_ONLY", "DD PM-ONLY FOR DISPLAY"}.Contains(oSourceIndexName) Then
                                            If oDefaultValue = String.Empty Then
                                                oMyCombobox.SelectedIndex = -1
                                            Else
                                                oMyCombobox.Text = oDefaultValue
                                            End If
                                        End If
                                        Exit Select
                                    End If

                                    If oSourceIndexName.StartsWith("[%VKT") And PROFIL_VEKTORINDEX <> "" Then
                                        oValueFromSource = ReturnVektor_IndexValue(oSourceIndexName)
                                    Else
                                        oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)
                                    End If

                                    If oValueFromSource Is Nothing Or IsDBNull(oValueFromSource) Then
                                        MyValidationLogger.Debug($"oMyComboBox {oMyCombobox.Name} - Indexvalue from index {oSourceIndexName} is Nothing or DBNull")
                                        If oDefaultValue = String.Empty Then
                                            MyValidationLogger.Debug($"oMyComboBox {oMyCombobox.Name}-defaultValue wurde nicht gefunden")
                                            oMyCombobox.SelectedIndex = -1
                                        Else
                                            MyValidationLogger.Debug($"oMyComboBox {oMyCombobox.Name}-defaultValue wird geladen")
                                            oMyCombobox.Text = oDefaultValue
                                        End If
                                    Else
                                        If oValueFromSource.ToString = "System.Object[]" Then
                                            MyValidationLogger.Debug($"oMyComboBox {oMyCombobox.Name} - Combobox with VektorField: " & oSourceIndexName)
                                            Try
                                                MyValidationLogger.Debug($"Length of Vektorarray: {oValueFromSource.length}")
                                            Catch ex As Exception
                                                MyValidationLogger.Info($"Error in gettin the length of vektorfield {oSourceIndexName} - {ex.Message}")
                                            End Try
                                            If oValueFromSource.length = 1 Then
                                                oValueFromSource = oValueFromSource(0)
                                            Else
                                                MyValidationLogger.Info(" >> Vectorfield " & oSourceIndexName & "' contains more then one value - First value will be used")
                                                oValueFromSource = oValueFromSource(0)
                                            End If
                                            MyValidationLogger.Debug($"wertWD has been saved...")
                                        End If
                                        MyValidationLogger.Debug($"Indexwert from Index {oSourceIndexName}: {oValueFromSource}")
                                        MyValidationLogger.Debug($"Items in Combobox: {oMyCombobox.Items.Count}")

                                        If oMyCombobox.Items.Count = 0 Then
                                            oMyCombobox.Text = oValueFromSource
                                        Else
                                            MyValidationLogger.Debug($"Index Wert [{oValueFromSource}] wurde ausgewählt")
                                            oMyCombobox.SelectedIndex = oMyCombobox.FindStringExact(oValueFromSource)
                                            MyValidationLogger.Debug($"oMyComboBox {oMyCombobox.Name} .SelectedIndex: {oMyCombobox.SelectedIndex}")
                                        End If
                                    End If
                                End If
                                MyValidationLogger.Debug("")
                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                MyValidationLogger.Info(">> Unexpected error in FillIndexValues(Combobox: " & oMyCombobox.Name & "): " & ex.Message, True)
                                MyValidationLogger.Info(">> Controltype: " & oControlType)
                                MyValidationLogger.Info(">> Indexname windream: " & oIndexName)
                                errormessage = "Unexpected error in FillIndexValues(Combobox: " & oMyCombobox.Name & "): " & vbCrLf & ex.Message & vbCrLf & "Check Logfile"
                                My.Settings.Save()
                                frmError.ShowDialog()
                            End Try

                        Case oControl.GetType = GetType(GridControl)
                            If LOG_PERF Then PerformanceLogger.Info("FillIndexValues/GridControl")

                            oControlType = "DevExpress.XtraGrid.GridControl"
                            Dim oMyGridControl As GridControl = oControl

                            ' ========== OPTIMIERUNG 6: Dictionary-Lookup statt Select() ==========
                            ' VORHER: DT_COLUMNS_GRID.Select($"CONTROL_ID = {oControlId}") → O(n) pro Grid
                            ' NACHHER: Dictionary.TryGetValue() → O(1)
                            Dim oDTColumnsPerDevExGrid As DataTable = Nothing
                            If columnsByControl IsNot Nothing AndAlso columnsByControl.TryGetValue(oControlId, oDTColumnsPerDevExGrid) Then
                                MyValidationLogger.Debug($"Grid [{oControl.Name}]: {oDTColumnsPerDevExGrid.Rows.Count} Spalten aus Cache geladen")
                            Else
                                oDTColumnsPerDevExGrid = DT_COLUMNS_GRID.Clone()
                                MyValidationLogger.Warn($"⚠️ Grid [{oControl.Name}]: Keine Spalten-Definition gefunden!")
                            End If
                            ' ========== ENDE OPTIMIERUNG 6 ==========

                            Try
                                If oSourceIndexName = "" Then
                                    MsgBox("Attention wrong configuration:" & vbCrLf & "for control " & oControl.Name & " no INDEX configured!" & vbCrLf & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                                    Exit For
                                End If
                                If oSourceIndexName Is Nothing = False Then
                                    If oLoadIndex = False Then
                                        MyValidationLogger.Debug($" oControl {oControl.Name}: Indexwert soll nicht geladen werden.")
                                        Exit Select
                                    End If
                                    MyValidationLogger.Debug($"getting Value for Attribute [{oSourceIndexName}] - oIDBTyp [{oIDBTyp}] - oIDBOverride [{oIDBOverride}]...")
                                    oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)

                                    If oValueFromSource Is Nothing = False Then
                                        Dim oValueType = oValueFromSource.GetType.ToString
                                        MyValidationLogger.Debug($"oValueType is [{oValueType}]!")

                                        If oValueType.Contains("System.Object") Or oValueType = "System.Data.DataTable" Or oValueType = "System.String" Then
                                            Select Case oTyp
                                                Case "TABLE"
                                                    Dim oColValuesfromSource As String()
                                                    MyValidationLogger.Debug($"DevExpressGrid: {oDTColumnsPerDevExGrid.Rows.Count} Columns configured for control {oControlId}.")

                                                    If oDTColumnsPerDevExGrid.Rows.Count >= 1 Then
                                                        Dim oDataSource As DataTable = oMyGridControl.DataSource
                                                        oDataSource.Rows.Clear()
                                                        If IDB_ACTIVE = False Then
                                                            MyValidationLogger.Debug("ValueFromSource contains {0} items", oValueFromSource)

                                                            For Each Zeile As Object In oValueFromSource
                                                                MyValidationLogger.Debug($"vektorrow Value {Zeile.ToString}...")
                                                                oColValuesfromSource = Split(Zeile, PMDelimiter)
                                                                Dim oNewRow = oDataSource.NewRow()
                                                                MyValidationLogger.Debug("Creating new row..")

                                                                For index = 0 To oDTColumnsPerDevExGrid.Rows.Count - 1
                                                                    Try
                                                                        ' 1. Basis-Checks
                                                                        Dim rawValue As String = If(index < oColValuesfromSource.Length, oColValuesfromSource(index), String.Empty)
                                                                        Dim targetColumn As DataColumn = oDataSource.Columns(index)
                                                                        Dim colType As Type = targetColumn.DataType

                                                                        ' 2. NULL-Handling
                                                                        If String.IsNullOrWhiteSpace(rawValue) Then
                                                                            If colType.IsValueType AndAlso Nullable.GetUnderlyingType(colType) Is Nothing Then
                                                                                ' Nicht-Nullable Value-Type → Default-Wert setzen
                                                                                oNewRow.Item(index) = Activator.CreateInstance(colType)
                                                                                MyValidationLogger.Debug($"Grid row default: ColIdx={index}, ColType={colType.Name}")
                                                                            Else
                                                                                ' Nullable/Reference-Type → DBNull
                                                                                oNewRow.Item(index) = DBNull.Value
                                                                            End If
                                                                            Continue For
                                                                        End If

                                                                        ' 3. Typ-spezifische Konvertierung
                                                                        Try
                                                                            Select Case Type.GetTypeCode(colType)
                                                                                Case TypeCode.Int32
                                                                                    oNewRow.Item(index) = Integer.Parse(rawValue.Trim(), CultureInfo.InvariantCulture)
                                                                                Case TypeCode.Int64
                                                                                    oNewRow.Item(index) = Long.Parse(rawValue.Trim(), CultureInfo.InvariantCulture)
                                                                                Case TypeCode.Double
                                                                                    oNewRow.Item(index) = Double.Parse(rawValue.Trim().Replace(",", "."), CultureInfo.InvariantCulture)
                                                                                Case TypeCode.Decimal
                                                                                    oNewRow.Item(index) = Decimal.Parse(rawValue.Trim().Replace(",", "."), CultureInfo.InvariantCulture)
                                                                                Case TypeCode.Boolean
                                                                                    oNewRow.Item(index) = Boolean.Parse(rawValue.Trim())
                                                                                Case TypeCode.DateTime
                                                                                    oNewRow.Item(index) = DateTime.Parse(rawValue.Trim(), CultureInfo.CurrentCulture)
                                                                                Case Else
                                                                                    ' String oder Custom-Type → direkt übernehmen
                                                                                    oNewRow.Item(index) = rawValue
                                                                            End Select

                                                                        Catch convEx As FormatException
                                                                            MyValidationLogger.Warn($"⚠️ Grid conversion FAILED: ColIdx={index}, ColType={colType.Name}, RawValue=[{rawValue}] → using default")

                                                                            ' Fallback: Default-Wert statt Crash
                                                                            If colType.IsValueType Then
                                                                                oNewRow.Item(index) = Activator.CreateInstance(colType)
                                                                            Else
                                                                                oNewRow.Item(index) = DBNull.Value
                                                                            End If
                                                                        End Try

                                                                    Catch logEx As Exception
                                                                        ' Fallback: Minimales Logging ohne Fehler
                                                                        MyValidationLogger.Debug($"Grid row assign CRITICAL: ColIdx={index} [error: {logEx.Message}]")
                                                                        ' Leere Zelle → DBNull
                                                                        oNewRow.Item(index) = DBNull.Value
                                                                    End Try
                                                                Next
                                                                MyValidationLogger.Debug("Adding row To grid..")
                                                                oDataSource.Rows.Add(oNewRow)
                                                            Next
                                                        Else
                                                            ' IDB-Logik (bleibt gleich)
                                                            If oValueType = "System.String" Then
                                                                MyValidationLogger.Debug($"IDB Fill Grid [{oControl.Name}] With String")
                                                                MyValidationLogger.Debug($"oValueFromSource [{oValueFromSource}] - PMDelimiter[{PMDelimiter}]")

                                                                oColValuesfromSource = Split(oValueFromSource.ToString, PMDelimiter)
                                                                If oColValuesfromSource.Length > 8 Then
                                                                    MyValidationLogger.Warn("⚠️ Fill Grid Error - Max 8 columns can be configured!")
                                                                End If

                                                                Dim oRowData As New List(Of Object)
                                                                MyValidationLogger.Debug(String.Format("Now creating the rows For DevexpressGrid ..."))
                                                                Dim oMSG = ""
                                                                Try
                                                                    For index = 1 To oColValuesfromSource.Length
                                                                        oMSG = ""
                                                                        Dim oValue = oColValuesfromSource(index - 1)
                                                                        oMSG = String.Format("...Index [{0}] - Value [{1}]", index, oValue)
                                                                        MyValidationLogger.Debug(oMSG)
                                                                        If oDTColumnsPerDevExGrid.Rows.Count > (index - 1) Then
                                                                            Dim oColumnType = oDTColumnsPerDevExGrid.Rows.Item(index - 1).Item("TYPE_COLUMN")
                                                                            Dim oConvertedValue = ClassFormat.GetConvertedValue(oValue, oColumnType)
                                                                            oRowData.Add(oConvertedValue)
                                                                        Else
                                                                            MyValidationLogger.Warn(String.Format("Mehr Values als Spaten in oDTColumnsPerDevExGrid {0}", oControl.Name))
                                                                        End If
                                                                    Next
                                                                Catch ex As Exception
                                                                    MyValidationLogger.Warn(String.Format("Unexpected Error While working On IDB Fill GridControl {0}", oControl.Name))
                                                                    If Not oMSG = String.Empty Then
                                                                        MyValidationLogger.Warn(String.Format("oMSG {0}", oMSG))
                                                                    End If
                                                                    MyValidationLogger.Error(ex)
                                                                End Try

                                                                oDataSource.Rows.Add(oRowData.ToArray())

                                                            ElseIf oValueType = "System.Data.DataTable" Then
                                                                Dim oMyDatatable As DataTable = oValueFromSource
                                                                Dim oIsGridReadOnly As Boolean = CBool(oControlRow.Item("READ_ONLY"))
                                                                MyValidationLogger.Debug($"IDB Fill Grid [{oControl.Name}] With Datatable - Rows {oMyDatatable.Rows.Count} - ReadOnly: {oIsGridReadOnly}")

                                                                ' ========== FIX: Spaltenanzahl-Prüfung EINMALIG vor dem Loop ==========
                                                                Dim oConfiguredColumns As Integer = oDTColumnsPerDevExGrid.Rows.Count
                                                                Dim oMaxSourceColumns As Integer = If(oMyDatatable.Rows.Count > 0,
                                                                                            oMyDatatable.Rows.Cast(Of DataRow)().
                                                                                                Max(Function(r) Split(r.Item(0).ToString, PMDelimiter).Length),
                                                                                            0)

                                                                If oMaxSourceColumns > oConfiguredColumns Then
                                                                    If oIsGridReadOnly Then
                                                                        MyValidationLogger.Info($"⚠️ [DataTable] Grid [{oControl.Name}] ist ReadOnly → {oMaxSourceColumns} Quelldaten, {oConfiguredColumns} Spalten konfiguriert. Überzählige Felder werden ignoriert.")
                                                                    Else
                                                                        ' ========== FIX: Sprachabhängige Texte ==========
                                                                        Dim oTitle As String
                                                                        Dim oQuestion As String
                                                                        Select Case USER_LANGUAGE
                                                                            Case "de-DE"
                                                                                oTitle = "Spaltenkonfiguration prüfen"
                                                                                oQuestion = $"Das Grid '{oControl.Name}' enthält Zeilen mit bis zu {oMaxSourceColumns} Datenwerten," & vbCrLf &
                                                                                    $"aber nur {oConfiguredColumns} Spalten sind konfiguriert." & vbCrLf &
                                                                                    $"Es werden nur die ersten {oConfiguredColumns} Werte je Zeile angezeigt." & vbCrLf & vbCrLf &
                                                                                    "Möchten Sie trotzdem fortfahren?"
                                                                            Case "fr-FR"
                                                                                oTitle = "Vérifier la configuration des colonnes"
                                                                                oQuestion = $"La grille '{oControl.Name}' contient des lignes avec jusqu'à {oMaxSourceColumns} valeurs," & vbCrLf &
                                                                                $"mais seulement {oConfiguredColumns} colonnes sont configurées." & vbCrLf &
                                                                                $"Seules les {oConfiguredColumns} premières valeurs par ligne seront affichées." & vbCrLf & vbCrLf &
                                                                                "Voulez-vous continuer quand même?"
                                                                            Case Else ' en-US, en-GB, etc.
                                                                                oTitle = "Check column configuration"
                                                                                oQuestion = $"The grid '{oControl.Name}' contains rows with up to {oMaxSourceColumns} values," & vbCrLf &
                                                                                $"but only {oConfiguredColumns} columns are configured." & vbCrLf &
                                                                                $"Only the first {oConfiguredColumns} values per row will be displayed." & vbCrLf & vbCrLf &
                                                                                "Do you want to continue anyway?"
                                                                        End Select
                                                                        ' ========== ENDE FIX ==========

                                                                        Dim oResult = MessageBox.Show(
                                                                                        oQuestion,
                                                                                        oTitle,
                                                                                        MessageBoxButtons.YesNo,
                                                                                        MessageBoxIcon.Warning)

                                                                        If oResult = DialogResult.No Then
                                                                            MyValidationLogger.Warn($"⚠️ [DataTable] Benutzer hat Fortfahren für Grid [{oControl.Name}] abgebrochen.")
                                                                            Exit Select
                                                                        End If
                                                                    End If
                                                                End If
                                                                ' ========== ENDE FIX ==========

                                                                For Each oRow As DataRow In oMyDatatable.Rows
                                                                    Try
                                                                        MyValidationLogger.Debug($"IDB ROW Vector {oRow.Item(0).ToString}...")
                                                                        oColValuesfromSource = Split(oRow.Item(0).ToString, PMDelimiter)
                                                                        MyValidationLogger.Debug($"oColValuesfromSource splitted - Length ({oColValuesfromSource.Length.ToString})")

                                                                        Dim oRowData As New List(Of Object)

                                                                        For index = 1 To oConfiguredColumns
                                                                            Try
                                                                                Dim oRawValue As String = If(index <= oColValuesfromSource.Length,
                                                 oColValuesfromSource(index - 1),
                                                 String.Empty)
                                                                                Dim oColumnType = oDTColumnsPerDevExGrid.Rows.Item(index - 1).Item("TYPE_COLUMN")
                                                                                MyValidationLogger.Debug($"oColumnType Of DGView-Column ({oColumnType.ToString})...")
                                                                                Dim oConvertedValue = ClassFormat.GetConvertedValue(oRawValue, oColumnType)
                                                                                oRowData.Add(oConvertedValue)
                                                                            Catch ex As Exception
                                                                                MyValidationLogger.Warn($"⚠️ Error While converting/adding Value To oRowData " & ex.Message)
                                                                                oRowData.Add(String.Empty)
                                                                            End Try
                                                                        Next
                                                                        oDataSource.Rows.Add(oRowData.ToArray())

                                                                    Catch ex As Exception
                                                                        MyValidationLogger.Warn($"⚠️ Error While adding datarow [{oRow.Item(0).ToString}] To Grid " & ex.Message)
                                                                    End Try
                                                                Next
                                                            End If
                                                        End If
                                                    Else
                                                        MyValidationLogger.Info($"⚠️ DevExpressGrid There are no columns configured/listed For control {oControlId}.")
                                                    End If

                                                Case Else
                                                    Dim oDataSource As DataTable = oMyGridControl.DataSource
                                                    For Each obj As Object In oValueFromSource
                                                        If obj Is Nothing = False Then
                                                            oDataSource.Rows.Add(New String() {obj.ToString})
                                                        End If
                                                    Next
                                            End Select
                                        Else
                                            MyValidationLogger.Warn($"⚠️ Could Not load Devexpress.Grid [{oControl.Name }] As omytype Is [{oValueType}]!")
                                        End If
                                    Else
                                        If first = False Then
                                            Dim oDataSource As DataTable = oMyGridControl.DataSource
                                            If oDataSource.Rows.Count > 0 Then
                                                oDataSource.Rows.Clear()
                                            End If
                                        End If
                                    End If

                                    ' ========== OPTIMIERUNG 7: GridView-Spaltenbreiten mit Dictionary ==========
                                    ' VORHER: Verschachtelte Loop über Columns × oDTColumnsPerDevExGrid → O(n × m)
                                    ' NACHHER: Dictionary-Lookup → O(n + m)
                                    Try
                                        Dim oMyGridView As DevExpress.XtraGrid.Views.Grid.GridView = oMyGridControl.MainView
                                        oMyGridView.OptionsView.ColumnAutoWidth = False

                                        If oDTColumnsPerDevExGrid IsNot Nothing AndAlso oDTColumnsPerDevExGrid.Rows.Count > 0 Then
                                            Dim columnsByName = oMyGridView.Columns.Cast(Of GridColumn)().
                                                ToDictionary(Function(c) c.FieldName, StringComparer.OrdinalIgnoreCase)

                                            For Each oRow As DataRow In oDTColumnsPerDevExGrid.Rows
                                                Dim columnName = oRow.Item("SPALTENNAME").ToString()
                                                Dim column As GridColumn = Nothing

                                                If columnsByName.TryGetValue(columnName, column) Then
                                                    column.Width = oRow.Item("SPALTENBREITE")
                                                End If
                                            Next
                                        End If
                                    Catch ex As Exception
                                        MyValidationLogger.Error(ex)
                                    End Try
                                    ' ========== ENDE OPTIMIERUNG 7 ==========
                                End If
                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                MyValidationLogger.Info(">> Unexpected Error In FillIndexValues(GridControl " & oMyGridControl.Name & ") " & ex.Message, True)
                                MyValidationLogger.Info(">> Controltype " & oControlType)
                                MyValidationLogger.Info(">> Attributname " & oIndexName)
                                errormessage = "Unexpected Error In FillIndexValues(Combobox " & oMyGridControl.Name & ") " & vbCrLf & ex.Message & vbCrLf & "Check Logfile"
                                My.Settings.Save()
                                frmError.ShowDialog()
                            End Try

                        Case oControl.GetType = GetType(CheckBox)
                            MyValidationLogger.Debug("Loading checkbox...")
                            oControlType = "CheckBox"
                            If oSourceIndexName = "" Then
                                MsgBox("Attention wrong configuration" & vbCrLf & "For control " & oControl.Name & " no INDEX configured!" & vbCrLf & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                                Exit For
                            End If
                            If oSourceIndexName Is Nothing = False Then
                                Dim myCheckBox As CheckBox = oControl

                                If oLoadIndex = False Or {"@@DISPLAY_ONLY", "DD PM-ONLY For DISPLAY"}.Contains(oSourceIndexName) Then
                                    MyValidationLogger.Debug($" oControl {oControl.Name} Indexwert soll nicht geladen werden.")
                                    Exit Select
                                End If

                                MyValidationLogger.Debug("Loading Bool-Value from Source...")

                                If oSourceIndexName.StartsWith("[%VKT") And PROFIL_VEKTORINDEX <> "" Then
                                    oValueFromSource = ReturnVektor_IndexValue(oSourceIndexName)
                                Else
                                    Try
                                        MyValidationLogger.Debug($"..Now GetVariableValue({oSourceIndexName})...")
                                        oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)
                                    Catch ex As Exception
                                        MyValidationLogger.Warn($"Could Not Get the windreamValue For CheckboxIndex {oSourceIndexName} [{ex.Message}]")
                                    End Try
                                End If

                                If oValueFromSource Is Nothing Then
                                    MyValidationLogger.Info(">> Zurückgegebener Wert des Wertes für Checkbox mit Indexname '" & oIndexName & "' ist nothing. Checking defaultvalue")
                                    MyValidationLogger.Debug(">> Zurückgegebener Wert des Wertes für Checkbox mit Indexname '" & oIndexName & "' ist nothing. Checking defaultvalue")
                                    If oDefaultValue <> String.Empty Then
                                        MyValidationLogger.Info($"Using Default value [{oDefaultValue}]")
                                        MyValidationLogger.Debug($"Using Default value [{oDefaultValue}]")
                                        myCheckBox.Checked = CBool(oDefaultValue)
                                        Exit Select
                                    Else
                                        MyValidationLogger.Debug("No Default Value for Checkbox - so using false!")
                                        myCheckBox.CheckState = CheckState.Indeterminate
                                    End If
                                Else
                                    MyValidationLogger.Debug("oValueFromSource: " & oValueFromSource.ToString)
                                    If oValueFromSource.ToString = "" Then
                                        MyValidationLogger.Info(">> Versuch, default Value zu laden")
                                        If oDefaultValue <> String.Empty Then
                                            Dim result = False
                                            If Boolean.TryParse(oDefaultValue, result) Then
                                                MyValidationLogger.Info(">> defaultValue wurde geladen")
                                                myCheckBox.Checked = result
                                                myCheckBox.CheckState = If(result, CheckState.Checked, CheckState.Unchecked)
                                            Else
                                                myCheckBox.Checked = False
                                                myCheckBox.CheckState = CheckState.Unchecked
                                            End If
                                        Else
                                            MyValidationLogger.Info(">> defaultValue war leer")
                                            myCheckBox.Checked = False
                                            myCheckBox.CheckState = CheckState.Unchecked
                                        End If
                                    Else
                                        Dim _value
                                        If oValueFromSource.ToString = "System.Object[]" Then
                                            MyValidationLogger.Debug("CheckBoxValue with VectorField: " & oSourceIndexName)
                                            If oValueFromSource.length = 1 Then
                                                _value = oValueFromSource(0)
                                            Else
                                                MyValidationLogger.Info(" >> Vectorfield " & oSourceIndexName & "' contains more then one value - First value will be used")
                                                _value = oValueFromSource(0)
                                            End If
                                        Else
                                            _value = oValueFromSource
                                            MyValidationLogger.Debug($"Value is not nothing and also not System.Object: [{_value}]")
                                        End If
                                        Try
                                            Select Case CBool(_value)
                                                Case True
                                                    MyValidationLogger.Debug(">> CBool(_value) = True")
                                                    myCheckBox.Checked = True
                                                    myCheckBox.CheckState = CheckState.Checked
                                                Case False
                                                    MyValidationLogger.Debug(">> CBool(_value) = False")
                                                    myCheckBox.Checked = False
                                                    myCheckBox.CheckState = CheckState.Unchecked
                                            End Select
                                        Catch ex As Exception
                                            MyValidationLogger.Error(ex)
                                            MyValidationLogger.Info("Unexpected error in CBool(wertWD) - CheckBox: " & ex.Message & vbCrLf & "Wert WD: " & oValueFromSource.ToString, True)
                                            myCheckBox.Checked = False
                                            myCheckBox.CheckState = CheckState.Unchecked
                                        End Try
                                    End If
                                End If
                            End If

                        Case oControl.GetType = GetType(LookupControl3)
                            If LOG_PERF Then PerformanceLogger.Info("FillIndexValues/LookupControl")
                            Try
                                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)}]")
                                End If
                                ' ========== BUGFIX END: Sicherung ==========

                                oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)

                                If oLoadIndex = False Then
                                    MyValidationLogger.Debug($" oLookup {oLookup.Name}: Indexwert soll nicht geladen werden.")
                                    Exit Select
                                End If

                                Dim oNewValues As List(Of String) = Nothing

                                If Not IsNothing(oValueFromSource) Then
                                    Dim oMyType = oValueFromSource.GetType.ToString
                                    If oMyType.Contains("System.Object") Or oMyType = "System.Data.DataTable" Then
                                        Dim oArrlist As New List(Of String)
                                        If IDB_ACTIVE = False Then
                                            For Each oVectorRow As Object In oValueFromSource
                                                Dim Ocontent = oVectorRow.ToString
                                                oArrlist.Add(Ocontent)
                                            Next
                                        Else
                                            Dim myDT As DataTable = oValueFromSource
                                            For Each oVectorRow As DataRow In myDT.Rows
                                                Dim Ocontent = oVectorRow.Item(0)
                                                oArrlist.Add(Ocontent)
                                            Next
                                        End If
                                        oNewValues = oArrlist
                                    Else
                                        oNewValues = New List(Of String) From {oValueFromSource.ToString}
                                    End If
                                Else
                                    ' ========== BUGFIX START: Wenn KEIN neuer Wert, alte Werte behalten ==========
                                    If hadPreviousSelection AndAlso previousSelectedValues IsNot Nothing AndAlso previousSelectedValues.Count > 0 Then
                                        MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Kein neuer Wert von Quelle → alte Werte BEHALTEN")
                                        oNewValues = previousSelectedValues
                                    ElseIf oDefaultValue <> String.Empty Then
                                        MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Keine alten Werte, verwende DefaultValue = [{oDefaultValue}]")
                                        oNewValues = oDefaultValue.Split(",").ToList()
                                    Else
                                        MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: KEINE Werte (oValueFromSource=Nothing, oDefaultValue leer, keine vorherigen Werte)")
                                    End If
                                    ' ========== BUGFIX END: Wert-Beibehaltung ==========
                                End If

                                ' ========== 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 ==========
                                ' Wenn DataSource verloren gegangen sein sollte (z.B. aus LoadSQLData), JETZT wiederherstellen
                                If oLookup.Properties.DataSource Is Nothing AndAlso savedDataSource IsNot Nothing Then
                                    oLookup.Properties.DataSource = savedDataSource
                                    MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: DataSource wiederhergestellt BEVOR SelectedValues gelöscht")
                                End If

                                ' Jetzt erst SelectedValues leeren (DataSource ist wieder da!)
                                Try
                                    oLookup.Properties.SelectedValues = New List(Of String)
                                    MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: SelectedValues auf leere Liste zurückgesetzt")
                                Catch ex As Exception
                                    MyValidationLogger.Warn($"⚠️ [FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: Fehler beim Zurücksetzen SelectedValues: {ex.Message}")
                                End Try

                                ' Finale SelectedValues setzen
                                If oNewValues IsNot Nothing Then
                                    oLookup.Properties.SelectedValues = oNewValues
                                    MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: SelectedValues FINAL gesetzt = [{String.Join(",", oNewValues)}]")
                                Else
                                    MyValidationLogger.Debug($"[FillIndexValues BUGFIX] Lookup [{oLookupMeta.Name}]: oNewValues ist Nothing, SelectedValues bleiben leer")
                                End If

                            Catch ex As Exception
                                MyValidationLogger.Error(ex)
                                MyValidationLogger.Info(" - Unvorhergesehener Unexpected error in FillIndexValues LookupControl3 - Indexname: " & oIndexName & " - Fehler: " & vbCrLf & ex.Message)
                                MsgBox(ex.Message, MsgBoxStyle.Critical, "Unvorhergesehener Unexpected error in Add LookupControl3:")
                            End Try

                        Case oControl.GetType = GetType(DateTimePicker)
                            oControlType = "DateTimePicker"
                            Dim DTP As DateTimePicker = oControl
                            If oSourceIndexName = "" Then
                                MsgBox("Attention wrong configuration:" & vbCrLf & "for control " & oControl.Name & " no INDEX configured!" & vbCrLf & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                                Exit For
                            End If
                            If oSourceIndexName Is Nothing = False Then
                                Try
                                    If oSourceIndexName.StartsWith("[%VKT") And PROFIL_VEKTORINDEX <> "" Then
                                        MyValidationLogger.Debug("DATE über PM-Vektor holen")
                                        oValueFromSource = ReturnVektor_IndexValue(oSourceIndexName)
                                        MyValidationLogger.Info(">> DTP is """)
                                    Else
                                        oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)
                                    End If

                                    If oValueFromSource Is Nothing Then oValueFromSource = ""
                                    Dim tempdate As Date = CDate("01.01.0001 00:00:00")
                                    If oValueFromSource.ToString.Length > 0 Then
                                        Try
                                            tempdate = CDate(oValueFromSource)
                                            MyValidationLogger.Debug("DATE konnte umgewandelt werden")
                                        Catch ex As Exception
                                            MyValidationLogger.Error(ex)
                                            MyValidationLogger.Debug("DATE wurde auf heute gesetzt")
                                        End Try
                                        DTP.Text = tempdate
                                    Else
                                        MyValidationLogger.Debug("DATE ist leer")
                                        DTP.Text = tempdate
                                    End If
                                Catch ex As Exception
                                    MyValidationLogger.Error(ex)
                                    errormessage = "Unvorhergesehener Fehler bei DTP: " & vbCrLf & ex.Message
                                    MyValidationLogger.Info("Unexpected error in FillIndex DTP: " & ex.Message & vbCrLf & "Wert WD: " & oValueFromSource.ToString & vbCrLf & "Indexname: " & oSourceIndexName, True)
                                    frmError.ShowDialog()
                                    MyValidationLogger.Info("Unexpected error in FillIndex DTP: " & ex.Message, True)
                                End Try
                            End If
                    End Select
                    oCount += 1
                Next

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF FillIndexValues] Nach Control-Schleife: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                Focus_FirstControl()

                ' ========== OPTIMIERUNG 8: Grid-Dropdown-Columns nur EINMAL am Ende ==========
                ' VORHER: Wurde potenziell mehrfach aufgerufen
                ' NACHHER: Nur einmal nach allen Control-Updates
                Try
                    Dim oDataTable As DataTable = DT_COLUMNS_GRID_WITH_SQL.Clone()
                    DT_COLUMNS_GRID_WITH_SQL.Select($"SQL_COMMAND not like '%#CTRL#%'").CopyToDataTable(oDataTable, LoadOption.PreserveChanges)

                    ' ========== OPTIMIERUNG 9: Control-Suche mit Dictionary ==========
                    ' VORHER: Für jede Row wurde über alle Controls geloopt
                    ' NACHHER: Dictionary-Lookup
                    For Each oRow As DataRow In oDataTable.Rows
                        Dim oDEPENDING_CTRL_ID = CInt(oRow.Item("CONTROL_ID"))
                        Dim oDEPENDING_COLUMN = oRow.Item("SPALTENNAME")
                        Dim oSqlCommand = oRow.Item("SQL_COMMAND")
                        Dim oCONNID = 1
                        Try
                            If Not IsNullOrEmpty(oRow.Item("CONNECTION_ID")) Then
                                oCONNID = CInt(oRow.Item("CONNECTION_ID"))
                            Else
                                MyValidationLogger.Warn($"⚠️ CONNECTION_ID is null or empty for CONTROL_ID {oDEPENDING_CTRL_ID} - defaulting to 1") 'vormals CONN_ID
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ FillIndexValues - Error in creating dropdown for Grid - CONTROL_ID {oDEPENDING_CTRL_ID}: " & ex.Message)
                        End Try

                        Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
                        oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)

                        Try
                            Dim oDTRESULT_FOR_COLUMN As DataTable = GetCachedDatatable(oSqlCommand, oCONNID)

                            If Not IsNothing(oDTRESULT_FOR_COLUMN) Then
                                MyValidationLogger.Debug($"Trying to create a DropDown(FIV) for CONTROL-ID [{oDEPENDING_CTRL_ID}] - RowCount: [{oDTRESULT_FOR_COLUMN.Rows.Count}] ")

                                ' Dictionary-Lookup statt Loop
                                Dim oControl As Control = Nothing
                                If _CachedControlsByGuid.TryGetValue(oDEPENDING_CTRL_ID, oControl) Then
                                    ControlCreator.GridTables_CacheDatatableForColumn(oDEPENDING_CTRL_ID, oDEPENDING_COLUMN, oSqlCommand, oCONNID, oAdvancedLookup)
                                Else
                                    MyValidationLogger.Warn($"⚠️ Control mit ID {oDEPENDING_CTRL_ID} nicht gefunden!")
                                End If
                            Else
                                MyValidationLogger.Warn($"⚠️ FillIndexValues - oDTRESULT_FOR_COLUMN is nothing!")
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Warn($"⚠️ FillIndexValues - Unexpected error in creating Grid-Dropdown-Column [{oDEPENDING_COLUMN}] for CONTROL-ID [{oDEPENDING_CTRL_ID}]: " & ex.Message)
                        End Try
                    Next
                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ FillIndexValues - Unexpected error in creating dropdown for Grid: " & ex.Message)
                End Try
                ' ========== ENDE OPTIMIERUNG 8+9 ==========

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF FillIndexValues] Nach Grid-Dropdown-Loop: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                If LOG_PERF Then PerformanceLogger.Info("FillIndexValues/Postload")

                ' IDB PM_Info Setup (bleibt gleich)
                If IDB_ACTIVE = True Then
                    Try
                        Dim oSQL = $"select Attribut, TERM_VALUE from VWIDB_VALUE_TEXT WHERE LANG_CODE IN ('{USER_LANGUAGE}','UNQID') AND IDB_OBJ_ID = {CURRENT_DOC_ID} AND Attribut in ('PM_Info1','PM_Info2') ORDER BY Attribut"
                        Dim oDTINFO As DataTable = DatabaseFallback.GetDatatableIDB(oSQL)
                        If Not IsNothing(oDTINFO) Then
                            Dim oColor As System.Drawing.Color
                            If oDTINFO.Rows.Count > 0 Then
                                Dim oColumns As String()
                                If oDTINFO.Rows.Count = 1 Then
                                    oColumns = Split(oDTINFO.Rows(0).Item("TERM_VALUE"), "#")
                                    If oColumns.Length = 1 Then
                                        bsiInfo1.Caption = oDTINFO.Rows(0).Item("TERM_VALUE")
                                    ElseIf oColumns.Length = 2 Then
                                        bsiInfo1.Caption = oColumns(0)
                                        Try
                                            oColor = System.Drawing.Color.FromName(oColumns(1))
                                            bsiInfo1.ItemAppearance.Normal.ForeColor = oColor
                                        Catch ex As Exception
                                        End Try
                                    End If
                                    bsiInfo2.Visibility = BarItemVisibility.Never
                                ElseIf oDTINFO.Rows.Count = 2 Then
                                    oColumns = Split(oDTINFO.Rows(0).Item("TERM_VALUE"), "#")
                                    If oColumns.Length = 1 Then
                                        bsiInfo1.Caption = oDTINFO.Rows(0).Item("TERM_VALUE")
                                    ElseIf oColumns.Length = 2 Then
                                        bsiInfo1.Caption = oColumns(0)
                                        Try
                                            oColor = System.Drawing.Color.FromName(oColumns(1))
                                            bsiInfo1.ItemAppearance.Normal.ForeColor = oColor
                                        Catch ex As Exception
                                        End Try
                                    End If

                                    oColumns = Split(oDTINFO.Rows(1).Item("TERM_VALUE"), "#")
                                    If oColumns.Length = 1 Then
                                        bsiInfo2.Caption = oDTINFO.Rows(1).Item("TERM_VALUE")
                                    ElseIf oColumns.Length = 2 Then
                                        bsiInfo2.Caption = oColumns(0)
                                        Try
                                            oColor = System.Drawing.Color.FromName(oColumns(1))
                                            bsiInfo2.ItemAppearance.Normal.ForeColor = oColor
                                        Catch ex As Exception
                                        End Try
                                    End If
                                    bsiInfo2.Visibility = BarItemVisibility.Always
                                End If
                                RibbonPageGroup2.Visible = True
                            Else
                                MyValidationLogger.Debug($"No PM_Info-Configuration!!")
                                RibbonPageGroup2.Visible = False
                            End If
                        Else
                            MyValidationLogger.Warn($"⚠️ oDTINFO is nothing!!")
                            RibbonPageGroup2.Visible = False
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Unexpected error in Setting PMINFO - ERROR: {ex.Message}")
                        RibbonPageGroup2.Visible = False
                    End Try
                Else
                    RibbonPageGroup2.Visible = False
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF FillIndexValues] Nach PM_Info-Setup: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                _Indexe_Loaded = True

                Load_Additional_Searches(Not CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK)
                MyValidationLogger.Debug($"[FillIndexValues] Nach Load_Additional_Searches: rbnPgGroupAttmt.Visible={rbnPgGroupAttmt.Visible}")
                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF FillIndexValues] Nach Load_Additional_Searches: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                If CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK = False And (AdditionalDocResultsExist = True Or AdditionalDataResultsExist = True) Then
                    TryOpen_Additional_Searches()
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF FillIndexValues] Nach TryOpen_Additional_Searches: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

            Else
                MsgBox("No Form-Mask defined for this profile!" & vbCrLf & "Please inform Your admin!" & vbCrLf & "The validator will be closed!", MsgBoxStyle.Exclamation, "Attention:")
                Me.Close()
            End If

        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ Unexpected error in FillIndexValues: [{oControName} -TYPE: {oControlType}-INDEXNAME: {oIndexName}] ERROR: {ex.Message}")
            errormessage = $"Unexpected error in FillIndexValues: [{oControName} -TYPE: {oControlType}-INDEXNAME: {oIndexName}] ERROR: {ex.Message}" & vbCrLf & "Check Logfile"
            My.Settings.Save()
            frmError.ShowDialog()
        Finally
            _suppressLookupEvents = False   ' ← NEU: Events wieder freigeben
            ' KRITISCH: Erst HIER wird das Panel neu gezeichnet → nur EINMAL statt tausende Male
            PanelValidatorControl.ResumeLayout()
            ' ========== ENDE OPTIMIERUNG 10 ==========

            ' ========== OPTIMIERUNG 11: GridTables nur EINMAL am Ende ==========
            ' VORHER: War im TextBox-Case drin → wurde für jede TextBox aufgerufen
            ' NACHHER: Nur noch EINMAL am Ende → massive Zeitersparnis
            Try
                ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ GridTables_HandleControlValueChange Fehler: {ex.Message}")
            End Try
            ' ========== ENDE OPTIMIERUNG 11 ==========

            If LOG_HOTSPOTS Then
                Dim totalMs = (DateTime.Now - perfStart).TotalMilliseconds
                If totalMs > 6000 Then
                    MyValidationLogger.Warn($"⚠️ [PERF FillIndexValues] ⚠️ GESAMT LANGSAM: {totalMs}ms (Schwellwert: 6000ms)")
                Else
                    MyValidationLogger.Info($"[PERF FillIndexValues] GESAMT: {totalMs}ms")
                End If
            End If
        End Try
    End Sub

    Private Sub ApplyCurrencyMask(pTextEdit As TextEdit)
        If pTextEdit Is Nothing Then Return
        Try
            ' Kultur auf Basis der aktuellen UI, aber Währungssymbol aus DocCurrency setzen
            Dim culture As New CultureInfo("de-DE")
            ' Wenn DocCurrency leer/fehlerhaft ist, fallback auf EUR
            Dim currencySymbol As String = If(String.IsNullOrWhiteSpace(DocCurrency) OrElse DocCurrency.Length <> 3, "EUR", DocCurrency)

            ' DevExpress Numeric-Mask "c" mit angepasster Kultur
            pTextEdit.Properties.MaskSettings.Configure(Of MaskSettings.Numeric)(
            Sub(settings)
                settings.MaskExpression = "c"
                settings.Culture = DirectCast(culture.Clone(), CultureInfo)
                settings.Culture.NumberFormat.CurrencySymbol = currencySymbol
            End Sub)

            pTextEdit.Properties.UseMaskAsDisplayFormat = True


        Catch ex As Exception
            MyValidationLogger.Warn(String.Format("Unexpected error while applying CurrencyMaskfor pTextEdit: [{0} - ERROR: {1}", pTextEdit.Name, ex.Message))

        End Try

    End Sub

    Private Sub frmValidation_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        ShowOverlaySafe()
        Dim perfStart As DateTime = DateTime.MinValue
        Dim perfLastCheck As DateTime = DateTime.MinValue
        If LOG_HOTSPOTS Then
            perfStart = DateTime.Now
            perfLastCheck = perfStart
            MyValidationLogger.Info("[PERF] frmValidation_Shown START")
        End If
        Try

            '  Refresh_FileList()
            Load_Next_Document(True)
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] frmValidation_Shown nach Load_Next_Document: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            _DependingControl_In_Action = False
            _DependingColumn_In_Action = False

            BringToFront()
            If bbtniRefreshSearches.Visibility = BarItemVisibility.Always Then
                _frmValidatorSearch?.BringToFront()
            End If

            _FormLoaded = True
            Try
                If USER_GHOST_MODE_ACTIVE Then
                    BbtnitmSave.Enabled = False
                    btnSave.Enabled = False
                Else
                    BbtnitmSave.Enabled = True
                    btnSave.Enabled = True
                End If
            Catch ex As Exception

            End Try

            Try
                If RibbonPageCustTitle <> "" Then
                    RibbonPageGroupCustom.Text = RibbonPageCustTitle
                    RibbonPageGroupCustom.Visible = True
                Else
                    RibbonPageGroupCustom.Visible = False
                End If
                If Not (IsNothing(DocPathWindows) And ActiveWorkflowType = ConstAHWorkflow_BlindFile) Then
                    If ButtonExport2Folder_Caption <> "" And DocPathWindows <> "" Then
                        MyValidationLogger.Debug("Enabling Export2File, Caption set")
                        MyValidationLogger.Debug("Button Caption: [{0}]", ButtonExport2Folder_Caption)
                        MyValidationLogger.Debug("Export root folder: [{0}]", ButtonExport2Folder_RootFolder)

                        If File.Exists(DocPathWindows) Then
                            MyValidationLogger.Debug("File exists, Showing Export Button")

                            barbtnitmExport.Caption = ButtonExport2Folder_Caption
                            If ButtonExport2Folder_Mode <> String.Empty Then
                                barbtnitmExport.Tag = ButtonExport2Folder_Mode
                            End If
                            barbtnitmExport.Visibility = BarItemVisibility.Always
                            Try
                                If ButtonExport2Folder_RootFolder <> "" Then
                                    If Directory.Exists(ButtonExport2Folder_RootFolder) Then
                                        If CONFIG.Config.LastExportPath <> String.Empty Then
                                            MyValidationLogger.Debug("Last export path exists, using as default path")
                                            FolderBrowserDialog1.SelectedPath = CONFIG.Config.LastExportPath
                                        Else
                                            FolderBrowserDialog1.SelectedPath = ButtonExport2Folder_RootFolder
                                        End If

                                        MyValidationLogger.Debug("Setting default export path to [{0}]", FolderBrowserDialog1.SelectedPath)
                                    Else
                                        MyValidationLogger.Warn($"⚠️ ### Dis/Enabale Export2Path - RootFolder {ButtonExport2Folder_RootFolder} not existing or accessible!###")
                                    End If

                                End If
                            Catch ex As Exception
                                MyValidationLogger.Warn($"⚠️ ### Error Dis/Enabale Export2Path: {ex.Message} !###")
                            End Try

                        End If
                    End If
                End If


            Catch ex As Exception
                MyValidationLogger.Error(ex)
            End Try
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] frmValidation_Shown nach Ribbon/Export Setup: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            MyValidationLogger.Debug("frmValidation_Shown finished!")
            ' ✅ Overlay explizit schließen
            Try
                If SplashScreenManager.Default IsNot Nothing AndAlso SplashScreenManager.Default.IsSplashFormVisible Then
                    SplashScreenManager.CloseForm(False)
                    MyValidationLogger.Debug("✓ Overlay closed in frmValidation_Shown")
                Else
                    MyValidationLogger.Debug("ℹ Overlay war bereits geschlossen")
                End If
                ' ✅ UI-Refresh erzwingen
                Application.DoEvents()
                Me.Refresh()
            Catch ex As Exception
                MyValidationLogger.Error($"❌ Error closing overlay in Shown: {ex.Message}")
            End Try

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] frmValidation_Shown GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
            End If
        Finally
            CloseOverlaySafe()
            ' ✅ UI-Refresh erzwingen
            Try
                Application.DoEvents()
                Me.Refresh()
                Me.BringToFront()
            Catch ex As Exception
                MyValidationLogger.Error($"❌ Error in UI refresh: {ex.Message}")
            End Try
        End Try
        Try
            ' Alle offenen Forms durchsuchen
            For Each frm As Form In Application.OpenForms
                If frm.GetType().FullName.StartsWith("DevExpress.XtraSplashScreen") Then
                    MyValidationLogger.Warn($"⚠️ Unerwartete SplashForm gefunden: {frm.Name}")
                    frm.Close()
                End If
            Next
        Catch ex As Exception
            MyValidationLogger.Error($"Error checking for splash forms: {ex.Message}")
        End Try

    End Sub
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        If btnSave.Enabled = False Then
            MyValidationLogger.Warn("btnSave_Click: Button bereits disabled, Exit Sub")
            Exit Sub
        End If
        btnSave.Enabled = False
        Try
            MyValidationLogger.Info("btnSave_Click...")
            If ForceGridValidation() = True Then
                ShowOverlaySafe()
                Try
                    Finish_WFStep()
                Finally
                    CloseOverlaySafe()
                End Try
            Else
                MyValidationLogger.Warn("btnSave_Click: ForceGridValidation failed, not calling Finish_WFStep")
            End If
        Finally
            If Not _FormClosing AndAlso Not Me.IsDisposed Then
                btnSave.Enabled = True
            Else
                MyValidationLogger.Debug("btnSave_Click: Form closing, Button bleibt disabled")
            End If
        End Try
    End Sub

    Private Function ForceGridValidation()
        Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing)
        Dim perfLastCheck As DateTime = perfStart
        If LOG_HOTSPOTS Then MyValidationLogger.Info("[PERF] ForceGridValidation START")

        Dim oValidation As Boolean = True
        Dim oGrids = (From oControl In PanelValidatorControl.Controls
                      Where TypeOf oControl Is GridControl
                      Select oControl).ToList()

        MyValidationLogger.Debug("Forcing grid Validation")
        For Each oGrid As GridControl In oGrids
            MyValidationLogger.Debug("Validating Grid [{0}]", oGrid.Name)

            Dim oView As GridView = oGrid.MainView

            ' WICHTIG: Leere Grids nicht überspringen,
            ' damit das Löschen gespeichert wird.
            If oView.RowCount > 0 Then
                If DoCellValidation(oView) = False Then
                    oValidation = False
                End If
            End If

            MyValidationLogger.Debug("Validation of Grid [{0}] ended with Result: [{1}]", oGrid.Name, oValidation)

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Grid {oGrid.Name}: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            If oValidation = False Then
                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF] ForceGridValidation ABORT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
                End If
                Return False
            End If
        Next

        If LOG_HOTSPOTS Then
            MyValidationLogger.Info($"[PERF] ForceGridValidation GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
        End If

        Return True
    End Function

    Private Function DoCellValidation(pView As GridView) As Boolean
        For i As Integer = 0 To pView.DataRowCount - 1
            Dim oRowHandle = i

            pView.FocusedRowHandle = oRowHandle

            For Each oColumn As GridColumn In pView.Columns
                pView.FocusedColumn = oColumn

                If pView.PostEditor() = True Then
                    If pView.UpdateCurrentRow() = False Then
                        Return False
                    End If
                Else
                    Return False
                End If
            Next
        Next

        Return True
    End Function

    Private Function btnFinish_continue()
        Try
            Dim oSQL = PROFIL_FINISH_SQL
            oSQL = clsPatterns.ReplaceAllValues(oSQL, PanelValidatorControl, True)

            Dim oDT_ACTIONS As DataTable = DatabaseFallback.GetDatatableECM(oSQL)
            If IsNothing(oDT_ACTIONS) Then
                MsgBox("Something went wrong in btnFinish_continue - Please check Your log and inform the workflow-team!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                Return False
            ElseIf oDT_ACTIONS.Rows.Count = 0 Then
                MsgBox("Something went wrong in btnFinish_continue (No row) - Please check Your log and inform the workflow-team!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
                Return False
            End If
            'Select Case'Override' as Action_Type, 'Sind Sie sicher dass Sie nicht zuständig sind?' as Question,'Nicht Zuständig' as Caption,'Red' as Color
            Dim oMsgType
            Dim oQuestion
            Dim oTitle
            MyValidationLogger.Debug("## btnFinish_continue ##")
            Try
                oMsgType = oDT_ACTIONS?.Rows(0).Item("MsgType")
            Catch ex As Exception
                oMsgType = ""
            End Try

            Try
                oQuestion = oDT_ACTIONS?.Rows(0).Item("Question")
            Catch ex As Exception
                MyValidationLogger.Warn($"⚠️ btnFinishContinue - No QUESTION-Column in select-Result!")
                oQuestion = ""
            End Try
            Try
                oTitle = oDT_ACTIONS?.Rows(0).Item("Title")
            Catch ex As Exception
                oTitle = ""
            End Try
            MyValidationLogger.Debug($"Case is: [{oMsgType.ToString.ToUpper}]")
            Select Case oMsgType.ToString.ToUpper

                Case "MsgboxResult".ToUpper
                    If oQuestion <> "" Then
                        Dim result As MsgBoxResult
                        result = MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                        If result = MsgBoxResult.Yes Then
                            Return True
                        Else
                            Dim oLogString = $"Msgboxresult [{oQuestion}] = [No]"
                            If IDB_ACTIVE = False Then
                                WMIndexVectofield(oLogString, PROFIL_LOGINDEX)
                            Else
                                IDBData.SetVariableValue(PROFIL_LOGINDEX, oLogString)
                            End If
                            Return False
                        End If
                    End If
                Case "MsgboxStop".ToUpper
                    MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Return False
                Case "Msgbox".ToUpper
                    MessageBox.Show(oQuestion, oTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Return True
                Case "Continue".ToUpper
                    Return True
                Case Else
                    MsgBox($"No valid action provided [{oMsgType}] in btnFinishContinue - Check Your log and inform the WorkflowTeam", MsgBoxStyle.Exclamation, "")
                    MyValidationLogger.Warn($"⚠️ No valid action provided [{oMsgType}] in btnFinishContinue!")
                    Return False
            End Select
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("An unhandled exeception occured in btnFinish Procedure! Please inform Your WorkflowTeam and Check Your log!" & vbCrLf & ex.Message, MsgBoxStyle.Critical)
            Return False
        End Try
    End Function

    Sub Finish_WFStep(Optional includeFI As Boolean = True)
        Dim perfStart As DateTime = DateTime.MinValue
        Dim perfLastCheck As DateTime = DateTime.MinValue
        If LOG_HOTSPOTS Then
            perfStart = DateTime.Now
            perfLastCheck = perfStart
            MyValidationLogger.Info("[PERF] Finish_WFStep START")
        End If
        btnSave.Enabled = False
        MyValidationLogger.Info("Abschluss für DocID " & CURRENT_DOC_ID & " wird gestartet ...")
        Dim oErrorOcurred As Boolean = False
        If OverrideAll = False Then

            If Check_UpdateIndexe() = True Then
                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF] Finish_WFStep nach Check_UpdateIndexe: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If
                If PROFIL_FINISH_SQL <> String.Empty Then
                    If btnFinish_continue() = False Then
                        CloseOverlaySafe()
                        Exit Sub
                    End If
                End If

                If LOG_HOTSPOTS Then
                    MyValidationLogger.Info($"[PERF] Finish_WFStep nach btnFinish_continue: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If

                If includeFI = True Then
                    Try
                        Dim oDTFinalIndexing As DataTable = _CachedFinalIndexing

                        If oDTFinalIndexing?.Rows.Count > 0 Then
                            MyValidationLogger.Debug("FINAL INDEXING STARTING...")
                            For Each oFinalIndexRow As DataRow In oDTFinalIndexing.Rows
                                Dim oValue As String = oFinalIndexRow.Item("VALUE").ToString

                                Dim oDTResult As DataTable = Nothing
                                Dim oFinalIndex = oFinalIndexRow.Item("INDEXNAME")
                                MyValidationLogger.Debug($"Working on final index [{oFinalIndex}]...")
                                Dim oContinueOnIndifferentState As Boolean = CBool(oFinalIndexRow.Item("CONTINUE_INDETERMINED"))
                                Dim oIndexType = 0
                                If IDB_ACTIVE = False Then
                                    oIndexType = WINDREAM_MOD.GetIndexType(oFinalIndexRow.Item("INDEXNAME"))
                                End If
                                If oValue.ToUpper = "SQL-Command".ToUpper Then
                                    MyValidationLogger.Debug("Indexing wih dynamic sql...")
                                    Dim oGUID = oFinalIndexRow.Item("GUID")
                                    Dim oSQLCommand = oFinalIndexRow.Item("SQL_COMMAND")
                                    Dim oConnectionID = 1
                                    If Not IsNullOrEmpty(oFinalIndexRow.Item("CONNECTION_ID")) Then
                                        oConnectionID = CInt(oFinalIndexRow.Item("CONNECTION_ID"))
                                    Else
                                        MyValidationLogger.Warn($"⚠️ CONNECTION_ID is null or empty for final indexing of index {oFinalIndex} - defaulting to 1") 'vormals CONN_ID
                                    End If
                                    oSQLCommand = clsPatterns.ReplaceAllValues(oSQLCommand, PanelValidatorControl, True)
                                    If IsNothing(oSQLCommand) Then
                                        errormessage = "Error while replacing Values in final indexing - Check the log"
                                        My.Settings.Save()
                                        frmError.ShowDialog()
                                        oErrorOcurred = True
                                    End If
                                    If Not IsNothing(oSQLCommand) Then
                                        Dim oResultfromSQL As Object = DatabaseFallback.GetDatatable(oSQLCommand, oConnectionID)
                                        If Not IsNothing(oResultfromSQL) Then
                                            If TypeOf oResultfromSQL Is DataTable Then
                                                oDTResult = oResultfromSQL
                                                If oDTResult.Rows.Count > 1 Then
                                                    oResultfromSQL = oDTResult
                                                    MyValidationLogger.Debug($"oResultfromSQL from SQL is a datatable with [{oDTResult.Rows.Count.ToString}] rows!")
                                                ElseIf oDTResult.Rows.Count = 1 Then
                                                    oResultfromSQL = oDTResult.Rows(0).Item(0)
                                                    oValue = oResultfromSQL
                                                    MyValidationLogger.Debug($"oResultfromSQL from SQL is exactly 1 value: {oResultfromSQL.ToString}")
                                                Else
                                                    MyValidationLogger.Debug("oResultfromSQL from SQL is an empty DataTable")
                                                    oResultfromSQL = ""
                                                    oValue = oResultfromSQL
                                                End If
                                            Else
                                                If IsDBNull(oResultfromSQL) Then
                                                    If oContinueOnIndifferentState = False Then
                                                        errormessage = "Result from SQL is DBNull - Check the SQL and the log"
                                                        My.Settings.Save()
                                                        frmError.ShowDialog()
                                                        oErrorOcurred = True
                                                    Else
                                                        MyValidationLogger.Warn($"⚠️ FinalIndexResult from SQL is DBNull - AttributeName [{oFinalIndexRow.Item("INDEXNAME")}] - oContinueOnIndifferentState = true, Continuing with next Attribute and Replacing with empty String")
                                                        oResultfromSQL = ""
                                                        Continue For
                                                    End If
                                                End If
                                            End If
                                        Else
                                            MyValidationLogger.Warn("⚠️ ATTENTION: DYNAMIC VALUE IS NOTHING!")
                                            Continue For
                                        End If
                                    End If
                                Else
                                    If oValue.StartsWith("v") Then
                                        Select Case oFinalIndexRow.Item("VALUE").ToString
                                            Case "vDate"
                                                oValue = Now.ToShortDateString
                                            Case "vUserName"
                                                oValue = USER_USERNAME
                                            Case Else
                                                oValue = oFinalIndexRow.Item("VALUE")
                                        End Select
                                    End If
                                End If
                                If oErrorOcurred Then
                                    Exit For
                                End If
                                Dim oResult As String()
                                If Len(oValue) > 0 And oDTResult Is Nothing Then
                                    ReDim Preserve oResult(0)
                                    oResult(0) = oValue
                                ElseIf oDTResult IsNot Nothing Then
                                    ReDim Preserve oResult(oDTResult.Rows.Count - 1)
                                    Dim i As Integer = 0
                                    For Each oRow As DataRow In oDTResult.Rows
                                        oResult(i) = oRow.Item(0).ToString
                                        i += 1
                                    Next
                                End If
                                MyValidationLogger.Debug($"oIndexType {oIndexType.ToString}")
                                MyValidationLogger.Debug("Now the final indexing...")
                                If oIndexType > 4000 And oIndexType < 5000 Then
                                    MyValidationLogger.Debug("...via WMIndexVectofield as its an Vektorfield")
                                    If WMIndexVectofield(oResult, oFinalIndexRow.Item("INDEXNAME"), oFinalIndexRow.Item("PREVENT_DUPLICATES"), oFinalIndexRow.Item("ALLOW_NEW_VALUES")) = False Then
                                        MyValidationLogger.Debug("Final Vektorindex '" & oFinalIndexRow.Item("INDEXNAME").ToString & "' has beens et suxxessfully!")
                                    Else
                                        errormessage = "Error in final indexing:" & vbcrlf & idxerr_message
                                        My.Settings.Save()
                                        frmError.ShowDialog()
                                        oErrorOcurred = True
                                    End If
                                Else
                                    MyValidationLogger.Debug("...as single indexing")
                                    If oValue.ToUpper = "SQL-Command".ToUpper Then
                                        MsgBox("Something went wrong while final-indexing. Check Your log and inform the admin-team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                                        MyValidationLogger.Warn("⚠️ Something went wrong while final-indexing")
                                        Exit For
                                    End If
                                    Dim oFIResult As Boolean = False
                                    If IDB_ACTIVE = False Then
                                        If Indexiere_File(CURRENT_WMFILE, oFinalIndexRow.Item("INDEXNAME"), oResult) = True Then
                                            oFIResult = True
                                            MyValidationLogger.Debug("FINALER INDEX '" & oFinalIndexRow.Item("INDEXNAME") & "' WURDE ERFOLGREICH GESETZT")
                                            If PROFIL_LOGINDEX <> "" Then
                                                Dim logstr = Return_LOGString(oValue, "DDFINALINDEX", oFinalIndexRow.Item("INDEXNAME"))
                                                WMIndexVectofield(logstr, PROFIL_LOGINDEX)
                                            End If
                                        End If
                                    Else
                                        If IDBData.SetVariableValue(oFinalIndexRow.Item("INDEXNAME"), oValue) = True Then
                                            oFIResult = True
                                            MyValidationLogger.Debug($"Final index IDB '{oFinalIndexRow.Item("INDEXNAME")}' was updated with [{oValue.ToString}]")
                                        End If
                                    End If
                                    If oFIResult = False Then
                                        errormessage = "Error in final indexing:" & vbcrlf & idxerr_message
                                        My.Settings.Save()
                                        frmError.ShowDialog()
                                        oErrorOcurred = True
                                    Else

                                    End If
                                End If
                                If oErrorOcurred = True Then
                                    Exit For
                                End If
                            Next
                        End If
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Error in finalIndexing: {ex.Message}")
                        oErrorOcurred = True
                    End Try
                End If
                If LOG_HOTSPOTS AndAlso includeFI Then
                    MyValidationLogger.Info($"[PERF] Finish_WFStep nach FinalIndexing: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                    perfLastCheck = DateTime.Now
                End If
                Try
                    If Override = True And Override_SQLCommand <> "" Then

                        DatabaseFallback.ExecuteNonQueryECM(Override_SQLCommand)

                    End If
                    If LOG_HOTSPOTS Then
                        MyValidationLogger.Info($"[PERF] Finish_WFStep nach Override-SQL: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                        perfLastCheck = DateTime.Now
                    End If
                    If oErrorOcurred = False Then

                        Dim WORK_HISTORY_ENTRY = Nothing

                        Try
                            WORK_HISTORY_ENTRY = CURRENT_DT_PROFILE.Rows(0).Item("WORK_HISTORY_ENTRY")
                            If IsDBNull(WORK_HISTORY_ENTRY) Then
                                WORK_HISTORY_ENTRY = Nothing
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            WORK_HISTORY_ENTRY = Nothing
                        End Try

                        If Not IsNothing(WORK_HISTORY_ENTRY) Then
                            If WORK_HISTORY_ENTRY <> String.Empty Then
                                Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
                                Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
                                Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(WORK_HISTORY_ENTRY)
                                For Each element As System.Text.RegularExpressions.Match In elemente
                                    Try
                                        MyValidationLogger.Debug("element in RegeX WORK_HISTORY_ENTRY: " & element.Value)
                                        Dim CTRL_ID = element.Value.Substring(2, element.Value.Length - 3)
                                        CTRL_ID = CTRL_ID.Replace("CTRLID", "")
                                        Dim value_from_control
                                        If IsNumeric(CTRL_ID) Then
                                            For Each oControl As Control In Me.PanelValidatorControl.Controls
                                                Try
                                                    If IsNothing(DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid) Then
                                                        Continue For
                                                    End If
                                                Catch ex As Exception
                                                    Continue For
                                                End Try

                                                If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid = CTRL_ID Then
                                                    Select Case True
                                                        Case oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit)
                                                            Try
                                                                Dim oBaseEdit As BaseEdit = oControl
                                                                value_from_control = oBaseEdit.EditValue
                                                            Catch ex As Exception
                                                                MyValidationLogger.Error(ex)
                                                                value_from_control = String.Empty
                                                            End Try
                                                        Case oControl.GetType() = GetType(System.Windows.Forms.ComboBox)
                                                            Dim cmb As Windows.Forms.ComboBox = oControl
                                                            Try
                                                                value_from_control = cmb.Text
                                                            Catch ex As Exception
                                                                MyValidationLogger.Error(ex)
                                                                value_from_control = String.Empty
                                                            End Try
                                                        Case oControl.GetType() = GetType(System.Windows.Forms.DateTimePicker)
                                                            Dim dtp As DateTimePicker = oControl
                                                            Try
                                                                value_from_control = dtp.Value.ToString
                                                            Catch ex As Exception
                                                                MyValidationLogger.Error(ex)
                                                                value_from_control = String.Empty
                                                            End Try
                                                        Case oControl.GetType() = GetType(System.Windows.Forms.CheckBox)
                                                            Dim chk As CheckBox = oControl
                                                            Try
                                                                value_from_control = chk.Checked
                                                            Catch ex As Exception
                                                                MyValidationLogger.Error(ex)
                                                                value_from_control = String.Empty
                                                            End Try
                                                    End Select
                                                End If
                                            Next
                                        End If

                                        If Not IsNothing(value_from_control) Then
                                            WORK_HISTORY_ENTRY = WORK_HISTORY_ENTRY.ToString.Replace(element.Value, value_from_control)
                                        End If
                                    Catch ex As Exception
                                        MyValidationLogger.Error(ex)
                                        MyValidationLogger.Info("Unexpected Error in Checking control values for WORK_HISTORY_ENTRY - ERROR: " & ex.Message)
                                    End Try
                                Next
                                If WORK_HISTORY_ENTRY.ToString.Contains("@DATE") Then
                                    WORK_HISTORY_ENTRY = WORK_HISTORY_ENTRY.ToString.Replace("@DATE", Now.ToShortDateString)
                                End If
                                If WORK_HISTORY_ENTRY.ToString.Contains("@USERNAME") Then
                                    WORK_HISTORY_ENTRY = WORK_HISTORY_ENTRY.ToString.Replace("@USERNAME", USER_USERNAME)
                                End If
                            Else
                                WORK_HISTORY_ENTRY = ""
                            End If
                        End If

                        If LOG_HOTSPOTS Then
                            MyValidationLogger.Info($"[PERF] Finish_WFStep nach WORK_HISTORY: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                            perfLastCheck = DateTime.Now
                        End If

                        Dim ins = String.Format("INSERT INTO TBPM_FILES_WORK_HISTORY (PROFIL_ID, DOC_ID,WORKED_BY,WORKED_WHERE,STATUS_COMMENT) VALUES ({0},{1},'{2}','{3}','{4}')", CURRENT_ProfilGUID, CURRENT_DOC_ID, USER_USERNAME, System.Environment.MachineName, WORK_HISTORY_ENTRY)
                        DatabaseFallback.ExecuteNonQueryECM(ins)
                        Dim oFIsql As String
                        If Not IsNothing(Current_Document) Then
                            If Current_Document.Extension = "pdf" Then
                                If Not IsNothing(WORK_HISTORY_ENTRY) Then
                                    If CBool(CURRENT_DT_PROFILE.Rows(0).Item("ANNOTATE_WORK_HISTORY_ENTRY")) = True Then
                                        oFIsql = String.Format("SELECT * FROM TBPM_FILES_WORK_HISTORY WHERE GUID = (SELECT MAX(GUID) FROM TBPM_FILES_WORK_HISTORY WHERE PROFIL_ID = {0} AND DOC_ID = {1})", CURRENT_ProfilGUID, CURRENT_DOC_ID)
                                        Dim DT_ENTRY As DataTable = DatabaseFallback.GetDatatableECM(oFIsql)
                                        If Not IsNothing(DT_ENTRY) Then
                                            If DT_ENTRY.Rows.Count = 1 Then
                                                Dim AnnotationString = DT_ENTRY.Rows(0).Item("WORKED_WHEN") & " " & DT_ENTRY.Rows(0).Item("WORKED_BY") & ": " & DT_ENTRY.Rows(0).Item("STATUS_COMMENT")
                                                'ClassAnnotation.Annotate_PDF("Workflow-State:", AnnotationString, 0, False)
                                            End If
                                        End If
                                    End If
                                    Dim oAnnotateAllWHEs = CURRENT_DT_PROFILE.Rows(0).Item("ANNOTATE_ALL_WORK_HISTORY_ENTRIES")
                                    If CBool(oAnnotateAllWHEs) = True Then
                                        oFIsql = String.Format("SELECT * FROM TBPM_FILES_WORK_HISTORY WHERE DOC_ID = {1} ORDER BY GUID", CURRENT_ProfilGUID, CURRENT_DOC_ID)
                                        Dim DT_ENTRIES As DataTable = DatabaseFallback.GetDatatableECM(oFIsql)
                                        If Not IsNothing(DT_ENTRIES) Then
                                            If DT_ENTRIES.Rows.Count > 0 Then
                                                Dim AnnotationString As String = ""
                                                For Each rw As DataRow In DT_ENTRIES.Rows
                                                    AnnotationString = AnnotationString & rw.Item("WORKED_WHEN") & " " & rw.Item("WORKED_BY") & ": " & rw.Item("STATUS_COMMENT") & vbcrlf
                                                Next
                                                'ClassAnnotation.Annotate_PDF("Workflow History:", AnnotationString, 0, False, 10, 40)
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If

                        If LOG_HOTSPOTS Then
                            MyValidationLogger.Info($"[PERF] Finish_WFStep nach Annotation: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                            perfLastCheck = DateTime.Now
                        End If

                        If Move2Folder <> "" And (OPERATION_MODE_FS = ClassConstants.OpModeFS_PWM Or OPERATION_MODE_FS = ClassConstants.OpModeFS_IDBWM) Then
                            idxerr_message = allgFunk.Move2Folder(DocPathWindows, Move2Folder, CURRENT_ProfilGUID, WINDREAM_ALLG)
                            If idxerr_message <> "" Then
                                errormessage = "Fehler bei Move2Folder:" & vbcrlf & idxerr_message
                                My.Settings.Save()
                                frmError.ShowDialog()
                                oErrorOcurred = True
                            End If
                            If LOG_HOTSPOTS Then
                                MyValidationLogger.Info($"[PERF] Finish_WFStep nach Move2Folder: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                                perfLastCheck = DateTime.Now
                            End If
                        End If

                    End If

                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    errormessage = "Unexpected error in Finish:" & ex.Message
                    My.Settings.Save()
                    frmError.ShowDialog()
                    oErrorOcurred = True
                    MyValidationLogger.Info("Unexpected error in Finish: " & ex.Message, True)
                    Exit Sub
                End Try
            Else
                errormessage = oErrMsgMissingInput
                MyValidationLogger.Warn($"⚠️ [Finish_WFStep] Validierung fehlgeschlagen → OpenfrmError")
                OpenfrmError(oErrMsgMissingInput)  ' ← Statt: frmError.ShowDialog()
                oErrorOcurred = True
                Exit Sub
            End If
        Else
            MyValidationLogger.Info($"Overriding all in action for DocID: {CURRENT_DOC_ID} - ProfileID: {CURRENT_ProfilGUID}")
            If Override_SQLCommand <> "" Then
                If DatabaseFallback.ExecuteNonQueryECM(Override_SQLCommand) = False Then
                    oErrorOcurred = True
                End If
            End If
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Finish_WFStep nach OverrideAll-SQL: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
            OverrideAll = False

        End If

        If oErrorOcurred = True Then
            MsgBox("Unhandled error occured in Finish Workflow-Step...Please check your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
        Else
            PRTF_PROFILE_FILES_WORK("Worked")
            MyValidationLogger.Debug("Validation of document ended successfully!")
            Dim oPROCSQL = $"EXEC PRPM_CHECK_NEXT_WF {CURRENT_DOC_GUID}"
            If DatabaseFallback.ExecuteNonQueryECM(oPROCSQL) = False Then
                MyValidationLogger.Warn($"⚠️ Attention: Error executing proc [{oPROCSQL}]")
            End If
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Finish_WFStep nach PRPM_CHECK_NEXT_WF: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
        End If


        If CURRENT_JUMP_DOC_GUID <> 0 Then
            CURRENT_DOC_GUID = 0
            MyValidationLogger.Info($"[Finish_WFStep] CURRENT_JUMP_DOC_GUID <> 0 → verzögertes Close()")
            CloseOverlaySafe()
            BeginInvoke(New Action(Sub()
                                       If Not Me.IsDisposed Then
                                           MyValidationLogger.Debug("[BeginInvoke] Führe Me.Close() aus")
                                           Me.Close()
                                       Else
                                           MyValidationLogger.Warn("[BeginInvoke] Form bereits disposed, Close() übersprungen")
                                       End If
                                   End Sub))
            Exit Sub
        Else
            Load_Next_Document(False)

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Finish_WFStep nach Load_Next_Document: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If
            Focus_FirstControl()
        End If
        If LOG_HOTSPOTS Then
            MyValidationLogger.Info($"[PERF] Finish_WFStep GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
        End If
    End Sub
    Sub Focus_FirstControl()
        If first_control Is Nothing = False Then
            Dim otype = first_control.GetType
            first_control.Focus()
        End If
    End Sub
    Function Check_Missing_Control_Value(control As Control, typ As String) As Boolean
        Select Case typ
            Case "txt"
                Dim oTextBox As BaseEdit = control

                If IsNothing(oTextBox.EditValue) Then
                    Return True
                End If

                If oTextBox.EditValue.ToString = String.Empty Then
                    Return True
                End If
        End Select

        Return False
    End Function

    Function Return_PM_VEKTOR(input As String, VKTBezeichner As String)
        Dim PM_String As String
        Try
            Dim Bezeichner As String = VKTBezeichner.Replace("[%VKT", "")
            PM_String = "DD-PM" & PMDelimiter & Bezeichner & PMDelimiter & input & PMDelimiter & USER_USERNAME & PMDelimiter & Now.ToString
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info(">> error in Return_PM_VEKTOR: " & ex.Message, True)
            PM_String = "DD-PM ERROR: " & ex.Message
        End Try
        Return PM_String

    End Function
    Function Return_LOGString(input As String, old As String, indexname As String)
        Dim PM_String As String
        Try
            If old = "DDFINALINDEX" Then
                PM_String = $"DD-PMLog-FINAL{PMDelimiter}{indexname}{PMDelimiter}{input}{PMDelimiter}{USER_USERNAME}{PMDelimiter}{Now.ToString}"
            Else
                PM_String = $"DD-PMLog-CHG{PMDelimiter}{indexname}{PMDelimiter}NEW: [{input}] - OLD: [{old}]{PMDelimiter}{USER_USERNAME}{PMDelimiter}{Now.ToString}"
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info(">> error in Return_LOGString: " & ex.Message, True)
            PM_String = "DD-PM ERROR: " & ex.Message
        End Try
        Return PM_String

    End Function
    Private Function WMIndexVectofield(pValues As Object, NameVKTIndex As String, Optional PreventDuplicates As Boolean = False, Optional AllowAddNewValues As Boolean = True, Optional IndexBehaviour As String = "Add")
        Dim oOldValue As Object = CURRENT_WMFILE.GetVariableValue(NameVKTIndex)
        Dim oValueList As New List(Of Object)
        Dim oNewValue As Object()
        Dim oMissing As Boolean = False

        If oOldValue IsNot Nothing AndAlso TypeOf oOldValue Is Object Then

            ' If new values are allowed, add the old values first
            If AllowAddNewValues Then
                oValueList = DirectCast(oOldValue, Object()).ToList()
            End If
            If TypeOf pValues Is DataTable Then
                MyValidationLogger.Debug("WMIndexVectofield - pValues is Datatable ...")
                Dim i As Integer = 0
                For Each oRow As DataRow In pValues.Rows
                    oValueList.Add(oRow.Item(0).ToString)
                    i += 1
                Next
            ElseIf TypeOf pValues Is String() Then
                MyValidationLogger.Debug("WMIndexVectofield - pValues is String() ...")
                For Each oStr As String In DirectCast(pValues, String())
                    oValueList.Add(oStr)
                Next

            Else
                MyValidationLogger.Debug("WMIndexVectofield - pValues is Single String ...")
                ' Add the new value
                oValueList.Add(pValues)
            End If


        Else
            If TypeOf pValues Is DataTable Then
                MyValidationLogger.Debug("WMIndexVectofield (2) - pValues is DataTable ...")
                Dim i As Integer = 0
                For Each oRow As DataRow In pValues.Rows
                    oValueList.Add(oRow.Item(0).ToString)
                    i += 1
                Next
            ElseIf TypeOf pValues Is String() Then
                MyValidationLogger.Debug("WMIndexVectofield (2) - pValues is String() ...")
                For Each oStr As String In DirectCast(pValues, String())
                    oValueList.Add(oStr)
                Next
            Else
                MyValidationLogger.Debug("WMIndexVectofield (2) - pValues is Single String ...")
                ' Just add input as the only value
                oValueList.Add(pValues)
            End If
        End If

        If PreventDuplicates Then
            oValueList = oValueList.
                Distinct().
                ToList()
        End If

        oNewValue = oValueList.ToArray()

        If oNewValue.Length > 0 Then
            'Jetzt die Datei indexieren
            If Indexiere_File(CURRENT_WMFILE, NameVKTIndex, oNewValue) = False Then
                oMissing = True
                MyValidationLogger.Info("Error while indexing Vektorfeld '" & NameVKTIndex & "' - ERROR: " & idxerr_message)
                oErrMsgMissingInput = "Error while indexing Vektorfeld '" & NameVKTIndex & "' - ERROR: " & idxerr_message
            End If
        End If

        Return oMissing
    End Function
    Function DT_FOR_ARRAY(pArr As String()) As DataTable
        Dim odt As New DataTable
        odt.Columns.Add("ID", GetType(Integer))
        odt.Columns.Add("Result", GetType(String))
        Dim N As Integer = odt.Columns("ID").AutoIncrement

        For Each oStr In pArr
            odt.Rows.Add(N, oStr)
        Next
        Return odt
    End Function
    Function Check_UpdateIndexe(Optional ByVal pRegularComplete As Boolean = True) As Boolean
        Dim oControlName
        Dim oControlId As String
        Try
            Dim oMissing As Boolean = False
            ' ========== BATCH: Sammelmodus starten (nur IDB) ==========
            If IDB_ACTIVE Then
                IDBData.BeginBatch()
            End If
            ' ========== ENDE BATCH START ==========
            ' ========== OPTIMIERUNG: Nur geänderte Controls durchlaufen ==========
            For Each oControl As Control In Me.PanelValidatorControl.Controls
                If oControl.Name.StartsWith("BTNDYN_GRID") Then
                    Continue For
                End If
                Dim oMeta As ClassControlCreator.ControlMetadata = Nothing
                Try
                    oMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)
                Catch
                    Continue For ' Control ohne Metadata überspringen
                End Try
                MyValidationLogger.Debug($"[CHECK_UPDATE] Control: [{oMeta.Name}], Type: [{oControl.GetType().Name}], IsDirty: [{oMeta.IsDirty}]")

                ' Suche die Control-Definition
                Dim oControlRow = (From form In DTVWCONTROL_INDEX.AsEnumerable()
                                   Where form.Item("GUID") = oMeta.Guid).SingleOrDefault()

                If oControlRow Is Nothing Then Continue For

                Dim oCtrlType = oControlRow.Item("CTRL_TYPE").ToString
                Dim oIndexName As String = oControlRow.Item("INDEX_NAME")
                Dim oIsRequired As Boolean = CBool(oControlRow.Item("VALIDATION"))
                Dim oIsReadOnly As Boolean = CBool(oControlRow.Item("READ_ONLY"))
                Dim oSaveChangeEnabledFalse As Boolean = CBool(oControlRow.Item("SAVE_CHANGE_ON_ENABLED"))

                ' Überspringe System-Controls
                If oCtrlType = "LBL" Or oCtrlType = "LINE" Or oCtrlType = "BUTTON" Then
                    Continue For
                End If
                If oIndexName = "@@DISPLAY_ONLY" Then
                    Continue For
                End If

                ' Überspringe ReadOnly-Controls (außer SAVE_CHANGE_ON_ENABLED)
                If oIsReadOnly = True And oSaveChangeEnabledFalse = False Then
                    MyValidationLogger.Debug($"Skipping ReadOnly ControlName [{oControl.Name}]!")
                    Continue For
                End If

                ' ========== KERN-OPTIMIERUNG: Dirty-Check ==========
                ' Überspringe unveränderte, nicht-required Controls
                If Not oMeta.IsDirty And Not oIsRequired Then
                    MyValidationLogger.Debug($"Skipping unchanged control [{oMeta.Name}]")
                    Continue For
                End If
                ' ========== ENDE OPTIMIERUNG ==========

                ' Rejection-Handling
                If REJECTION_ACTIVE = True And (oIndexName = PROFIL_REJECT_ACTIONS_ATTRIBUTE Or oIndexName = PROFIL_REJECT_COMMENT_ATTRIBUTE) Then
                    MyValidationLogger.Debug($"Index [{oIndexName}] will be skipped as Rejection is in progress!")
                    Continue For
                End If

                ' ========== AB HIER: Bestehender Validierungs-Code ==========
                Dim oMyInput As String = ""
                Dim oSQLCheckCommand As String = IIf(IsDBNull(oControlRow.Item("SQL_UEBERPRUEFUNG")), "", oControlRow.Item("SQL_UEBERPRUEFUNG"))
                Dim oControlType As String = oControlRow.Item("CTRL_TYPE")
                Dim oIDBTyp As Integer
                If IDB_ACTIVE Then
                    oIDBTyp = oControlRow.Item("IDB_TYP")
                End If

                oControlId = oControlRow.Item("GUID")
                Dim oRegexMatch As String = ObjectEx.NotNull(oControlRow.Item("REGEX_MATCH"), String.Empty)
                Dim oRegexMessage As String = ObjectEx.NotNull(oControlRow.Item("REGEX_MESSAGE_DE"), String.Empty)
                oControlName = oControlRow.Item("CTRL_NAME")
                Dim oOVERWRITE_DATA = oControlRow.Item("OVERWRITE_DATA")

                MyValidationLogger.Debug("Indexierung für Control (" & oControlId & ") '" & oControlName & "' gestartet. Indexname '" & oIndexName & "'")

                If oIndexName = "" Then
                    MyValidationLogger.Info(">> Indexname is unexpected empty.")
                    Continue For
                End If

                ' ========== SELECT CASE: Control-Type-Handling ==========
                Select Case True
                    Case oControl.GetType = GetType(LookupControl3)
                        Try
                            Dim lookup As LookupControl3 = oControl
                            If lookup.Properties.SelectedValues.Count = 0 And oIsRequired = True Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] LookupGrid '{oControl.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = $"Pflichtfeld: Keine Auswahl getroffen in LookupGrid '{oControl.Name}'"
                                    MyValidationLogger.Warn($"⚠️ {oErrMsgMissingInput}")
                                    oControl.BackColor = Color.Red
                                    OpenfrmError(oErrMsgMissingInput)
                                    Exit For
                                End If
                            Else
                                If lookup.Properties.MultiSelect = True Then
                                    Dim oLookupRows As Integer = lookup.Properties.SelectedValues.Count
                                    If oLookupRows > 0 Then
                                        Dim ZeilenGrid As Integer = 0
                                        Dim myVektorArr As String()
                                        For Each value As String In lookup.Properties.SelectedValues
                                            If value Is Nothing = False Then
                                                ReDim Preserve myVektorArr(ZeilenGrid)
                                                myVektorArr(ZeilenGrid) = value
                                                ZeilenGrid += 1
                                            End If
                                        Next
                                        If IDB_ACTIVE = False Then
                                            If Indexiere_File(CURRENT_WMFILE, oIndexName, myVektorArr) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing von LookupGrid - ERROR: " & idxerr_message
                                                MyValidationLogger.Warn($"⚠️ Error while indexing [{oIndexName}] von LookupGrid - ERROR: " & idxerr_message)
                                                frmError.ShowDialog()
                                                Exit For
                                            End If
                                        Else
                                            Dim oMyDT = DT_FOR_ARRAY(myVektorArr)
                                            If IDBData.SetVariableValue(oIndexName, oMyDT, oOVERWRITE_DATA, oIDBTyp) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing IDB-Object LookupGrid"
                                                MyValidationLogger.Warn($"⚠️ Error while indexing IDB-Object LookupGrid [{oIndexName}] ")
                                                frmError.ShowDialog()
                                                Exit For
                                            End If
                                        End If
                                    Else
                                        Dim oValues As New List(Of Object) From {String.Empty}
                                        If IDB_ACTIVE = False Then
                                            If Indexiere_File(CURRENT_WMFILE, oIndexName, oValues.ToArray) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing von LookupGrid - ERROR: " & idxerr_message
                                                MyValidationLogger.Warn($"⚠️ Error while indexing LookupGrid [{oIndexName}] ")
                                                frmError.ShowDialog()
                                                Exit For
                                            End If
                                        Else
                                            For Each ochangedLookub In listChangedLookup
                                                If lookup.Name = ochangedLookub Then
                                                    IDBData.Delete_AttributeData(CURRENT_DOC_ID, oIndexName)
                                                    Exit For
                                                End If
                                            Next
                                        End If
                                    End If
                                Else

                                    ' Single-Select Lookup
                                    oMyInput = lookup.Properties.SelectedValues.FirstOrDefault()
                                    If IsNothing(oMyInput) And oIsRequired = True Then
                                        If pRegularComplete = False Then
                                            MyValidationLogger.Debug($"[CHECK_UPDATE] LookupGrid(SingleSelect) '{lookup.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                            Continue For
                                        Else
                                            oMissing = True
                                            oErrMsgMissingInput = $"Could not get FirstOrDefault-Value of LookUpGrid! - LookUPGridName: {lookup.Name}"
                                            MyValidationLogger.Warn(oErrMsgMissingInput)
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    ElseIf IsNothing(oMyInput) And oIsRequired = False Then
                                        For Each ochangedLookub In listChangedLookup
                                            If lookup.Name = ochangedLookub Then
                                                IDBData.Delete_AttributeData(CURRENT_DOC_ID, oIndexName)
                                                Exit For
                                            End If
                                        Next
                                        Continue For
                                    End If

                                    Dim oValueFromObject
                                    If oIndexName.StartsWith("[%VKT") Then
                                        oValueFromObject = ReturnVektor_IndexValue(oIndexName)
                                    Else
                                        oValueFromObject = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                        Dim oValueIsIndifferent As Boolean = False
                                        If Not IsNothing(oValueFromObject) Then
                                            If IDB_ACTIVE = False Then
                                                If oValueFromObject.ToString = "System.Object[]" Then
                                                    If oValueFromObject.Length = 1 Then
                                                        oValueFromObject = oValueFromObject(0)
                                                    Else
                                                        MyValidationLogger.Info(" >> Vectorfield " & oIndexName & "' contains more then one value - First value will be used")
                                                        oValueFromObject = oValueFromObject(0)
                                                    End If
                                                End If
                                            End If
                                        Else
                                            oValueFromObject = ""
                                        End If

                                        If IsNothing(oValueFromObject) Then
                                            MyValidationLogger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is NOTHING!")
                                            oValueIsIndifferent = True
                                        End If
                                        If oValueIsIndifferent = False Then
                                            If IsDBNull(oValueFromObject) Then
                                                MyValidationLogger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is DBNULL!")
                                                oValueIsIndifferent = True
                                            End If
                                        End If

                                        ' ========== FIX: Force-Reindex für Lookup ==========
                                        Dim bForceReindexLookup As Boolean = _listForceReindex.Contains(oControl.Name)
                                        If bForceReindexLookup Then
                                            MyValidationLogger.Debug($"[CHECK_UPDATE] Force-Reindex aktiv für Lookup [{oControl.Name}] → Wertvergleich übersprungen")
                                            _listForceReindex.Remove(oControl.Name)
                                        End If
                                        ' ========== ENDE FIX ==========

                                        Dim oValueSourceIsDifferent As Boolean = bForceReindexLookup
                                        If Not bForceReindexLookup Then
                                            If oValueIsIndifferent = False Then
                                                MyValidationLogger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is [{oValueFromObject}]")
                                                Try
                                                    If oValueFromObject <> oMyInput Then
                                                        oValueSourceIsDifferent = True
                                                        MyValidationLogger.Debug($"CheckUpdateIndex.LookUpGrid: There is a difference between oValueFromObject and  [{oValueFromObject}]")
                                                    End If
                                                Catch ex As Exception
                                                    oValueSourceIsDifferent = True
                                                    MyValidationLogger.Debug($"oValueFromObject <> oMyInput not possible as one object might be a multiple row object")
                                                End Try
                                            End If
                                        End If

                                        If (oValueIsIndifferent = True Or oValueSourceIsDifferent = True) Then
                                            If oIndexName.StartsWith("[%VKT") Then
                                                oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                                If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                    oMissing = True
                                                    oErrMsgMissingInput = "Error while indexing Textbox as VEKTOR - ERROR: " & idxerr_message
                                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                                    frmError.ShowDialog()
                                                    Exit For
                                                End If
                                            Else
                                                If IDB_ACTIVE = False Then
                                                    Dim result() As String
                                                    ReDim Preserve result(0)
                                                    result(0) = oMyInput
                                                    If Indexiere_File(CURRENT_WMFILE, oIndexName, result) = False Then
                                                        oMissing = True
                                                        oErrMsgMissingInput = "Error while indexing Textbox - ERROR: " & idxerr_message
                                                        MyValidationLogger.Warn(oErrMsgMissingInput)
                                                        frmError.ShowDialog()
                                                        Exit For
                                                    End If
                                                Else
                                                    If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                        Exit For
                                                    End If
                                                End If
                                                If IDB_ACTIVE = False Then
                                                    If PROFIL_LOGINDEX <> "" Then
                                                        Dim oLogStr = Return_LOGString(oMyInput, oValueFromObject, oIndexName)
                                                        WMIndexVectofield(oLogStr, PROFIL_LOGINDEX)
                                                    End If
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                        End Try

                    Case oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType = GetType(MemoEdit)
                        Try
                            Dim oWrongInputMessage = Translation_Strings.Falsche_Eingabe
                            Dim oDevexpressTextEdit As DevExpress.XtraEditors.TextEdit = oControl
                            MyValidationLogger.Debug("Validating Textbox..")

                            If oRegexMatch <> String.Empty AndAlso Not Regex.IsMatch(oDevexpressTextEdit.EditValue, oRegexMatch) Then
                                oMissing = True
                                oErrMsgMissingInput = oWrongInputMessage & " textbox '" & oControl.Name & "'"
                                MyValidationLogger.Warn(oErrMsgMissingInput)
                                If oRegexMessage <> String.Empty Then
                                    oErrMsgMissingInput &= ":" & vbCrLf & oRegexMessage
                                End If
                                oControl.BackColor = Color.Red
                                If _FormClosing Then
                                    MyValidationLogger.Warn("Form closing - skip error dialog")
                                    Return False
                                End If
                                OpenfrmError(oErrMsgMissingInput)
                                Exit For
                            End If

                            If Check_Missing_Control_Value(oControl, "txt") = True And oIsRequired = True Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] TextEdit '{oControl.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = oWrongInputMessage & " textbox '" & oControl.Name & "'"
                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                    oControl.BackColor = Color.Red
                                    frmError.ShowDialog()
                                    Exit For
                                End If
                            Else
                                MyValidationLogger.Debug("Reading current value from Textbox")
                                Dim oTextEdit As BaseEdit = DirectCast(oControl, BaseEdit)
                                oMyInput = ClassFormat.GetStringValue(oTextEdit.EditValue)
                                MyValidationLogger.Debug("Form Value: [{0}]", oMyInput)

                                Dim oSourceValue = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                MyValidationLogger.Debug("Current Value: [{0}]", oSourceValue)

                                If oIndexName.StartsWith("[%VKT") Then
                                    oSourceValue = ReturnVektor_IndexValue(oIndexName)
                                Else
                                    If Not IsNothing(oSourceValue) Then
                                        If oSourceValue.ToString = "System.Object[]" Then
                                            If oSourceValue.Length = 1 Then
                                                oSourceValue = oSourceValue(0)
                                            Else
                                                MyValidationLogger.Info(" >> Vectorfield " & oIndexName & "' contains more then one value - First value will be used")
                                                oSourceValue = oSourceValue(0)
                                            End If
                                        End If
                                    Else
                                        oSourceValue = ""
                                    End If
                                End If

                                Dim oSetValue As Boolean = False
                                If IsDBNull(oSourceValue) Then
                                    oSetValue = True
                                End If
                                If oSetValue = False Then
                                    If IsNothing(oSourceValue) Then
                                        oSetValue = True
                                    End If
                                End If
                                If oSetValue = False Then
                                    Try
                                        If oSourceValue <> oMyInput Then
                                            oSetValue = True
                                        End If
                                    Catch ex As Exception
                                        oSetValue = True
                                    End Try
                                End If

                                ' ========== FIX: Force-Reindex für TextEdit/MemoEdit ==========
                                If Not oSetValue Then
                                    If _listForceReindex.Contains(oControl.Name) Then
                                        MyValidationLogger.Debug($"[CHECK_UPDATE] Force-Reindex aktiv für TextEdit [{oControl.Name}] → Wertvergleich übersprungen")
                                        _listForceReindex.Remove(oControl.Name)
                                        oSetValue = True
                                    End If
                                Else
                                    _listForceReindex.Remove(oControl.Name)
                                End If
                                ' ========== ENDE FIX ==========

                                MyValidationLogger.Debug("Preparing Indexing for Textbox")

                                If oSetValue = True Then
                                    If oIndexName.StartsWith("[%VKT") Then
                                        oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                        If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                            oMissing = True
                                            oErrMsgMissingInput = $"Error while indexing Textbox {oControl} - Attribute {oIndexName} as VEKTOR - ERROR: " & idxerr_message
                                            MyValidationLogger.Warn(oErrMsgMissingInput)
                                            If _FormClosing Then
                                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                                Return False
                                            End If
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    Else
                                        If IDB_ACTIVE = False Then
                                            Dim result() As String
                                            ReDim Preserve result(0)
                                            result(0) = oMyInput
                                            MyValidationLogger.Debug("Indexing Index [{0}] with value [{1}]", oMyInput, oIndexName)
                                            If Indexiere_File(CURRENT_WMFILE, oIndexName, result) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = $"Error while indexing Textbox {oControl} - Attribute {oIndexName} - ERROR: " & idxerr_message
                                                MyValidationLogger.Warn(oErrMsgMissingInput)
                                                If _FormClosing Then
                                                    MyValidationLogger.Warn("Form closing - skip error dialog")
                                                    Return False
                                                End If
                                                OpenfrmError(oErrMsgMissingInput)
                                                Exit For
                                            End If
                                        Else
                                            If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                Exit For
                                            End If
                                        End If
                                        If IDB_ACTIVE = False Then
                                            If PROFIL_LOGINDEX <> "" Then
                                                Dim oMyLogString = Return_LOGString(oMyInput, oSourceValue, oIndexName)
                                                WMIndexVectofield(oMyLogString, PROFIL_LOGINDEX)
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            oErrMsgMissingInput = "Unexpected error in Check_UpdateIndexe TextBox '" & oControl.Name & "' - Check the log"
                            MyValidationLogger.Error(ex)
                            Dim st As New StackTrace(True)
                            st = New StackTrace(ex, True)
                            MyValidationLogger.Warn("⚠️ Unexpected error in Check_UpdateIndexe  TextBox :" & ex.Message, True)
                            If _FormClosing Then
                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                Return False
                            End If
                            OpenfrmError(oErrMsgMissingInput)
                            oMeta.IsDirty = False
                            Return False
                        End Try

                    Case oControl.GetType = GetType(System.Windows.Forms.ComboBox)
                        Try
                            MyValidationLogger.Debug($"Working on Combobox...")
                            Dim cmb As Windows.Forms.ComboBox = oControl
                            If cmb.SelectedIndex = -1 And oIsRequired = True Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] ComboBox '{cmb.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = "Please Choose an entry out of ComboBox '" & cmb.Name & "'"
                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                    If _FormClosing Then
                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                        Return False
                                    End If
                                    OpenfrmError(oErrMsgMissingInput)
                                    Exit For
                                End If
                            Else
                                oMyInput = cmb.Text
                                MyValidationLogger.Debug($"inputvalue Combobox: {cmb.Text}")
                                Dim oValue
                                If oIndexName.StartsWith("[%VKT") Then
                                    oValue = ReturnVektor_IndexValue(oIndexName)
                                Else
                                    oValue = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                End If
                                If IsNothing(oValue) Then
                                    MyValidationLogger.Debug($"oValue is nothing...Value EmptyString will be used")
                                    oValue = String.Empty
                                End If
                                Dim oIndexType As String = "Index"
                                Try
                                    If oValue.ToString = "System.Object[]" Then
                                        oIndexType = "Vector"
                                    End If
                                Catch ex As Exception
                                    MyValidationLogger.Debug($"Exception while oValue.ToString = System.Object[]...")
                                End Try
                                If oIndexType = "Vector" Then
                                    MyValidationLogger.Debug($"Control with ID{oControlId} is a vectorfield...")
                                    If oValue.Length = 1 Then
                                        oValue = oValue(0).ToString
                                    Else
                                        MyValidationLogger.Info(" >> Vectorfield " & oIndexName & "' contains more then one value - First value will be used")
                                        oValue = oValue(0).ToString
                                    End If
                                Else
                                    MyValidationLogger.Debug($"oValue is a regular item...")
                                    Dim oitsadifference As Boolean = False
                                    Try
                                        If oValue.ToString <> oMyInput.ToString Then
                                            oitsadifference = True
                                        End If
                                    Catch ex As Exception
                                        MyValidationLogger.Warn($"⚠️ Could not convert the oValue of Control with ID{oControlId}...")
                                        MyValidationLogger.Error(ex.Message)
                                        oitsadifference = True
                                    End Try

                                    ' ========== FIX: Force-Reindex für ComboBox ==========
                                    If Not oitsadifference Then
                                        If _listForceReindex.Contains(oControl.Name) Then
                                            MyValidationLogger.Debug($"[CHECK_UPDATE] Force-Reindex aktiv für ComboBox [{oControl.Name}] → Wertvergleich übersprungen")
                                            _listForceReindex.Remove(oControl.Name)
                                            oitsadifference = True
                                        End If
                                    Else
                                        _listForceReindex.Remove(oControl.Name)
                                    End If
                                    ' ========== ENDE FIX ==========

                                    If oitsadifference = True Then
                                        MyValidationLogger.Debug($"Index with ID{oControlId} will now be indexed...")
                                        If oIndexName.StartsWith("[%VKT") Then
                                            oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                            If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing Combobox as VEKTOR - ERROR: " & idxerr_message
                                                MyValidationLogger.Warn(oErrMsgMissingInput)
                                                If _FormClosing Then
                                                    MyValidationLogger.Warn("Form closing - skip error dialog")
                                                    Return False
                                                End If
                                                OpenfrmError(oErrMsgMissingInput)
                                                Exit For
                                            End If
                                        Else
                                            If IDB_ACTIVE = False Then
                                                Dim result() As String
                                                ReDim Preserve result(0)
                                                result(0) = oMyInput
                                                If Indexiere_File(CURRENT_WMFILE, oIndexName, result) = False Then
                                                    cmb.DroppedDown = True
                                                    oMissing = True
                                                    oErrMsgMissingInput = "Error while indexing Combobox - ERROR: " & idxerr_message
                                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                                    If _FormClosing Then
                                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                                        Return False
                                                    End If
                                                    OpenfrmError(oErrMsgMissingInput)
                                                    Exit For
                                                End If
                                            Else
                                                If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                    cmb.DroppedDown = True
                                                    oMissing = True
                                                    oErrMsgMissingInput = "Error indexing combobox idb"
                                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                                    If _FormClosing Then
                                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                                        Return False
                                                    End If
                                                    OpenfrmError(oErrMsgMissingInput)
                                                    Exit For
                                                End If
                                            End If
                                            If IDB_ACTIVE = False Then
                                                If PROFIL_LOGINDEX <> "" Then
                                                    Dim ologStr = Return_LOGString(oMyInput, oValue, oIndexName)
                                                    WMIndexVectofield(ologStr, PROFIL_LOGINDEX)
                                                End If
                                            End If
                                        End If
                                    Else
                                        MyValidationLogger.Debug($"oitsadifference = False...Index with ID {oControlId} will not be indexed...")
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            Dim st As New StackTrace(True)
                            st = New StackTrace(ex, True)
                            MsgBox($"Unexpected error in Check_UpdateIndexe Combobox : ID{oControlId} " & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Error:")
                            MyValidationLogger.Info($"Unexpected error in Check_UpdateIndexe Combobox : ID{oControlId}" & ex.Message)
                            oMeta.IsDirty = False
                            Return False
                        End Try

                    Case oControl.GetType = GetType(DateTimePicker)
                        Try
                            Dim dtp As DateTimePicker = oControl
                            If oIsRequired = True And dtp.Value.ToString = String.Empty Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] DateTimePicker '{dtp.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = "Please Choose DateValue for field'" & dtp.Name & "'"
                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                    If _FormClosing Then
                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                        Return False
                                    End If
                                    OpenfrmError(oErrMsgMissingInput)
                                    Exit For
                                End If
                            ElseIf dtp.Value.ToString <> "01.01.0001 00:00:00" Then
                                oMyInput = CDate(dtp.Value)
                                Dim oObjectValue
                                If oIndexName.StartsWith("[%VKT") Then
                                    oObjectValue = ReturnVektor_IndexValue(oIndexName)
                                Else
                                    oObjectValue = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                End If
                                If IsNothing(oObjectValue) Or IsDBNull(oObjectValue) Then
                                    oObjectValue = CDate("01.01.1900")
                                End If

                                ' ========== FIX: Force-Reindex für DateTimePicker ==========
                                Dim bForceDTP As Boolean = _listForceReindex.Contains(oControl.Name)
                                If bForceDTP Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] Force-Reindex aktiv für DateTimePicker [{oControl.Name}] → Wertvergleich übersprungen")
                                    _listForceReindex.Remove(oControl.Name)
                                End If
                                ' ========== ENDE FIX ==========

                                If bForceDTP OrElse oObjectValue <> oMyInput Then
                                    If oIndexName.StartsWith("[%VKT") Then
                                        oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                        If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                            oMissing = True
                                            oErrMsgMissingInput = "Error while indexing DatePicker as VEKTOR - ERROR: " & idxerr_message
                                            MyValidationLogger.Warn(oErrMsgMissingInput)
                                            If _FormClosing Then
                                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                                Return False
                                            End If
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    Else
                                        If IDB_ACTIVE = False Then
                                            Dim result()
                                            ReDim Preserve result(0)
                                            result(0) = CDate(oMyInput)
                                            If Indexiere_File(CURRENT_WMFILE, oIndexName, result) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing DatePicker- ERROR: " & idxerr_message
                                                MyValidationLogger.Warn(oErrMsgMissingInput)
                                                If _FormClosing Then
                                                    MyValidationLogger.Warn("Form closing - skip error dialog")
                                                    Return False
                                                End If
                                                OpenfrmError(oErrMsgMissingInput)
                                                Exit For
                                            End If
                                        Else
                                            If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error indexing datepicker idb"
                                                MyValidationLogger.Warn(oErrMsgMissingInput)
                                                If _FormClosing Then
                                                    MyValidationLogger.Warn("Form closing - skip error dialog")
                                                    Return False
                                                End If
                                                OpenfrmError(oErrMsgMissingInput)
                                                Exit For
                                            End If
                                        End If
                                        If IDB_ACTIVE = False Then
                                            If PROFIL_LOGINDEX <> "" Then
                                                Dim oLogstr = Return_LOGString(oMyInput, oObjectValue, oIndexName)
                                                WMIndexVectofield(oLogstr, PROFIL_LOGINDEX)
                                            End If
                                        End If
                                    End If
                                Else
                                    MyValidationLogger.Debug("Value WD ('" & oObjectValue.ToString & "') = Input-value ('" & oMyInput.ToString & "')")
                                End If
                            Else
                                MyValidationLogger.Debug("DateValue is 01.01.0001 00:00:00")
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            oMeta.IsDirty = False
                        End Try

                    Case oControl.GetType = GetType(CheckBox)
                        Try
                            Dim chk As CheckBox = oControl
                            oMyInput = chk.Checked.ToString

                            If chk.CheckState = CheckState.Indeterminate And oIsRequired = True Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] CheckBox '{chk.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = "Please set Checkbox value for field '" & chk.Name & "'"
                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                    If _FormClosing Then
                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                        Return False
                                    End If
                                    OpenfrmError(oErrMsgMissingInput)
                                    Exit For
                                End If
                            End If

                            Dim WertWD As String
                            Dim oBoolValue As Boolean
                            If oIndexName.StartsWith("[%VKT") Then
                                WertWD = ReturnVektor_IndexValue(oIndexName)
                                If WertWD = "" Then
                                    oBoolValue = False
                                Else
                                    oBoolValue = CBool(WertWD)
                                End If
                            Else
                                Dim _Value
                                Dim oObjectCheck = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                If IsNothing(oObjectCheck) Or IsDBNull(oObjectCheck) Then
                                    oBoolValue = False
                                Else
                                    If oObjectCheck.ToString = "System.Object[]" Then
                                        If oObjectCheck.Length = 1 Then
                                            _Value = oObjectCheck(0)
                                        Else
                                            MyValidationLogger.Info(" >> Vectorfield " & oIndexName & "' contains more then one value - First value will be used")
                                            _Value = oObjectCheck(0)
                                        End If
                                    Else
                                        _Value = oObjectCheck
                                    End If
                                    oBoolValue = CBool(_Value)
                                End If
                            End If

                            ' ========== FIX: Force-Reindex für CheckBox ==========
                            Dim bForceChk As Boolean = _listForceReindex.Contains(oControl.Name)
                            If bForceChk Then
                                MyValidationLogger.Debug($"[CHECK_UPDATE] Force-Reindex aktiv für CheckBox [{oControl.Name}] → Wertvergleich übersprungen")
                                _listForceReindex.Remove(oControl.Name)
                            End If
                            ' ========== ENDE FIX ==========

                            If bForceChk OrElse oBoolValue <> chk.Checked Then
                                Dim result() As String
                                ReDim Preserve result(0)
                                If chk.Checked Then
                                    result(0) = 1
                                Else
                                    result(0) = 0
                                End If

                                If oIndexName.StartsWith("[%VKT") Then
                                    oMyInput = Return_PM_VEKTOR(chk.Checked.ToString, oIndexName)
                                    If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                        oMissing = True
                                        oErrMsgMissingInput = "Error while indexing Checkbox as VEKTOR - ERROR: " & idxerr_message
                                        MyValidationLogger.Warn(oErrMsgMissingInput)
                                        If _FormClosing Then
                                            MyValidationLogger.Warn("Form closing - skip error dialog")
                                            Return False
                                        End If
                                        OpenfrmError(oErrMsgMissingInput)
                                        Exit For
                                    End If
                                Else
                                    If IDB_ACTIVE = False Then
                                        If Indexiere_File(CURRENT_WMFILE, oIndexName, result) = False Then
                                            oMissing = True
                                            oErrMsgMissingInput = "Error while indexing Checkbox - ERROR: " & idxerr_message
                                            MyValidationLogger.Warn(oErrMsgMissingInput)
                                            If _FormClosing Then
                                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                                Return False
                                            End If
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    Else
                                        If IDBData.SetVariableValue(oIndexName, chk.Checked.ToString) Then
                                            oErrMsgMissingInput = "error indexing checkbox idb"
                                            If _FormClosing Then
                                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                                Return False
                                            End If
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    End If
                                    If IDB_ACTIVE = False Then
                                        If PROFIL_LOGINDEX <> "" Then
                                            Dim oLogstr = Return_LOGString(CBool(result(0)).ToString, WertWD, oIndexName)
                                            WMIndexVectofield(oLogstr, PROFIL_LOGINDEX)
                                        End If
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            oMeta.IsDirty = False
                        End Try

                    Case oControl.GetType = GetType(DataGridView)
                        Try
                            Dim dgv As DataGridView = oControl
                            Dim Zeilen As Integer = 0
                            For Each row As DataGridViewRow In dgv.Rows
                                Dim exists = False
                                If row.Cells(0).Value Is Nothing = False Then
                                    Zeilen += 1
                                End If
                            Next
                            If oIsRequired = True And Zeilen = 0 Then
                                If pRegularComplete = False Then
                                    MyValidationLogger.Debug($"[CHECK_UPDATE] DataGridView '{dgv.Name}' is required but has no selection. Skipping due to pRegularComplete=False.")
                                    Continue For
                                Else
                                    oMissing = True
                                    oErrMsgMissingInput = "Fehlende Eingabe in Vektorfeld '" & dgv.Name & "'"
                                    MyValidationLogger.Warn(oErrMsgMissingInput)
                                    If _FormClosing Then
                                        MyValidationLogger.Warn("Form closing - skip error dialog")
                                        Return False
                                    End If
                                    OpenfrmError(oErrMsgMissingInput)
                                    Exit For
                                End If
                            ElseIf Zeilen > 0 Then
                                Dim ZeilenGrid As Integer = 0
                                Dim myVektorArr As String()
                                For Each row As DataGridViewRow In dgv.Rows
                                    Dim exists = False
                                    Select Case oControlType
                                        Case "TABLE"
                                            Dim str As String
                                            If row.Cells(0).Value Is Nothing = False Then
                                                ReDim Preserve myVektorArr(ZeilenGrid)
                                                For i = 0 To row.Cells.Count - 1
                                                    Select Case i
                                                        Case 0
                                                            str = row.Cells(i).Value
                                                        Case Else
                                                            str = str & PMDelimiter & row.Cells(i).Value
                                                    End Select
                                                Next
                                                myVektorArr(ZeilenGrid) = str
                                                ZeilenGrid += 1
                                            End If
                                        Case Else
                                            If row.Cells(0).Value Is Nothing = False Then
                                                ReDim Preserve myVektorArr(ZeilenGrid)
                                                myVektorArr(ZeilenGrid) = row.Cells(0).Value.ToString
                                                ZeilenGrid += 1
                                            End If
                                    End Select
                                Next
                                If IDB_ACTIVE = False Then
                                    If Indexiere_File(CURRENT_WMFILE, oIndexName, myVektorArr) = False Then
                                        oMissing = True
                                        oErrMsgMissingInput = "Error while indexing Vektorfeld - ERROR: " & idxerr_message
                                        MyValidationLogger.Warn(oErrMsgMissingInput)
                                        If _FormClosing Then
                                            MyValidationLogger.Warn("Form closing - skip error dialog")
                                            Return False
                                        End If
                                        OpenfrmError(oErrMsgMissingInput)
                                        Exit For
                                    End If
                                Else
                                    Dim oDT As DataTable = DT_FOR_ARRAY(myVektorArr)
                                    If oDT.Rows.Count > 0 Then
                                        If IDBData.SetVariableValue(oIndexName, oDT, True) = False Then
                                            oMissing = True
                                            oErrMsgMissingInput = "Error indexing Datagridview idb"
                                            MyValidationLogger.Warn(oErrMsgMissingInput)
                                            If _FormClosing Then
                                                MyValidationLogger.Warn("Form closing - skip error dialog")
                                                Return False
                                            End If
                                            OpenfrmError(oErrMsgMissingInput)
                                            Exit For
                                        End If
                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            MyValidationLogger.Error(ex)
                            oMeta.IsDirty = False
                        End Try

                    Case oControl.GetType = GetType(GridControl)
                        ' GridControl: kein Force-Reindex nötig – wird immer vollständig indexiert
                        Dim oGrid As GridControl = oControl
                        MyValidationLogger.Debug($"[4] GridControl-Case erreicht: [{oGrid.Name}]")

                        CleanupDeletedRows(oGrid)

                        Dim oSettings = New ControlSettings() With {
                        .IndexName = oIndexName,
                        .ControlType = GetType(GridControl).ToString,
                        .Name = oControlName,
                        .IsRequired = oIsRequired,
                        .IDBAttributeType = oIDBTyp
                    }
                        Dim oGridColumnDefinition As DataTable = DT_COLUMNS_GRID.Clone()
                        Dim oExpression = $"CONTROL_ID = {oControlRow.Item("GUID")}"
                        DT_COLUMNS_GRID.Select(oExpression, "SEQUENCE").CopyToDataTable(oGridColumnDefinition, LoadOption.PreserveChanges)

                        Dim oResult = ValidateGridControl(oGrid, oSettings, oGridColumnDefinition, oMissing, oErrMsgMissingInput)
                        If oResult = False Then
                            MyValidationLogger.Warn($"⚠️ Validierung fehlgeschlagen für Grid [{oGrid.Name}] → Exit For")
                            Exit For
                        End If

                End Select

                ' ========== NEU: Dirty-Flag nach erfolgreicher Indexierung zurücksetzen ==========
                oMeta.IsDirty = False

            Next ' End For Each oControl

            ' ========== TEIL 2: Separate Grids aus Cache verarbeiten ==========
            ' Nach dem Ende der "For Each oControl As Control In Me.PanelValidatorControl.Controls" Schleife

            If _separateGridControlCache.Count > 0 Then
                MyValidationLogger?.Debug($"Verarbeite {_separateGridControlCache.Count} separate Grid(s) aus Cache")

                For Each kvp As KeyValuePair(Of String, GridControl) In _separateGridControlCache
                    Dim controlName As String = kvp.Key
                    Dim oGrid As GridControl = kvp.Value

                    ' Nur verarbeiten, wenn Control als "dirty" markiert ist
                    If Not listofControls.Contains(controlName) Then
                        MyValidationLogger?.Debug($"Separate Grid '{controlName}' wurde nicht geändert - überspringe")
                        Continue For
                    End If

                    MyValidationLogger?.Debug($"[4] Separates GridControl verarbeiten: [{controlName}]")

                    ' Control-Metadaten holen (EXAKT wie bei normalem Grid)
                    Dim oControlRow As DataRow = GetControlMetaBySql($"NAME='{controlName}'").Rows(0)
                    Dim oGUID = oControlRow("GUID")
                    Dim oControlRow1 = (From form In DTVWCONTROL_INDEX.AsEnumerable()
                                        Where form.Item("GUID") = oGUID).SingleOrDefault()
                    Dim oIndexName As String = If(IsDBNull(oControlRow1("INDEX_NAME")), "", oControlRow1("INDEX_NAME").ToString())
                    Dim oIsRequired As Boolean = True
                    Dim oIDBTyp As Integer = If(IsDBNull(oControlRow1("IDB_TYP")), 0, CInt(oControlRow1("IDB_TYP")))

                    ' Cleanup (wie bei normalem Grid)
                    CleanupDeletedRows(oGrid)

                    ' Settings erstellen (EXAKT wie bei normalem Grid)
                    Dim oSettings = New ControlSettings() With {
        .IndexName = oIndexName,
        .ControlType = GetType(GridControl).ToString,
        .Name = controlName,
        .IsRequired = oIsRequired,
        .IDBAttributeType = oIDBTyp
    }

                    ' Spalten-Definition holen (EXAKT wie bei normalem Grid)
                    Dim oGridColumnDefinition As DataTable = DT_COLUMNS_GRID.Clone()
                    Dim oExpression = $"CONTROL_ID = {oGUID}"
                    Dim selectedRows() As DataRow = DT_COLUMNS_GRID.Select(oExpression, "SEQUENCE")

                    If selectedRows.Length > 0 Then
                        selectedRows.CopyToDataTable(oGridColumnDefinition, LoadOption.PreserveChanges)
                    End If

                    ' WICHTIG: DEINE BESTEHENDE ValidateGridControl Funktion verwenden!
                    Dim oResult = ValidateGridControl(oGrid, oSettings, oGridColumnDefinition, oMissing, oErrMsgMissingInput)

                    If oResult = False Then
                        MyValidationLogger?.Warn($"⚠️ Validierung fehlgeschlagen für separates Grid [{controlName}] → Exit For")
                        Exit For
                    End If
                Next
            End If


            ' ========== BATCH: Gesammelte Statements abfeuern ==========
            If IDB_ACTIVE Then
                If oMissing = False Then
                    If Not IDBData.CommitBatch() Then
                        MyValidationLogger.Warn("CommitBatch failed in Check_UpdateIndexe")
                        oMissing = True
                    End If
                Else
                    IDBData.RollbackBatch()
                End If
            End If
            ' ========== ENDE BATCH ==========

            If oMissing = True Then
                MyValidationLogger.Warn("⚠️ Check_UpdateIndexe: ERROR or Missing Indexing - returning False")
                Return False
            Else
                MyValidationLogger.Debug("Check_UpdateIndexe: Everything OK - returning True")
                Return True
            End If

        Catch ex As Exception
            MyValidationLogger.Warn($"⚠️ Unexpected error in Check_UpdateIndexe - ControlID: {oControlId},{oControlName}")
            MyValidationLogger.Error(ex)
            Dim st As New StackTrace(ex, True)
            MsgBox($"Unexpected error in Check_UpdateIndexe ControlID,Name: {oControlId},{oControlName}" & vbCrLf & ex.Message & vbCrLf & "Line: " & st.GetFrame(0).GetFileLineNumber().ToString, MsgBoxStyle.Critical, "Error:")
            MyValidationLogger.Info("Unexpected error in Check_UpdateIndexe:" & ex.Message & " - Line: " & st.GetFrame(0).GetFileLineNumber().ToString, True)
            Return False
        End Try

    End Function

    Sub OpenfrmError(pErrormessage As String)
        ' ========== FIX: Verhindere mehrfache Dialoge ==========
        If _isShowingErrorDialog Then
            MyValidationLogger.Warn("⚠️ [OpenfrmError] Dialog bereits offen → Exit Sub")
            Return
        End If
        _isShowingErrorDialog = True
        CloseOverlaySafe()

        ' 2. Events blockieren
        _suppressLookupEvents = True
        Try
            Using ofrm As New frmError With {.ValidatorError = pErrormessage}
                ofrm.ShowDialog(Me)
            End Using
        Finally
            _suppressLookupEvents = False
            ' ========== FIX: Guard zurücksetzen ==========
            _isShowingErrorDialog = False
            ' ========== ENDE FIX ==========
        End Try
    End Sub
    Private Class ControlSettings
        Public Name As String
        Public IsRequired As Boolean
        Public IndexName As String
        Public ControlType As String
        Public IDBAttributeType As Integer
    End Class

    Private Function ValidateGridControl(pGrid As GridControl, pSettings As ControlSettings, pColumnDefinition As DataTable, ByRef pMissing As Boolean, ByRef pMissingMessage As String) As Boolean
        Try
            Dim oRowCount As Integer = pGrid.DataSource.Rows.Count

            MyValidationLogger.Debug("Grid Row Count: [{0}]", oRowCount)

            'Wenn kein Wert ausgewählt wurde und der Index aber gesetzt werden muss
            If pSettings.IsRequired = True And oRowCount = 0 Then
                pMissing = True
                ' ========== NEU: Liste der Required-Spalten sammeln ==========
                Dim requiredColumns = pColumnDefinition.AsEnumerable().
                Where(Function(row) row.ItemEx("VALIDATION", False) = True).
                Select(Function(row) row.ItemEx("SPALTEN_HEADER_LANG", row.ItemEx("SPALTENNAME", "")).ToString()).
                Where(Function(colName) Not String.IsNullOrWhiteSpace(colName)).
                ToList()

                If requiredColumns.Count > 0 Then
                    pMissingMessage = $"Missing input in table '{pGrid.Name}'. At least on row with following required fields necessary: {String.Join(", ", requiredColumns)}"
                Else
                    pMissingMessage = $"Missing input in table  '{pGrid.Name}' - at least one row necessary"
                End If
                ' ========== ENDE NEU ==========
                pGrid.BackColor = Color.Red
                MyValidationLogger.Warn(pMissingMessage)

                'Exit For
                Return False

            End If

            If oRowCount > 0 Then

                Dim oView As GridView = pGrid.FocusedView
                Dim oDatasource As DataTable = pGrid.DataSource
                Dim oRowIndex As Integer = 0

                For Each oRow As DataRow In oDatasource.Rows
                    For Each oColumn As DataColumn In oRow.Table.Columns

                        Dim oValue = oRow.ItemEx(oColumn.ColumnName, "")
                        Dim oDefinition = pColumnDefinition.AsEnumerable().
                            Where(Function(row) row.Item("SPALTENNAME") = oColumn.ColumnName).
                            FirstOrDefault()

                        If oDefinition IsNot Nothing Then
                            Dim oIsRequired = oDefinition.Item("VALIDATION")

                            If oIsRequired = True And oValue = String.Empty Then

                                ' Translates the visible row index into the internal rowhandle
                                ' they might be different because of sorting
                                Dim oRowHandle = oView.GetRowHandle(oRowIndex)

                                oView.FocusedRowHandle = oRowHandle
                                oView.FocusedColumn = oView.Columns.Item(oColumn.ColumnName)

                                pMissing = True
                                pMissingMessage = $"Fehlende Eingabe in Tabelle '{pGrid.Name}' in Spalte '{oDefinition.Item("SPALTEN_HEADER_LANG")}', Zeile '{oRowHandle + 1}'"
                                MyValidationLogger.Warn(pMissingMessage)
                                Return False
                            End If
                        End If
                    Next

                    oRowIndex += 1
                Next

                Dim ZeilenGrid As Integer = 0
                Dim myVektorArr As String()
                'Jeden Werte des Datagridviews durchlaufen
                For Each oRow As DataRow In pGrid.DataSource.Rows
                    ' ========== NEU: Sicherheits-Guard für Deleted/Detached ==========
                    If oRow.RowState = DataRowState.Deleted OrElse oRow.RowState = DataRowState.Detached Then
                        MyValidationLogger.Debug($"Grid [{pSettings.Name}]: Überspringe Zeile mit RowState={oRow.RowState}")
                        Continue For
                    End If
                    ' ========== ENDE NEU ==========
                    Dim exists = False
                    Select Case pSettings.ControlType
                        Case "DevExpress.XtraGrid.GridControl" '"TABLE"
                            Dim oRowValue = oRow.Item(0)
                            If IsNothing(oRowValue) Then
                                oRowValue = String.Empty
                            ElseIf IsDBNull(oRowValue) Then
                                oRowValue = String.Empty
                            End If
                            ' MsgBox(row.Cells(0).Value.GetType.ToString)
                            Dim str As String = String.Empty
                            'If oRowValue <> String.Empty Then
                            'Das Array anpassen
                            ReDim Preserve myVektorArr(ZeilenGrid)

                            Dim oValueList As New List(Of String)

                            For Each item As Object In oRow.ItemArray
                                Dim normalized As Object = ObjectEx.NotNull(item, String.Empty)
                                If TypeOf normalized Is IFormattable AndAlso Not TypeOf normalized Is String Then
                                    Dim provider As IFormatProvider =
                                        If(TypeOf normalized Is Decimal OrElse
                                           TypeOf normalized Is Double OrElse
                                           TypeOf normalized Is Single,
                                           CultureInfo.CurrentCulture,
                                           CultureInfo.InvariantCulture)
                                    MyValidationLogger.Debug("Normalizing value [{0}]", normalized.ToString)

                                    normalized = DirectCast(normalized, IFormattable).ToString(Nothing, provider)
                                End If

                                oValueList.Add(normalized)
                            Next

                            str = String.Join(PMDelimiter, oValueList.ToArray)

                            ' 22.10.2021 Attempt at fixing empty lines appearing in indexes
                            MyValidationLogger.Debug("Grid Value before saving: [{0}]", str)
                            If str.Trim.Length = 0 Or str.Trim.Replace(PMDelimiter, "").Length = 0 Then
                                MyValidationLogger.Debug("Empty line in Grid [{0}]. Skipping.", pSettings.Name)
                                Continue For
                            End If

                            'Den Wert im Array speichern
                            myVektorArr(ZeilenGrid) = str
                            ZeilenGrid += 1
                            'End If
                        Case Else
                            ' MsgBox(row.Cells(0).Value.GetType.ToString)
                            If oRow.Item(0) Is Nothing = False Then
                                'Das Array anpassen
                                ReDim Preserve myVektorArr(ZeilenGrid)
                                'Den Wert im Array speichern
                                myVektorArr(ZeilenGrid) = oRow.Item(0).Value.ToString
                                ZeilenGrid += 1
                            End If
                    End Select

                Next


                If IDB_ACTIVE = False Then
                    If Indexiere_File(CURRENT_WMFILE, pSettings.IndexName, myVektorArr) = False Then
                        pMissing = True
                        pMissingMessage = $"Error while indexing table (1) {pGrid.Name} - ERROR: " & idxerr_message
                        MyValidationLogger.Warn(pMissingMessage)
                        'Exit For
                        Return False
                    End If
                Else
                    Dim oMyDT = DT_FOR_ARRAY(myVektorArr)
                    If oMyDT.Rows.Count > 0 Then
                        If IDBData.SetVariableValue(pSettings.IndexName, oMyDT, True, pSettings.IDBAttributeType) = False Then
                            pMissing = True
                            pMissingMessage = $"Error while indexing table IDB (1) {pGrid.Name} - ERROR: " & idxerr_message
                            MyValidationLogger.Warn(pMissingMessage)
                            'Exit For
                            Return False
                        End If
                    End If
                End If


            Else ' Row Count = 0

                Dim oValue As New List(Of Object) From {String.Empty}

                If IDB_ACTIVE = False Then
                    If Indexiere_File(CURRENT_WMFILE, pSettings.IndexName, oValue.ToArray) = False Then
                        pMissing = True
                        pMissingMessage = $"Error while indexing table (2) {pGrid.Name} - ERROR: " & idxerr_message
                        MyValidationLogger.Warn(pMissingMessage)
                        Return False
                    End If
                Else
                    Dim oOldAttributeResult = IDBData.GetVariableValue(pSettings.IndexName, pSettings.IDBAttributeType)
                    Dim oTypeOldResult = oOldAttributeResult.GetType.ToString
                    If oTypeOldResult = "System.Data.DataTable" Then
                        Dim oDT As DataTable = IDBData.GetVariableValue(pSettings.IndexName, pSettings.IDBAttributeType)
                        If oDT.Rows.Count > 0 Then
                            MyValidationLogger.Debug("User cleared the grid, so data needs to be erased!")
                            IDBData.Delete_AttributeData(CURRENT_DOC_ID, pSettings.IndexName)
                        End If
                    Else
                        MyValidationLogger.Debug("(String) User cleared the grid, so data needs to be erased!")
                        IDBData.Delete_AttributeData(CURRENT_DOC_ID, pSettings.IndexName)
                    End If
                End If

            End If

            Return True
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            Return False
        End Try
    End Function


    Private Function Indexiere_File(_dok As WINDREAMLib.WMObject, pIndexName As String, pIndexValues As Object) As Boolean
        Dim File_indexiert As Boolean = False
        idxerr_message = ""
        Try
            'Die Arrays vorbereiten
            Dim arrIndex() As String = Nothing
            Dim arrValue() As String = Nothing
            arrIndex = Nothing
            arrValue = Nothing
            'Den Indexnamen übergeben
            ReDim Preserve arrIndex(0)
            arrIndex(0) = pIndexName
            'Das Array der Idnexwerte überprüfen
            If pIndexValues Is Nothing = False Then
                If pIndexValues.Length() > 1 Then
                    MyValidationLogger.Debug("Indexing Index '" & pIndexName & "' with Arrayvalue")

                    For Each oValue In pIndexValues
                        Try
                            MyValidationLogger.Debug("Current Index Value for [{0}] is [{1}]", pIndexName, oValue)
                        Catch ex As Exception
                            MyValidationLogger.Debug("Current Index Value for [{0}] could not be read!", pIndexName)
                        End Try
                    Next

                    Dim anzahl As Integer = 0
                    For Each indexvalue As String In pIndexValues
                        ReDim Preserve arrValue(anzahl)
                        arrValue(anzahl) = indexvalue
                        anzahl += 1
                    Next
                Else
                    MyValidationLogger.Debug("Indexing Index '" & pIndexName & "' with value '" & pIndexValues(0) & "'")
                    ReDim Preserve arrValue(0)
                    arrValue(0) = pIndexValues(0).ToString
                End If
                'Jetzt das eigentliche Indexieren der Datei
                'File_indexiert = Me._windreamPM.RunIndexing(_dok, arrIndex, arrValue)
                File_indexiert = WINDREAM.RunIndexing(_dok, arrIndex, arrValue)
                Return File_indexiert
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            idxerr_message = "Unexpected error in Indexiere_File: " & ex.Message.ToString
            MyValidationLogger.Info("Unexpected error in Indexiere_File: " & ex.Message.ToString, True)
            Return False
        End Try
    End Function

    Private Sub btnfinal_Click(sender As System.Object, e As System.EventArgs)
        Finish_WFStep()
    End Sub

    Sub Datei_ueberspringen()
        ShowOverlaySafe()

        Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing)
        Dim perfLastCheck As DateTime = perfStart
        If LOG_HOTSPOTS Then
            ' ========== DIAGNOSE START ==========
            MyValidationLogger.Info($"[INFO] Datei_ueberspringen START")
            MyValidationLogger.Info($"   frmValidator.IsDisposed: {Me.IsDisposed}")
            MyValidationLogger.Info($"   CURRENT_DOC_GUID: {CURRENT_DOC_GUID}")
            ' ========== ENDE DIAGNOSE ==========
        End If
        If LOG_HOTSPOTS Then MyValidationLogger.Info("[PERF] Datei_ueberspringen START")

        Try
            MyValidationLogger.Debug("Skipping document....(Datei_ueberspringen)")
            PRTF_PROFILE_FILES_WORK("FreeFile")
            Dim oSQL = $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{DocPathWindows}',{CURRENT_DOC_GUID};"
            If LOG_HOTSPOTS Then
                ' ========== DIAGNOSE: Vor DB-Execute ==========
                MyValidationLogger.Info($"[INFO] Führe DB-UPDATE aus...")
                MyValidationLogger.Info($"   VOR DB: frmValidator.IsDisposed: {Me.IsDisposed}")
                ' ========== ENDE DIAGNOSE ==========
            End If
            DatabaseFallback.ExecuteNonQueryECM(oSQL)


            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"   NACH DB: frmValidator.IsDisposed: {Me.IsDisposed}")
                MyValidationLogger.Info($"[PERF] Nach UPDATE+PRPM_FILES_NOT_INDEXED: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
            End If

            MyValidationLogger.Debug($"Skipped DocGUID {CURRENT_DOC_GUID}")
            If LOG_HOTSPOTS Then
                ' ========== DIAGNOSE: Vor Load_Next_Document ==========
                MyValidationLogger.Info($"[INFO] Rufe Load_Next_Document auf...")
                MyValidationLogger.Info($"   VOR: frmValidator.IsDisposed: {Me.IsDisposed}")
                ' ========== ENDE DIAGNOSE ==========
            End If

            Load_Next_Document(False)

            If LOG_HOTSPOTS Then
                ' ========== DIAGNOSE: Nach Load_Next_Document ==========
                MyValidationLogger.Info($"   NACH: frmValidator.IsDisposed: {Me.IsDisposed}")
                MyValidationLogger.Info($"   NACH: frmValidator.Visible: {Me.Visible}")
                ' ========== ENDE DIAGNOSE ==========
                MyValidationLogger.Info($"[PERF] Nach Load_Next_Document: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("Fehler bei Überspringen:" & vbcrlf & ex.Message, MsgBoxStyle.Critical)
        Finally

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Datei_ueberspringen GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")

                ' ========== DIAGNOSE ENDE ==========
                MyValidationLogger.Info($"[INFO] Datei_ueberspringen ENDE")
                MyValidationLogger.Info($"   frmValidator.IsDisposed: {Me.IsDisposed}")
                ' ========== ENDE DIAGNOSE ==========
            End If
            CloseOverlaySafe()

        End Try
    End Sub
    Private Function PRTF_PROFILE_FILES_WORK(ByVal pMode As String) As Boolean
        Try
            If CURRENT_DOC_ID <> 0 Then
                Dim sql = $"EXEC PRTF_PROFILE_FILES_WORK {CURRENT_DOC_ID},{CURRENT_ProfilGUID},{USER_ID},'{pMode}'"
                Return DatabaseFallback.ExecuteNonQueryECM(sql)
            Else
                Return False
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            Return False
        End Try
    End Function
    Private Sub delete_active_File()
        Try
            Dim result As MsgBoxResult
            result = MessageBox.Show("Sind Sie sicher dass Sie dieses Dokument unwiderruflich löschen wollen?" & vbcrlf & "Danach wird die nächste Datei angezeigt!", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
            If result = MsgBoxResult.Yes Then
                Try
                    If Not IsNothing(DocumentViewer1) Then
                        DocumentViewer1.CloseDocument()
                        DocumentViewer1.Done()
                    End If

                Catch ex As Exception
                    MyValidationLogger.Warn($"⚠️ Unexpected error in delete_active_File DocumentViewerValidator.Done: {ex.Message}")
                End Try
                Thread.Sleep(500)
                Application.DoEvents()
                FreeFile()
                'Aus der Tabelle löschen
                Dim oDelete = $"DELETE FROM TBPM_PROFILE_FILES WHERE GUID = {CURRENT_DOC_GUID}"
                If DatabaseFallback.ExecuteNonQueryECM(oDelete) = True Then
                    Dim oDeleteResult As Boolean = False
                    If IDB_ACTIVE = False Then
                        oDeleteResult = Delete_WMFile()
                    End If
                    If oDeleteResult = True Then
                        Load_Next_Document(False)
                    End If

                End If
            End If
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("Fehler bei Löschen windream-Datei:" & vbcrlf & ex.Message, MsgBoxStyle.Critical)
        End Try

    End Sub
    Private Function Delete_WMFile()
        Try
            If CURRENT_WMFILE Is Nothing = False Then
                'Close_document_viewer()
                'Me.PdfViewer1.DocumentFilePath = ""
                Try
                    If CURRENT_WMFILE.aLocked Then
                        ' unlock the windream object
                        CURRENT_WMFILE.unlock()
                        MyValidationLogger.Debug("## Delete_WMFile WMFile unlocked! ##")
                    End If
                    Try
                        CURRENT_WMFILE.Delete()
                        MyValidationLogger.Info("Manual deleting of file [" & CURRENT_WMFILE.aName & "] successfull!")
                        Return True
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Could not delete via windream-function - ERROR: [{ex.Message}] {vbcrlf} Trying system.io...")
                        Try
                            Try
                                CURRENT_WMFILE.unlock()
                            Catch exul As Exception
                                MyValidationLogger.Warn($"⚠️ Could not unlock WMFile - ERROR: [{exul.Message}] - now teh system.io.Delete...")
                            End Try
                            File.Delete(WMDocPathWindows)
                            MyValidationLogger.Info("Deleting of file via system.io [" & WMDocPathWindows & "] successfull!")
                            WMDocPathWindows = ""
                            CURRENT_DOC_PATH = ""
                            CURRENT_WMFILE = Nothing
                            Return True
                        Catch ex1 As Exception
                            MyValidationLogger.Warn($"⚠️ Could not delete via System.IO - ERROR: [{ex1.Message}] {vbcrlf} Trying system.io...")
                            Return False
                        End Try

                    End Try
                Catch ex As Exception
                    MyValidationLogger.Error(ex)
                    MsgBox("Das windream-Objekt konnte nicht gelöscht werden!" & vbcrlf & vbcrlf & "Fehlermeldung:" & vbcrlf & ex.Message, MsgBoxStyle.Critical)
                    MyValidationLogger.Info(" windream-Objekt konnte nicht gelöscht werden - Fehlermeldung: " & ex.Message, True)
                    Return False
                End Try
            End If
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Fehler bei Delete_File")
            MyValidationLogger.Info(">> Fehlermeldung: " & ex.Message)
            Return False
        End Try
    End Function
    Private Const SEE_MASK_INVOKEIDLIST = &HC
    Private Const SEE_MASK_NOCLOSEPROCESS = &H40
    Private Const SEE_MASK_FLAG_NO_UI = &H400
    Public Const SW_SHOW As Short = 5

    <DllImport("Shell32", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function ShellExecuteEx(ByRef lpExecInfo As SHELLEXECUTEINFO) As Boolean
    End Function
    Public Structure SHELLEXECUTEINFO
        Public cbSize As Integer
        Public fMask As Integer
        Public hwnd As IntPtr
        <MarshalAs(UnmanagedType.LPTStr)> Public lpVerb As String
        <MarshalAs(UnmanagedType.LPTStr)> Public lpFile As String
        <MarshalAs(UnmanagedType.LPTStr)> Public lpParameters As String
        <MarshalAs(UnmanagedType.LPTStr)> Public lpDirectory As String
        Dim nShow As Integer
        Dim hInstApp As IntPtr
        Dim lpIDList As IntPtr
        <MarshalAs(UnmanagedType.LPTStr)> Public lpClass As String
        Public hkeyClass As IntPtr
        Public dwHotKey As Integer
        Public hIcon As IntPtr
        Public hProcess As IntPtr
    End Structure
    Private Sub frmValidation_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
        If DocPathWindows Is Nothing = False Then
            My.Settings.frmValidatorSize = Me.Size
            My.Settings.Save()
        End If
    End Sub

    Private Sub Splitter1_LocationChanged(sender As Object, e As EventArgs)
        My.Settings.Save()
    End Sub

    Private Sub frmValidator_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
        If e.KeyCode = Keys.F4 Then
            ' FIX: Grid-Validierung auch bei F4 (analog zu bbtniNext_ItemClick)
            If ForceGridValidation() = True Then
                Datei_ueberspringen()
            End If
        ElseIf e.KeyCode = Keys.F2 Then
            If USER_GHOST_MODE_ACTIVE Then
                Exit Sub
            End If

            btnSave.Enabled = False
            Try
                If ForceGridValidation() = True Then
                    ShowOverlaySafe()
                    Try
                        Finish_WFStep()
                    Finally
                        CloseOverlaySafe()
                    End Try
                End If
            Finally
                If Not _FormClosing AndAlso Not Me.IsDisposed Then
                    btnSave.Enabled = True
                End If
            End Try
        End If

    End Sub


    Private Sub frmValidator_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        If _FormLoaded = False Then
            Exit Sub
        End If

        If WindowState = FormWindowState.Maximized Then
            My.Settings.frmValidatorWindowState = "Maximized"
        ElseIf WindowState = FormWindowState.Normal Then
            My.Settings.frmValidatorWindowState = "Normal"
        End If
        My.Settings.Save()
    End Sub
    Private Sub btnSave_MouseHover(sender As Object, e As EventArgs)
        ToolTip1.Show(Translation_Strings.F2_für_Speichern, btnSave)
    End Sub

    Sub Reload_Controls(SingleAttribute As String)
        If IDB_ACTIVE = True Then
            Load_IDB_DOC_DATA()
        End If
        FillIndexValues(False)
    End Sub

    Sub SetStatusLabel(infotext As String, Optional pColor As String = "")
        bsiInformation.Caption = infotext & " " & Now.ToString
        If pColor <> String.Empty Then
            Try
                bsiInformation.ItemAppearance.Normal.BackColor = Color.FromName(pColor)
                bsiInformation.ItemAppearance.Normal.ForeColor = GraphicsEx.GetContrastedColor(Color.FromName(pColor))
            Catch ex As Exception
                bsiInformation.ItemAppearance.Normal.BackColor = Color.Transparent
                bsiInformation.ItemAppearance.Normal.ForeColor = Color.Black
            End Try

        Else
            bsiInformation.ItemAppearance.Normal.BackColor = Color.Transparent
            bsiInformation.ItemAppearance.Normal.ForeColor = Color.Black
        End If
    End Sub

    Private Sub BarButtonItem3_ItemClick(sender As Object, e As ItemClickEventArgs) Handles BarButtonItem3.ItemClick
        frmFileInfo.ShowDialog()
    End Sub

    Private Sub BarButtonItem4_ItemClick(sender As Object, e As ItemClickEventArgs) Handles BarButtonItem4.ItemClick
        If DocPathWindows <> "" Then
            Try
                Cursor = Cursors.WaitCursor
                Dim oShellExecuteInfo As New SHELLEXECUTEINFO
                oShellExecuteInfo.cbSize = Marshal.SizeOf(oShellExecuteInfo)
                oShellExecuteInfo.lpVerb = "properties"
                oShellExecuteInfo.lpFile = DocPathWindows
                oShellExecuteInfo.nShow = SW_SHOW
                oShellExecuteInfo.fMask = SEE_MASK_INVOKEIDLIST
                If Not ShellExecuteEx(oShellExecuteInfo) Then
                    Dim ex As New System.ComponentModel.Win32Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error())
                    MsgBox("error in Datei-Eigenschaften öffnen:" & vbCrLf & ex.Message, MsgBoxStyle.Critical)
                End If
            Catch ex As Exception
            End Try
            Cursor = Cursors.Default
        End If

    End Sub

    Private Sub bbtniRefreshSearches_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniRefreshSearches.ItemClick
        TryOpen_Additional_Searches()
    End Sub
    Sub TryOpen_Additional_Searches()
        Try
            MyValidationLogger.Debug("=== TryOpen_Additional_Searches START ===")

            Dim hasDATASearches As Boolean = (DT_FILTERED_PROFILE_SEARCHES_DATA IsNot Nothing AndAlso DT_FILTERED_PROFILE_SEARCHES_DATA.Rows.Count > 0)
            Dim hasDOCSearches As Boolean = (DT_FILTERED_PROFILE_SEARCHES_DOC IsNot Nothing AndAlso DT_FILTERED_PROFILE_SEARCHES_DOC.Rows.Count > 0)

            If Not hasDATASearches AndAlso Not hasDOCSearches Then Exit Sub

            ' 1) Immer vorbereiten (ohne Show)
            Load_Additional_Searches(False)

            If _frmValidatorSearch Is Nothing OrElse _frmValidatorSearch.IsDisposed Then
                MyValidationLogger.Debug("Instantiating frmValidatorSearch for additional searches...")
                _frmValidatorSearch = New frmValidatorSearch(Me, Environment)
            End If

            ' 2) Öffnen nur hier per User-Aktion
            Dim wasVisible As Boolean = _frmValidatorSearch.Visible
            If Not wasVisible Then
                MyValidationLogger.Debug("Showing frmValidatorSearch for additional searches...")
                _frmValidatorSearch.Show()
            Else
                MyValidationLogger.Debug("Bringing frmValidatorSearch to front for additional searches...")
                _frmValidatorSearch.BringToFront()
            End If

            ' 3) WICHTIG: Nach erstem Show erneut binden (UI ist jetzt vollständig initialisiert)
            If Not wasVisible Then
                Me.BeginInvoke(New Action(Sub()
                                              Try
                                                  If _frmValidatorSearch IsNot Nothing AndAlso
                                                 Not _frmValidatorSearch.IsDisposed AndAlso
                                                 _frmValidatorSearch.Visible Then
                                                      MyValidationLogger.Debug("TryOpen_Additional_Searches: Post-Show Rebind gestartet")
                                                      Load_Additional_Searches(False)
                                                  End If
                                              Catch ex As Exception
                                                  MyValidationLogger.Error("❌ Fehler beim Post-Show Rebind in TryOpen_Additional_Searches", ex)
                                              End Try
                                          End Sub))
            End If

        Catch ex As Exception
            MyValidationLogger.Error("❌ Fehler in TryOpen_Additional_Searches", ex)
        End Try
    End Sub
    Private Sub bbtniRefresh_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniRefresh.ItemClick
        ' ========== KRITISCH: Events KOMPLETT blockieren während Refresh ==========
        _suppressLookupEvents = True
        ShowOverlaySafe()
        Try

            Reload_Controls("")
            Try
                btnSave.Text = Translation_Strings.Speichern___Nächster_Vorgang__F2_
            Catch ex As Exception
            End Try
            listChangedLookup.Clear()
            _listForceReindex.Clear()
            SetStatusLabel("All Data refreshed", "Yellow")
        Finally
            _suppressLookupEvents = False  ' 
            CloseOverlaySafe()
        End Try
    End Sub

    Private Sub bbtniNext_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniNext.ItemClick
        Cursor = Cursors.WaitCursor
        Dim perfStart As DateTime = If(LOG_HOTSPOTS, DateTime.Now, Nothing)
        Dim perfLastCheck As DateTime = perfStart



        If LOG_HOTSPOTS Then
            ' ========== DIAGNOSE START ==========
            MyValidationLogger.Info($"[START] bbtniNext_ItemClick START")
            MyValidationLogger.Info($"   frmValidator.IsDisposed: {Me.IsDisposed}")
            MyValidationLogger.Info($"   frmValidator.Visible: {Me.Visible}")
            MyValidationLogger.Info($"   _FormClosing: {_FormClosing}")
            ' ========== ENDE DIAGNOSE ==========
            MyValidationLogger.Info("[PERF] bbtniNext_ItemClick START")
        End If

        If ForceGridValidation() = True Then
            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Nach ForceGridValidation: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
                ' ========== DIAGNOSE: Vor Reset_CurrentReferences ==========
                MyValidationLogger.Info($"[START] Rufe Reset_CurrentReferences auf...")
                MyValidationLogger.Info($"   VOR: frmValidator.IsDisposed: {Me.IsDisposed}")
                ' ========== ENDE DIAGNOSE ==========

            End If


            Reset_CurrentReferences()



            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Nach Reset_CurrentReferences: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                perfLastCheck = DateTime.Now
                ' ========== DIAGNOSE: Nach Reset_CurrentReferences ==========
                MyValidationLogger.Info($"   NACH: frmValidator.IsDisposed: {Me.IsDisposed}")
                MyValidationLogger.Info($"   NACH: frmValidator.Visible: {Me.Visible}")
                ' ========== ENDE DIAGNOSE ==========
                ' ========== DIAGNOSE: Vor Datei_ueberspringen ==========
                MyValidationLogger.Info($"[START] Rufe Datei_ueberspringen auf...")
                MyValidationLogger.Info($"   VOR: frmValidator.IsDisposed: {Me.IsDisposed}")
                ' ========== ENDE DIAGNOSE ==========
            End If

            Datei_ueberspringen()

            If LOG_HOTSPOTS Then
                MyValidationLogger.Info($"[PERF] Nach Datei_ueberspringen: {(DateTime.Now - perfLastCheck).TotalMilliseconds}ms")
                ' ========== DIAGNOSE: Nach Datei_ueberspringen ==========
                MyValidationLogger.Info($"   NACH: frmValidator.IsDisposed: {Me.IsDisposed}")
                MyValidationLogger.Info($"   NACH: frmValidator.Visible: {Me.Visible}")
                ' ========== ENDE DIAGNOSE ==========

            End If
        End If

        If LOG_HOTSPOTS Then
            MyValidationLogger.Info($"[PERF] bbtniNext_ItemClick GESAMT: {(DateTime.Now - perfStart).TotalMilliseconds}ms")
            ' ========== DIAGNOSE ENDE ==========
            MyValidationLogger.Info($"[START] bbtniNext_ItemClick ENDE")
            MyValidationLogger.Info($"   frmValidator.IsDisposed: {Me.IsDisposed}")
            MyValidationLogger.Info($"   frmValidator.Visible: {Me.Visible}")
            ' ========== ENDE DIAGNOSE ==========
        End If



        Cursor = Cursors.Default
    End Sub

    Private Sub bbtniDelete_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniDelete.ItemClick
        If ForceGridValidation() = True Then
            delete_active_File()
        End If

    End Sub

    Private Sub bbtniAnnotation_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniAnnotation.ItemClick
        Application.DoEvents()

        frmAnnotations.ShowDialog()

        LoadDocument_DDViewer()
    End Sub

    Private Sub BbtnItm_ItemClick(sender As Object, e As ItemClickEventArgs) Handles BbtnitmSave.ItemClick
        If BbtnitmSave.Enabled = False Then
            MyValidationLogger.Warn("BbtnitmSave_ItemClick: Button bereits disabled, Exit Sub")
            Exit Sub
        End If
        BbtnitmSave.Enabled = False
        ShowOverlaySafe() ' ✅ Overlay hier öffnen
        Try
            ' ========== FIX 2: Nur EINEN Check-Aufruf ==========
            If Check_UpdateIndexe() = True Then
                SetStatusLabel("Data saved", "LimeGreen")
                MyValidationLogger.Info("Workflowdata saved manually!")

                Dim ins = String.Format(
                "INSERT INTO TBPM_FILES_WORK_HISTORY (PROFIL_ID, DOC_ID, WORKED_BY, WORKED_WHERE, STATUS_COMMENT) VALUES ({0},{1},'{2}','{3}','{4}')",
                CURRENT_ProfilGUID, CURRENT_DOC_ID, USER_USERNAME, System.Environment.MachineName, "Manual Save via button")

                DatabaseFallback.ExecuteNonQueryECM(ins)
            Else
                SetStatusLabel("Error while saving data!", "Red")
                MsgBox("Unexpeceted error while savign data! Please check Your log and try again.", MsgBoxStyle.Critical)

            End If

        Finally
            CloseOverlaySafe()
            If Not _FormClosing AndAlso Not Me.IsDisposed Then
                BbtnitmSave.Enabled = True
            Else
                MyValidationLogger.Debug("BbtnitmSave_ItemClick: Form closing, Button bleibt disabled")
            End If

        End Try
    End Sub
    Private Sub SaveDevExpressGridControl_Layout(pProfilID As Integer, pControlID As Integer, pGridView As DevExpress.XtraGrid.Views.Grid.GridView)
        Try
            Dim xml As String = GetXML_OverviewLayoutName(pProfilID, pControlID)
            pGridView.SaveLayoutToXml(xml)
        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Error while saving GridLayout: " & ex.Message)
        End Try
    End Sub

    Private Sub RestoreDevExpressGridControl_Layout(pProfilID As Integer, pControlID As Integer, pGridView As DevExpress.XtraGrid.Views.Grid.GridView)

        Try
            Dim oXml As String = GetXML_OverviewLayoutName(pProfilID, pControlID)
            If File.Exists(oXml) Then
                pGridView.RestoreLayoutFromXml(oXml)
            End If

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MyValidationLogger.Info("Error while restoring layout: " & ex.Message)
        End Try
    End Sub
    Private Function GetXML_OverviewLayoutName(pProfilID As Integer, pControlID As Integer)
        Dim Filename As String = String.Format($"DevExpressValidatorGridControl_{pProfilID}-{pControlID}.xml")
        Return System.IO.Path.Combine(USER_CONFIG_DIRECTORY, Filename)
    End Function

    Private Sub BarButtonItem5_ItemClick_1(sender As Object, e As ItemClickEventArgs) Handles BarButtonItem5.ItemClick
        MsgBox("Versioning not configured! (Reasons: RightManagement, Displaying)", MsgBoxStyle.Information)
    End Sub

    Private Sub Attmt_bbtnitmShow_Click(sender As Object, e As ItemClickEventArgs) Handles Attmt_bbtnitmShow.ItemClick
        MyValidationLogger.Debug("Attmt_bbtnitmShow.ItemClick...")
        TryOpen_Additional_Searches()
    End Sub

    Private Sub barbtnitmExport_ItemClick(sender As Object, e As ItemClickEventArgs) Handles barbtnitmExport.ItemClick
        If File.Exists(DocPathWindows) = False Then
            MsgBox("Workflow-Document seems not to exist. Check Your log.", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
            Exit Sub
        End If

        Try
            Dim oFilenameOnly As String
            Dim oExtension As String
            Dim oTargetPath As String
            Dim oFile2Export As String
            Dim oCount As Integer = 0
            Dim oSQLGetFilename As String

            If FolderBrowserDialog1.ShowDialog <> DialogResult.OK Then
                Exit Sub
            End If

            oFilenameOnly = Path.GetFileName(DocPathWindows)
            oExtension = Path.GetExtension(DocPathWindows)
            oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbcrlf &
                $"EXEC dbo.PRPM_GETFILENAME_EXPORT {CURRENT_DOC_ID}, 1, @Outputfilename = @Filename OUTPUT;" & vbcrlf &
                "SELECT @Filename"

            Dim oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
            If Not IsNothing(oExportFilename) Then
                If IsDBNull(oExportFilename) Then
                    MyValidationLogger.Info($"#### ATTENTION: oExportFilename is DBNULL - SQL: {oSQLGetFilename}")
                    oExportFilename = ""
                End If
                If oExportFilename <> String.Empty Then
                    oTargetPath = FolderBrowserDialog1.SelectedPath & "\" & oExportFilename & oExtension
                    If Not IsNothing(barbtnitmExport.Tag) Then
                        If barbtnitmExport.Tag.ToString = "Convert to PDF" Then
                            If oExtension.ToLower.EndsWith("pdf") Then
                                Dim oTempPath = System.IO.Path.GetTempPath()
                                Dim oTempFullFilename = oTempPath + "\" + oExportFilename & oExtension

                                Dim oConverter As New PDFConverter(LOGCONFIG)
                                If oConverter.ConvertPDFADocumentToPDFDocument(DocPathWindows, oTempFullFilename) = False Then
                                    MyValidationLogger.Warn("⚠️ File [{0}] could not be converted to plain PDF!", DocPathWindows)
                                    oFile2Export = DocPathWindows
                                Else
                                    MyValidationLogger.Info("File [{0}] successfully converted to plain PDF!", oTempFullFilename)
                                    MyValidationLogger.Info("File [{0}] successfully converted to plain PDF!", DocPathWindows)
                                    oFile2Export = oTempFullFilename
                                End If
                            Else
                                MyValidationLogger.Warn("⚠️ No converting as File [{0}] not ending with pdf [{1}]", DocPathWindows, oExtension.ToLower)
                                oFile2Export = DocPathWindows
                            End If
                        Else
                            MyValidationLogger.Warn("⚠️ No converting as barbtnitmExport.Tag.ToString <> Convert to PDF")
                            oFile2Export = DocPathWindows
                        End If
                    Else
                        oFile2Export = DocPathWindows
                    End If
                    MyValidationLogger.Info("Final export path is: [{0}]", oFile2Export)
                    File.Copy(oFile2Export, oTargetPath)
                    MyValidationLogger.Info($"File {oFile2Export} exported successfully!")
                    oCount += 1
                Else
                    MsgBox("Error encountered while extracting Export-Filename!" & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                End If
            Else
                MyValidationLogger.Info($"#### ATTENTION: oExportFilename is Nothing - SQL: {oSQLGetFilename}")
                MsgBox("Error encountered while extracting Export-Filename - Result is Nothing!" & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
            End If

            Dim oFileCount As Integer = 1
            If Not IsNothing(DT_AdditionalSearches_Resultset_Docs) Then
                For Each oFileRecord As DataRow In DT_AdditionalSearches_Resultset_Docs.Rows
                    Dim oFromFilename = oFileRecord.Item("FULL_FILENAME")
                    Dim oDocID = oFileRecord.Item("DocID")
                    If File.Exists(oFromFilename) Then
                        MyValidationLogger.Debug($"Found additional document for export: [{oFromFilename}] with DocID [{oDocID}]")
                        oFileCount += 1
                        oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbCrLf &
                         $"EXEC dbo.PRPM_GETFILENAME_EXPORT {oDocID}, {oFileCount}, @Outputfilename = @Filename OUTPUT;" & vbCrLf &
                        "SELECT @Filename"
                        oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
                        oExtension = Path.GetExtension(oFromFilename)
                        If Not IsNothing(oExportFilename) Then
                            If IsDBNull(oExportFilename) Then
                                MyValidationLogger.Info($"#### ATTENTION: oExportFilename is DBNULL - SQL: {oSQLGetFilename}")
                                oExportFilename = ""
                            End If
                            If oExportFilename <> String.Empty Then
                                oTargetPath = FolderBrowserDialog1.SelectedPath & "\" & oExportFilename & oExtension
                                File.Copy(oFromFilename, oTargetPath)
                                LOGGER.Info($"Additional file [{oFromFilename}] exported successfully to [{oTargetPath}]")
                                oCount += 1
                            Else
                                Dim omsg = $"Error encountered while extracting ATTACHMENT-Export-Filename  DocID [{oDocID}]!"
                                MyValidationLogger.Info($"#### ATTENTION: {omsg} SQL: {oSQLGetFilename}")
                                MsgBox(omsg & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                            End If
                        Else
                            Dim omsg = $"Error encountered while extracting ATTACHMENT-Export-Filename DocID [{oDocID}] - Result is Nothing!"
                            MyValidationLogger.Info($"#### ATTENTION: {omsg} SQL: {oSQLGetFilename}")
                            MsgBox(omsg & vbCrLf & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                        End If
                        'oFilenameOnly = Path.GetFileName(oFromFilename)
                    Else
                        MyValidationLogger.Warn($"⚠️ Additional file for export not found: [{oFromFilename}] with DocID [{oDocID}]")
                    End If
                Next
            Else
                MyValidationLogger.Info("No additional documents to export (DT_AdditionalSearches_Resultset_Docs is Nothing)")
            End If

            CONFIG.Config.LastExportPath = FolderBrowserDialog1.SelectedPath
            CONFIG.Save()
            MsgBox($"[{oCount}] file/s successfully exported to target [{FolderBrowserDialog1.SelectedPath}]!", MsgBoxStyle.Information, ADDITIONAL_TITLE)

        Catch ex As Exception
            MyValidationLogger.Error(ex)
            MsgBox("Could not move file to target: " & vbcrlf & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
        End Try
    End Sub




    Private Sub BarCheckItemLoadOnClick_CheckedChanged(sender As Object, e As ItemClickEventArgs) Handles Attmnt_bbtnitm_LoadonClick.CheckedChanged
        If _FormLoaded = False Then
            Exit Sub
        End If
        CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK = Attmnt_bbtnitm_LoadonClick.Checked
        CONFIG.Save()
    End Sub

    Private Sub btnReject_Click(sender As Object, e As EventArgs) Handles btnReject.Click
        oProfile_REJECT_SQL_REASONS = clsPatterns.ReplaceAllValues(oProfile_REJECT_SQL_REASONS, PanelValidatorControl, True)
        Dim frmRejCommit As New frmRejectionCommit(CURRENT_ProfilGUID, CURRENT_DOC_ID, oProfileRejectionText, oProfile_REJECT_SQL_REASONS)
        frmRejCommit.ShowDialog()
        If frmRejCommit.pRejection_Commited = True Then
            Dim oNoError As Boolean = True
            'Ablehnungsgrund speichern
            If IDB_ACTIVE = False Then
                oNoError = Indexiere_File(CURRENT_WMFILE, PROFIL_REJECT_ACTIONS_ATTRIBUTE, frmRejCommit.pRejection_Action)
                If oNoError Then
                    oNoError = Indexiere_File(CURRENT_WMFILE, PROFIL_REJECT_COMMENT_ATTRIBUTE, frmRejCommit.pRejection_Comment)
                End If
            Else
                oNoError = IDBData.SetVariableValue(PROFIL_REJECT_ACTIONS_ATTRIBUTE, frmRejCommit.pRejection_Action)
                If oNoError Then
                    oNoError = IDBData.SetVariableValue(PROFIL_REJECT_COMMENT_ATTRIBUTE, frmRejCommit.pRejection_Comment)
                End If
            End If
            PRTF_PROFILE_FILES_WORK("FreeFile")
            If oNoError Then
                REJECTION_ACTIVE = True
                If Check_UpdateIndexe() = True Then
                    Finish_WFStep(True)
                End If
            Else
                MsgBox("We are sorry, but an enexpected error in rejection-process occured!" & vbcrlf & "Inform Your admin-team and check Your log. Thank You.", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
            End If

        End If
    End Sub

    Private Sub btnNotResponsible_Click(sender As Object, e As EventArgs) Handles btnNotResponsible.Click
        Dim oCommentSoFar As String = ""
        For Each oControl As Control In PanelValidatorControl.Controls
            If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Attribute = PROFIL_NOT_RESP_COMMENT_ATTR Then
                Dim oName = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Name
                MyValidationLogger.Debug($"Got the control for the NR Attribute :{oName}..Gettin the value...")
                If oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit) Then
                    Try
                        oCommentSoFar = DirectCast(oControl, DevExpress.XtraEditors.TextEdit).EditValue
                        Exit For
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Unexpected error in Checking EditValue: {ex.Message}")
                    End Try
                End If
            End If
        Next
        Dim oIncludeFI As Boolean = False
        OverrideAll = True
        Override = True
        Override_SQLCommand = clsPatterns.ReplaceAllValues(oProfile_NOT_RESP_SQL, PanelValidatorControl, True)
        Dim oCaption As String = "Bestätigung - "
        If USER_LANGUAGE <> "de-DE" Then
            oCaption = "Confirmation - "
        End If
        Dim frmDialog As New frmYesNo(oProfileNotResponsibleQuestion, oCaption + oProfileNotResponsibleText, oCommentSoFar, PROFILE_NOT_RESP_COMMENT)
        frmDialog.ShowDialog()
        ' result = MessageBox.Show(oProfileNotResponsibleQuestion, ADDITIONAL_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
        If frmDialog.DialogResult = DialogResult.OK Then
            Dim oOverrideDT As DataTable = DatabaseFallback.GetDatatableECM(Override_SQLCommand)
            If Not IsNothing(oOverrideDT) Then
                If oOverrideDT.Rows.Count = 1 Then
                    Try
                        OverrideAll = oOverrideDT?.Rows(0).Item("OverrideAll")
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Could not set OverrideAll {ex.Message}")
                    End Try
                    Try
                        oIncludeFI = oOverrideDT?.Rows(0).Item("IncludeFI")
                    Catch ex As Exception
                        MyValidationLogger.Warn($"⚠️ Could not set oIncludeFI {ex.Message}")
                    End Try
                Else
                    MyValidationLogger.Info(String.Format("Result of oProfile_NOT_RESP_SQL did not delivered a Datatable - OverrideAll = True"))
                End If
            Else
                MyValidationLogger.Warn(String.Format("oProfile_NOT_RESP_SQL returned Nothing - OverrideAll = True"))
            End If

            If OverrideAll = True Then
                MyValidationLogger.Info($"CURRENT_DOC_ID: {CURRENT_DOC_ID} - OverrideAll will be in Action!")
            End If


            'For Each oControl As Control In PanelValidatorControl.Controls
            '    If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Attribute = PROFIL_NOT_RESP_COMMENT_ATTR Then
            '        Dim oName = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Name
            '        MyValidationLogger.Debug($"Got the control for the NR Attribute :{oName}..Gettin the value...")
            '        If oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit) Then
            '            Try
            '                DirectCast(oControl, DevExpress.XtraEditors.TextEdit).EditValue = frmDialog.oComment
            '                Exit For
            '            Catch ex As Exception
            '                MyValidationLogger.Warn($"⚠️ Unexpected error in Setting EditValue NotResponsible: {ex.Message}")
            '            End Try
            '        End If
            '    End If
            'Next
            PRTF_PROFILE_FILES_WORK("FreeFile")

            If IDB_ACTIVE = False Then
                Indexiere_File(CURRENT_WMFILE, PROFIL_NOT_RESP_COMMENT_ATTR, frmDialog.oComment)
            Else
                Dim oREsult = IDBData.SetVariableValue(PROFIL_NOT_RESP_COMMENT_ATTR, frmDialog.oComment)
            End If
            Finish_WFStep(oIncludeFI)
        End If
    End Sub

    Private Sub bbtnitmInfoWorkflow_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtnitmInfoWorkflow.ItemClick
        Show_WF_Messages(True)
    End Sub

    Private Sub BarCheckItem1_CheckedChanged(sender As Object, e As ItemClickEventArgs) Handles bchkitmNotes.CheckedChanged
        If _FormLoaded = False Then
            Exit Sub
        End If
        CONFIG.Config.NOTES_ONCLICK = bchkitmNotes.Checked
        CONFIG.Save()
    End Sub

    Private Sub BarButtonItemFileView_ItemClick(sender As Object, e As ItemClickEventArgs) Handles BarButtonItemFileView.ItemClick
        If DocPathWindows <> "" Then
            Try
                Process.Start(DocPathWindows)
            Catch ex As Exception
                LOGGER.Error(ex)
            End Try

        End If
    End Sub
End Class