Imports DevExpress.DataAccess.Native.Sql
Imports DevExpress.Utils
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 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.ComponentModel
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 System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox
Imports WINDREAMLib

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

    ''' <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

    Public Shared Property WMDocPathWindows As String
    Private Property DocPathWindows As String
    '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 _ItemWorked 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 Documentloader As Loader
    Private ControlCreator As ClassControlCreator
    Private PerformanceLogger As Logger
    Private Validator As Validator
    Private Const LOG_PERF = True
    Private ReadOnly Logger 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 Class S
        Inherits My.Resources.frmValidator_Strings
    End Class

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

        'MyBase.New
        Logger.Debug("Initialize Components...")
        InitializeComponent()
        Environment = pEnvironment

        Try
            Logger.Debug("Initialize _frmValidatorSearch...")
            _frmValidatorSearch = New frmValidatorSearch(Me, Environment)
        Catch ex As Exception
            Logger.Error(ex)
        End Try


    End Sub

    Private Function GetOperationMode() As OperationMode
        Dim oOperationMode As OperationMode

        If Environment.Service.Client Is Nothing Then
            Return OperationMode.NoAppServer

        End If
        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
        If OPERATION_MODE_FS = ClassConstants.OpModeFS_ZF Then
            oOperationMode = OperationMode.ZooFlow
        End If

        Return oOperationMode
    End Function

    Private Sub frmValidation_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Try


            If LOG_PERF Then PerformanceLogger.Info("frmValidation_Load")
            Logger.Debug("###frmValidation_Load###")
            Logger.Debug("Current User Language: [{0}]", USER_LANGUAGE)

            ' Operation mode is either guessed from service settings
            ' or explictly set from OperationModeOverride in Params
            OperationMode = GetOperationMode()

            Documentloader = New Loader(LOGCONFIG, OperationMode, Environment.Service.Client, Environment.User)
            ControlCreator = New ClassControlCreator(LOGCONFIG)
            Validator = New Validator(LOGCONFIG)

            Override = False
            _ItemWorked = False
            SplitContainer1.Panel2Collapsed = True
            first_control = Nothing
            _FormClosing = False

            _FormLoaded = False
            Attmt_bbtnitmShow.Visibility = BarItemVisibility.Never
            Attmnt_bbtnitm_LoadonClick.Visibility = BarItemVisibility.Never

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

        Try
            If My.Settings.frmValidatorPosition.IsEmpty = False Then
                If My.Settings.frmValidatorPosition.X > 0 And My.Settings.frmValidatorPosition.Y > 0 Then
                    Location = My.Settings.frmValidatorPosition
                Else
                    Try
                        Logger.Debug($"!! Invalid PositionData X({My.Settings.frmValidatorPosition.X}), Y({My.Settings.frmValidatorPosition.Y})")
                    Catch ex As Exception

                    End Try

                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
        Catch ex As Exception
            Logger.Info($"Error loading position: {ex.Message}")
        End Try

        Dim _step = 0
        Try
            DocumentViewerValidator.Init(LOGCONFIG, GDPICTURE_LICENSE)
        Catch ex As Exception
            Logger.Error(ex)
        End Try
        Try
            _step = 1
            _step = 2

            DTVWCONTROL_INDEX.Clear()
            Dim oExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}"
            DTVWCONTROLS_INDEX.Select(oExpression, "Y_LOC, X_LOC").CopyToDataTable(DTVWCONTROL_INDEX, LoadOption.PreserveChanges)

            _step = 3
            Logger.Debug("Profile Data loaded")
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Error LOADING profile-data(" & _step.ToString & "):" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:")
            Logger.Info(">> Error in LOADING profile-data: " & ex.Message, True)
            Me.Close()
        End Try
        Logger.Debug("frmValidation_Load finished till Step 3!")


        Try
            If CURRENT_DT_PROFILE.Rows.Count = 0 Then
                Logger.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
            Logger.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
                Logger.Debug("Step 5")
                If CURRENT_DT_PROFILE.Rows.Count = 1 Then
                    _step = 6
                    Logger.Debug("Step 6")
                    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")

                        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
                        Dim oProfileTitle As String = ""
                        Dim oProfileDescription As String = ""

                        For Each oRow As DataRow In CURRENT_DT_PROFILE_LANGUAGE.Rows
                            Console.WriteLine(oRow.Item("TITLE"))
                            If oRow.Item("TITLE") = $"PROFILE_TITLE{CURRENT_ProfilGUID}" Then
                                oProfileTitle = oRow.Item("STRING1")
                            ElseIf oRow.Item("TITLE") = $"PROFILE_DESCRIPTION{CURRENT_ProfilGUID}" Then
                                oProfileDescription = oRow.Item("STRING1")
                            ElseIf oRow.Item("TITLE") = $"PROFILE_FINAL_TEXT{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then
                                If oRow.Item("STRING1") <> "" Then
                                    oProfileFinalText = oRow.Item("STRING1")
                                End If
                            ElseIf oRow.Item("TITLE") = $"PROFILE_REJECTION_CAPT{CURRENT_ProfilGUID}" Then
                                oProfileRejectionText = oRow.Item("STRING1")
                            ElseIf oRow.Item("TITLE") = $"PROFILE_NOT_RESPONSIBLE_CAPT{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then
                                oProfileNotResponsibleText = oRow.Item("STRING1")
                            ElseIf oRow.Item("TITLE") = $"PROFILE_NOT_RESPONSIBLE_QUEST{CURRENT_ProfilGUID}" And oRow.Item("LANGUAGE") = USER_LANGUAGE Then
                                oProfileNotResponsibleQuestion = oRow.Item("STRING1")
                            End If
                        Next

                        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
                        DESCRIPTIONLabel.Text = oProfileDescription
                        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"))
                        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)"))
                                'btnSave.Text = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.ValidationButton")
                                If oProfileFinalText = String.Empty Then
                                    oProfileFinalText = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.ValidationButton")
                                End If
                                btnSave.Text = oProfileFinalText
                            End If
                            Logger.Debug("Buttontext validation loaded")
                        Catch ex As Exception
                            Logger.Error(ex)
                            MsgBox("Error loading final profile text:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:")
                            Logger.Info(">> Error loading final profile text: " & ex.Message, True)
                        End Try
                        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



                        Logger.Debug($"oProfileRejectionText: " + oProfileRejectionText)
                        Logger.Debug($"oProfile_REJECT_SQL_REASONS: " + oProfile_REJECT_SQL_REASONS)
                        Logger.Debug($"oProfileNotResponsibleText: " + oProfileNotResponsibleText)
                        Logger.Debug($"oProfile_NOT_RESP_SQL: " + oProfile_NOT_RESP_SQL)
                        Logger.Debug($"oProfileRejectionText: " + oProfileRejectionText)
                        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 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
                            Logger.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
                                Logger.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
                                    Logger.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

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

                            Amount_Docs2Validate = 0
                        End If

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

                    PROFIL_sortbynewest = CURRENT_DT_PROFILE.Rows(0).Item("SORT_BY_LATEST")
                    Logger.Debug("PROFIL_sortbynewest: " & PROFIL_sortbynewest.ToString)
                    'Delete Button anzeigen ja/nein
                    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
                    Logger.Debug("Right_Delete: " & USER_RIGHT_FILE_DELETE.ToString)
                    Create_Controls()


                End If
            End If

            'oErrMsgMissingInput = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.MissingInput")
            oErrMsgMissingInput = S.Bitte_validieren_Sie_die_rot_markierten_Felder_


            Logger.Debug("frmValidation_Load finished!")

        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Error LOADING Profile-Data1:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Attention:")
            Logger.Info("Unexpected error in LOADING Profile-Data1: " & ex.Message)
        End Try

    End Sub


    Private Sub frmValidation_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Try
            _FormClosing = True

            If Application.OpenForms().OfType(Of frmValidator_Messages).Any Then
                If Not IsNothing(frmMessages) Then
                    frmMessages.Close()
                End If
            End If
            Try
                ' Position und Größe speichern
                My.Settings.frmValidatorSize = Me.Size
                My.Settings.frmValidatorPosition = Me.Location
                My.Settings.Save()
            Catch ex As Exception
                Logger.Error(ex)
                Logger.Info("Error in Load FormLayout: " & ex.Message)
            End Try
            My.Settings.frmValidatorSize = Me.Size
            My.Settings.Save()
            If INACTIVITY_DURATION <> 0 Then frmMain.Timer_Inactivity_Reset_Disable("FormClosing")
        Catch ex As Exception
            Logger.Error(ex)
        End Try

        Try
            Dim oDel = $"DELETE FROM TBPM_DOCWALKOVER WHERE UserID = {USER_ID}"

            DatabaseFallback.ExecuteNonQueryECM(oDel)
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Error in delete jumped files:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
        End Try

        If CURRENT_DOC_GUID <> 0 Then
            Try
                'If ItemWorked = False Then
                Free_File()
                'End If
            Catch ex As Exception
                Logger.Error(ex)
            End Try
        End If
        Reset_CurrentReferences()

        Try
            DocumentViewerValidator.CloseDocument()
            DocumentViewerValidator.Done()
        Catch ex As Exception
            Logger.Warn($"Unexpected error in DocumentViewerValidator.Done: {ex.Message}")
        End Try

        Try
            _frmValidatorSearch.Close()
        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub
    Sub Reset_CurrentReferences()
        Logger.Info("Attention: Reset_CurrentReferences....")

        If Not IsNothing(DT_AdditionalSearches_Resultset_Docs) Then
            DT_AdditionalSearches_Resultset_Docs.Clear()
        End If

    End Sub

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

            If BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows.Count > 0 Then
                'Check whether DocData is there
                Dim oConID = BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows(0).Item("CONN_ID")
                oDataResultCommand = BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows(0).Item("SQL_COMMAND")
                oDataResultCommand = clsPatterns.ReplaceAllValues(oDataResultCommand, PanelValidatorControl, True)
                oDatatableDataResult = DatabaseFallback.GetDatatableWithConnection(oDataResultCommand, oConID)
            End If

            Dim oDataResultsExist As Boolean = False

            If BASEDATA_DT_PROFILE_SEARCHES_SQL.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

    Public Sub Load_Additional_Searches(Preload As Boolean)
        Try
            AdditionalDocResultsExist = Test_Additional_Doc_Searches_Exist()
            AdditionalDataResultsExist = Test_Additional_Data_Searches_Exist()
            'If Test_Additional_Searches_Exist() Then
            If AdditionalDataResultsExist = True Or AdditionalDocResultsExist = True Then
                Try

                    Dim oPnl1Collapsed As Boolean = True
                    Dim oPnl2Collapsed As Boolean = True
                    If AdditionalDataResultsExist = True Then
                        oPnl1Collapsed = False
                    Else
                        oPnl1Collapsed = True
                    End If
                    oPnl2Collapsed = False
                    Dim oConID As Int16
                    Dim oCommand As String
                    Attmnt_bbtnitm_LoadonClick.Visibility = BarItemVisibility.Always
                    Attmt_bbtnitmShow.Visibility = BarItemVisibility.Always
                    If Preload = False Then
                        If AdditionalDocResultsExist Then

                            _frmValidatorSearch.TabPreload(oPnl1Collapsed, oPnl2Collapsed, BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows.Count, DT_FILTERED_PROFILE_SEARCHES_DOC.Rows.Count,
                            BASEDATA_DT_PROFILE_SEARCHES_SQL, DT_FILTERED_PROFILE_SEARCHES_DOC)
                            _frmValidatorSearch._DTDocSearches = DT_FILTERED_PROFILE_SEARCHES_DOC
                            oConID = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("CONN_ID")
                            oCommand = DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("SQL_COMMAND")
                            oCommand = clsPatterns.ReplaceAllValues(oCommand, PanelValidatorControl, True)
                            _frmValidatorSearch.RefreshTabDoc(oConID, oCommand, 0, DT_FILTERED_PROFILE_SEARCHES_DOC.Rows(0).Item("TAB_TITLE"))
                        End If


                        If AdditionalDataResultsExist Then
                            _frmValidatorSearch._DTSQLSearches = BASEDATA_DT_PROFILE_SEARCHES_SQL
                            oConID = BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows(0).Item("CONN_ID")
                            oCommand = BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows(0).Item("SQL_COMMAND")
                            oCommand = clsPatterns.ReplaceAllValues(oCommand, PanelValidatorControl, True)
                            _frmValidatorSearch.Refresh_Load_GridSQL(oConID, oCommand, 0, BASEDATA_DT_PROFILE_SEARCHES_SQL.Rows(0).Item("TAB_TITLE"))

                        End If
                    End If


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

                bbtniRefreshSearches.Visibility = BarItemVisibility.Always

            Else
                Logger.Debug("AdditionlSearhes result = false!")
                bbtniRefreshSearches.Visibility = BarItemVisibility.Never
                Attmnt_bbtnitm_LoadonClick.Visibility = BarItemVisibility.Never
                Attmt_bbtnitmShow.Visibility = BarItemVisibility.Never


            End If

            'Else
            '    Logger.Debug("Not loading AdditionalSearches 2...!")
            '    bbtniRefreshSearches.Visibility = BarItemVisibility.Never
            'End If
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
        End Try

    End Sub
    Sub LoadSQLData(control As Control, pControlId As Integer)
        Try
            If TypeOf control Is Label Then
                Exit Sub
            End If

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

            Dim oDTforControl As DataTable = DTCONTROLS_WITH_SQL.Clone()
            Dim oExpression = $"GUID = {pControlId} AND PROFIL_ID = {CURRENT_ProfilGUID}"
            DTCONTROLS_WITH_SQL.Select(oExpression).CopyToDataTable(oDTforControl, LoadOption.PreserveChanges)

            If IsNothing(oDTforControl) Then Exit Sub
            If oDTforControl.Rows.Count = 0 Then Exit Sub

            For Each row As DataRow In oDTforControl.Rows
                Dim name As String = row.Item("NAME")
                Dim oGUID As String = row.Item("GUID")
                Dim oReadOnly As Boolean = row.Item("READ_ONLY")

                'If clsPatterns.HasComplexPatterns(row.Item("SQL_UEBERPRUEFUNG")) Then
                '    Logger.Debug($"SQL [{row.Item("SQL_UEBERPRUEFUNG")}] has complex patterns - GUID: {oGUID}")
                '    Continue For
                'End If

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

                If IsDBNull(row.Item("CONNECTION_ID")) Then
                    Logger.Info($"No CONNECTION_ID for SQL-Data - oGUID: {oGUID}")
                    Continue For
                End If

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

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

                'If clsPatterns.HasComplexPatterns(sqlStatement) Then
                '    Continue For
                'End If
                If IsNothing(oSQLStatement) Then
                    Continue For
                End If
                'oSql = clsPatterns.ReplaceUserValues(sqlStatement, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_CLICKED_PROFILE_ID)
                'oSql = clsPatterns.ReplaceInternalValues(oSql)


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

                Dim oDTContent As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSQLStatement, DatabaseType.ECM) With {
                    .ConnectionId = oConnectionId
                })

                If IsNothing(oDTContent) Then
                    Logger.Warn($"SQL-Query [{oSQLStatement}] for control {control.Name} is invalid.")
                    Exit Sub
                End If
                Dim oValue

                ' Because LookupControl is a subtype of TextEdit,
                ' we need to check for LookupControl first!
                If TypeOf control Is LookupControl3 Then
                    Try
                        Dim lookup As LookupControl3 = control

                        lookup.Properties.DataSource = oDTContent
                        lookup.Properties.ValueMember = oDTContent.Columns.Item(0).ColumnName
                        lookup.Properties.DisplayMember = oDTContent.Columns.Item(0).ColumnName
                    Catch ex As Exception

                        Logger.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
                        Logger.Warn("Error in TextBoxLoadSQLData: " & ex.Message)

                    End Try
                ElseIf TypeOf control Is Windows.Forms.ComboBox Then
                    Try
                        Dim oMyComboBox As Windows.Forms.ComboBox = control
                        Dim oselectedIndex = oMyComboBox.SelectedIndex
                        Logger.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
                        Logger.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 OrElse oDataSource.Rows.Count = 0 Then
                            'dataGridView.DataSource = dt

                            Dim oDatatable As DataTable = oDTContent.Clone()

                            For Each oColumn As DataColumn In oDatatable.Columns
                                If oDataSource.Columns(oColumn.ColumnName) Is Nothing Then
                                    'oDataSource.Columns.Add(oColumn)
                                    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
                        Logger.Warn("Error in GridControlSQLData: " & ex.Message)
                    End Try
                End If
            Next
        Catch ex As Exception
            Logger.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

            PanelValidatorControl.Controls.Clear()
            Dim oSQL = $"SELECT [dbo].[FNPM_LANGUAGE_CONTROL_TEXT] (NAME,'{USER_LANGUAGE}',CTRL_TYPE,CTRL_TEXT) CTRL_CAPTION_LANG, * FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {CURRENT_ProfilGUID} ORDER BY Y_LOC, X_LOC"
            DT_CONTROLS = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_LANGUAGE", New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                .FilterExpression = $"LANGUAGE = '{USER_LANGUAGE}' AND PROFIL_ID = {CURRENT_ProfilGUID}",
                .SortByColumn = "Y_LOC, X_LOC"
            })

            oSQL = $"SELECT IIF(LANG.CAPTION IS NULL,T.SPALTEN_HEADER,LANG.CAPTION) SPALTEN_HEADER_LANG, T.*  from TBPM_CONTROL_TABLE T INNER JOIN TBPM_PROFILE_CONTROLS T1 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, 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 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
                                Logger.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

                                oMyControl = txt
                                Logger.Debug($"[{oControlInfo}] - TXT Created!!")
                            Catch ex As Exception
                                Logger.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
                            Logger.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

                                Logger.Debug("In add_ComboBox - GUID: " & oControlID)
                                Dim oCONID As Integer
                                Try
                                    oCONID = PreventNulletc(oControlRow.Item("CONNECTION_ID"), "Integer")
                                Catch ex As Exception
                                    oCONID = 0
                                End Try

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

                                            If clsPatterns.HasOnlySimplePatterns(oSQL) Then
                                                Logger.Debug("SQL HasOnlySimplePatterns!")
                                                oSQL = clsPatterns.ReplaceInternalValues(oSQL)
                                                oSQL = clsPatterns.ReplaceControlValues(oSQL, PanelValidatorControl, True)
                                                'Dim oDT As DataTable = ClassDatabase.Return_Datatable_ConId(oSQL, oCONID, $"CreateControls - oControlID: {oControlID}")
                                                Dim oDT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                                                    .ConnectionId = oCONID
                                                })

                                                If Not IsNothing(oDT) Then
                                                    For Each oRow As DataRow In oDT.Rows
                                                        oComboBox.Items.Add(oRow.Item(0))
                                                    Next
                                                End If
                                            End If
                                        Catch ex As Exception
                                            Logger.Warn($"Unexpected error in CMB GetValues SQL - Error: {ex.Message}")
                                        End Try
                                    Else
                                        Logger.Debug("Else Row 571")
                                    End If
                                Else
                                    Logger.Debug("AListe Handling")
                                    Dim AListe As String = oControlRow.Item("CHOICE_LIST")
                                    Logger.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

                            Logger.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 = 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

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

                                oMyControl = MyLookupControl
                                AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf LookupListChanged

                                'Wenn Multiselect false dann prüfen ob abhängiges Control
                                If CBool(oControlRow.Item("MULTISELECT")) = False Then
                                    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
                                        Logger.Debug($"createControlsLU - Found {oFilteredData.Rows.Count} Controls which are depending on {oMyControl.Name}")
                                        'AddHandler lookup.EditValueChanged, AddressOf onLookUp1
                                        AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf onLookUpselectedValue
                                    End If

                                    oExpression = $"SQL_ENABLE like '%#CTRL#{oMyControl.Name}%'"
                                    DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredData, LoadOption.PreserveChanges)
                                    If oFilteredData.Rows.Count >= 1 Then
                                        Logger.Debug($"createControlsLU - Found {oFilteredData.Rows.Count} Controls which' enable state is depending on {oMyControl.Name}")
                                        'AddHandler lookup.EditValueChanged, AddressOf onLookUp1
                                        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 lookup.EditValueChanged, AddressOf onLookUp1
                                        AddHandler MyLookupControl.Properties.SelectedValuesChanged, AddressOf onLookUpselectedValue_Control2Set
                                    End If
                                    oFilteredData = DT_CONTROLS.Clone()

                                End If

                                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



                        'Return filteredData
                        'AddHandler lookup.Leave, AddressOf onLookUp0

                        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
                                Logger.Debug("We got a DTGRID_COLUMNS definition for [{0}] ", oControlInfo)
                            Else
                                Logger.Debug("DTGRID_COLUMNS definition for control [{0}] does not contain any rows!", oControlInfo)
                                Continue For
                            End If

                            Dim oGrid = ControlCreator.CreateExistingGridControl(oControlRow, oFilteredDatatable, False)
                            oMyControl = oGrid
                            'AddHandler oGrid.Views(0).c AddressOf GridView_CustomColumnDisplayText

                        Case "LINE"

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

                            AddHandler obutton.Click, AddressOf onCustomButtonClick
                            oMyControl = obutton
                    End Select
                    Logger.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)
                    'Logger.Error(ex)
                    Dim omsg = $"Unexpected Error in Create_Controls (Select Case) [{oControlInfo}] - ERROR: {ex.Message}"
                    Logger.Warn(omsg)
                    If DEBUG = False Then MsgBox(omsg, MsgBoxStyle.Critical, "Attention:")
                End Try


            Next

            Logger.Debug("Create_Controls finished!")

        Catch ex As Exception
            Logger.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
            Logger.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
                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)
        Dim oTextbox As BaseEdit = sender
        Dim oMeta As ClassControlCreator.ControlMetadata = oTextbox.Tag

        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)
        Dim oTextbox As BaseEdit = sender
        Dim oMeta As ClassControlCreator.ControlMetadata = oTextbox.Tag

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

        SetControlValues_FromControl(oTextbox)

        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


    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 CONTROL_ID = DirectCast(oTextBox.Tag, ClassControlCreator.ControlMetadata).Guid
                    Dim oSql = String.Format("SELECT NAME, CONNECTION_ID, SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} AND SQL_UEBERPRUEFUNG LIKE '%{1}%'", CURRENT_ProfilGUID, oTextBox.Name)
                    Dim DTCONTROLS_UEBP As DataTable
                    DTCONTROLS_UEBP = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS_SQL_UEP", New GetDatatableOptions(oSql, DatabaseType.ECM) With {
                        .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID} AND SQL_UEBERPRUEFUNG LIKE '%{oTextBox.Name}%'"
                    })

                    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 = oRow.Item("CONNECTION_ID")

                                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
                                Logger.Error(ex)
                                Logger.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
                    Logger.Error(ex)
                    Logger.Info("Unexpected Error in Eventhandler Variable SQL Result - ERROR: " & ex.Message)
                End Try
                If oTextBox.Name <> last_control.Name Then
                    SendKeys.Send("{TAB}")
                    _ControlHandleStarted = 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 Button = sender
            Dim oControlID = DirectCast(oButton.Tag, ClassControlCreator.ControlMetadata).Guid
            Dim oSQL = ControlCreator.GET_CONTROL_PROPERTY(DT_CONTROLS, oControlID, "SQL_UEBERPRUEFUNG")
            If IsNothing(oSQL) Then
                Logger.Warn("onCustomButtonClick - SQL_UEBERPRUEFUNG IS NOTHING")
                Exit Sub
            End If

            If Check_UpdateIndexe() = False Then
                Logger.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)
            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
            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
                OverrideAll = oDT_ACTIONS?.Rows(0).Item("OverrideAll")
            Catch ex As Exception
                Logger.Warn($"Could not set OverrideAll {ex.Message}")
                OverrideAll = False
            End Try
            If OverrideAll = True Then
                Logger.Info($"CURRENT_DOC_ID: {CURRENT_DOC_ID} - OverrideAll will be in Action!")
            End If
            Logger.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()
                        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(False)
                    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)
                    Logger.Warn($"No configured action provided for onCustomButtonClick [{oAction}]")
            End Select
        Catch ex As Exception
            Logger.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 CONTROL_ID = DirectCast(dgv.Tag, ClassControlCreator.ControlMetadata).Guid
            Dim sql = String.Format("select NAME,CONNECTION_ID,SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name)
            Dim DT As DataTable = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(sql, DatabaseType.ECM) With {
                .FilterExpression = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, dgv.Name)
            })

            If Not IsNothing(DT) And DT.Rows.Count > 0 Then
                For Each ROW As DataRow In DT.Rows
                    Try
                        Dim displayboxname = ROW.Item("NAME").ToString
                        If Not IsDBNull(ROW.Item("CONNECTION_ID")) And 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 = ClassDatabase.Return_Datatable_ConId(sql_Statement, ROW.Item(1), $"oControlID[{CONTROL_ID}]")
                            Dim resultDT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(sql_Statement, DatabaseType.ECM) With {
                                .ConnectionId = ROW.Item("CONNECTION_ID")
                            })

                            If resultDT.Rows.Count >= 1 Then
                                'Nur dediziert einen Wert zurückerhalten
                                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


                        End If
                    Catch ex As Exception
                        Logger.Error(ex)
                        Logger.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
            Logger.Error(ex)
            Logger.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
            Logger.Debug("onLookUpselectedValue")
            If _FormLoaded = False Then
                Exit Sub
            End If
            Dim oRepositoryItem As RepositoryItemLookupControl3 = sender
            Dim oLookup As LookupControl3 = oRepositoryItem.OwnerEdit

            Try
                If Not IsNothing(SelectedValues) Then
                    If SelectedValues.Count = 1 Then
                        LookupControl_DependingControls(oLookup, SelectedValues)
                        LookupControl_EnablingControls(oLookup, SelectedValues)
                        LookupControl_DependingColumn(oLookup, SelectedValues)
                    Else
                        Logger.Debug("Attention: onLookUpselectedValue: SelectedValues.Count <> 1 ")
                    End If
                End If
            Catch ex As Exception
                Logger.Error(ex)
            End Try
        Catch ex As Exception
            Logger.Warn("Unexpected error in onLookUpselectedValue - " + ex.Message)
            Logger.Error(ex)
        End Try

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

        Try
            Dim oLookup As RepositoryItemLookupControl3 = sender
            listChangedLookup.Add(oLookup.Name)

            ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)
            'Verschiebt den Fokus auf das nächste Control
            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
            Logger.Error(ex)
        End Try

    End Sub

    Public Sub onCheckBox_CheckedChange(sender As Object, e As EventArgs)
        Logger.Debug("onCheckBox_CheckedChange")

        If _FormLoaded = False Then
            Exit Sub
        End If
        Dim oCheckbox As CheckBox = sender
        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
            Logger.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
        Logger.Debug("onLookUpselectedValue_Control2Set")
        Dim oRepositoryItem As RepositoryItemLookupControl3 = sender
        Dim oLookup As LookupControl3 = oRepositoryItem.OwnerEdit
        SetControlValues_FromControl(oLookup)
    End Sub

    Private Sub SetControlValues_FromControl(pControl As Control)
        Dim oControlName = pControl.Name
        Dim oControlMeta = DirectCast(pControl.Tag, ClassControlCreator.ControlMetadata)
        Dim oControlID = oControlMeta.Guid

        If _SetControlValue_In_Action = True Then
            Logger.Debug("SetControlValue in action. Exiting.")
            Exit Sub
        End If

        Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
        DT_CONTROLS.
            Select($"GUID = {oControlID} and LEN(SET_CONTROL_DATA) > 0").
            CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)

        If oFilteredDatatable.Rows.Count < 1 Then
            Logger.Debug("SET_CONTROL_DATA is empty for control [{0}]. Exiting.", oControlName)
            Exit Sub
        End If

        Dim oRow As DataRow = oFilteredDatatable.Rows.Item(0)
        Dim oControlGUID2Set = oControlID
        Dim oControlname2Set = oRow.Item("NAME")
        Logger.Debug($"Workin on SetControLValue for {oControlname2Set} ...")

        Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", -1)
        Dim oControlDataSql = oRow.ItemEx("SET_CONTROL_DATA", String.Empty)

        If oConnectionId = -1 Or oControlDataSql = String.Empty Then
            Logger.Debug($"Error: Check CoNN ID and SQL on NULL VALUES!")
            Exit Sub
        End If

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

        'Dim oControlDataResult As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oConnectionId, $"SetControlValues - CTRLID {oControlID}")
        Dim oControlDataResult As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oControlDataSql, DatabaseType.ECM) With {
            .ConnectionId = oConnectionId
        })

        If oControlDataResult Is Nothing Then
            Exit Sub
        End If
        Dim oButtonFinishSet As Boolean = False
        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")

                If oControl2Set.ToString.ToUpper = "BTN_FINISH".ToUpper Then
                    btnSave.Text = oControlCaption & " (F2)"
                    btnSave.Appearance.BackColor = oControlBackColor
                    btnSave.Appearance.ForeColor = oControlFontColor
                    oButtonFinishSet = True
                    _SetControlValue_In_Action = False
                    Continue For
                End If

                Dim oFound As Boolean = False
                Dim oControlId2Set As Integer

                'If Not Integer.TryParse(oControl2Set, oControlId2Set) Then
                '    Logger.Warn("Careful: the oControl2Set contains no CONTROL_GUID")
                '    Exit Sub
                'End If

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

                If oControlObject2Set IsNot Nothing Then

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

                    Logger.Debug($"Got the Control2Set: {oControlId2Set}..Setting the values..")


                    Select Case True
                        Case oControl.GetType() = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType() = GetType(MemoEdit)
                            If oControlTextOption = "Replace" Then
                                oControl.Text = oControlCaption
                            Else
                                oControl.Text &= oControlCaption
                            End If

                            oControl.BackColor = oControlBackColor
                            oControl.ForeColor = oControlFontColor

                        Case oControl.GetType() = GetType(LookupControl3)
                            Dim oDependingLookup As LookupControl3 = oControl
                            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

                        Case Else
                            Logger.Warn("SetControlData used on unsupported control")

                    End Select

                    oFound = True
                    'Exit For
                End If

                If oFound = False Then
                    Logger.Debug($"Could not find the Control2Set with ID {oControlGUID2Set} on panel!!!")
                End If
            Catch ex As Exception
                Logger.Error(ex)
                Logger.Warn($"Error while Control2Set for [{oControlname2Set}]:  " & ex.Message)
            Finally
                _SetControlValue_In_Action = False
            End Try
        Next
    End Sub
    Private Sub LookupControl_DependingControls(LookupControl As LookupControl3, SelectedValues As List(Of String))
        Dim oLOOKUPValue = SelectedValues.Item(0
                                               )
        Dim oLOOKUPName = LookupControl.Name
        Logger.Debug($"oLOOKUPValue is  [{oLOOKUPValue}]!")
        Dim oControlID = DirectCast(LookupControl.Tag, ClassControlCreator.ControlMetadata).Guid
        Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
        Dim oExpression = $"SQL_UEBERPRUEFUNG like '%#CTRL#{oLOOKUPName}%'"
        DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
        If oFilteredDatatable.Rows.Count > 0 Then
            Logger.Debug($"We got {oFilteredDatatable.Rows.Count} depending controls!!")
        Else
            Logger.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")
            Logger.Debug($"Control {oDEPENDING_CtrlName} is depending on lookUp {oLOOKUPName}..")
            If _DependingControl_In_Action = True Then
                Logger.Debug($"..but _dependingControl_in_action = True ==> Exit Sub!")
                Exit Sub
            End If
            If Not IsDBNull(oRowDependingControl.Item("CONNECTION_ID")) And 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
                'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID"), $"LookupControl_DependingControls - oControlID: {oControlID}")
                Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With {
                    .ConnectionId = oRowDependingControl.Item("CONNECTION_ID")
                })
                Try
                    Dim oFound As Boolean = False

                    For Each oControl As Control In PanelValidatorControl.Controls
                        If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid = oDEPENDING_GUID Then
                            oFound = True
                            Logger.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
                                            Logger.Warn($"Unexpected error in Checking oTEXT: {ex.Message}")
                                        End Try


                                    Catch ex As Exception
                                        Logger.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
                                        Logger.Warn($"Unexpected error in Checking oCheckBoxDependingControlLOOKUP: {ex.Message}")
                                    End Try


                            End Select
                            _DependingControl_In_Action = False
                            Exit For
                        End If

                    Next

                    If oFound = False Then
                        Logger.Debug($"Could not find the depending Control with ID {oDEPENDING_GUID} on panel!!!")
                    End If
                Catch ex As Exception
                    Logger.Warn($"Error while setting depending control-value for [{oDEPENDING_CtrlName}]:  " & ex.Message)
                    _DependingControl_In_Action = False
                End Try
                SendKeys.Send("{TAB}")
                _ControlHandleStarted = True
            Else
                Logger.Debug($"Error: Check CoNN ID and SQL on NULL VALUES!")
            End If


        Next
        If oFilteredDatatable.Rows.Count = 1 Then


        End If
    End Sub
    Private Sub CheckBox_DependingControls(pCheckbox As CheckBox)
        Dim oCheckboxname = pCheckbox.Name
        Logger.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
            Logger.Debug($"We got {oFilteredDatatable.Rows.Count} depending controls!!")
        Else
            Logger.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")
            Logger.Debug($"Control {oDEPENDING_CtrlName} is depending on lookUp {oCheckboxname}..")
            If _DependingControl_In_Action = True Then
                Logger.Debug($"..but _dependingControl_in_action = True ==> Exit Sub!")
                Exit Sub
            End If
            If Not IsDBNull(oRowDependingControl.Item("CONNECTION_ID")) And 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
                'Dim oDTDEPENDING_RESULT As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oRowDependingControl.Item("CONNECTION_ID"), $"CheckBox_DependingControls - oControlID: {oControlID}")
                Dim oDTDEPENDING_RESULT As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With {
                    .ConnectionId = oRowDependingControl.Item("CONNECTION_ID")
                })

                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
                            Logger.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
                                            Logger.Warn($"Unexpected error in Checking oTEXT: {ex.Message}")
                                        End Try

                                    Catch ex As Exception
                                        Logger.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
                                        Logger.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
                        Logger.Debug($"Could not find the depending Control with ID {oDEPENDING_GUID} on panel!!!")
                    End If
                Catch ex As Exception
                    Logger.Warn($"Error while setting depending control-value for [{oDEPENDING_CtrlName}]:  " & ex.Message)
                    _DependingControl_In_Action = False
                End Try
                SendKeys.Send("{TAB}")
                _ControlHandleStarted = True
            Else
                Logger.Debug($"Error: Check CoNN ID and SQL on NULL VALUES!")
            End If
        Next
    End Sub
    Private Sub LookupControl_EnablingControls(LookupControl As LookupControl3, SelectedValues As List(Of String))
        Dim oLOOKUPValue = SelectedValues.Item(0)
        Logger.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 = oRow.Item("CONNECTION_ID")
                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, $"LookupControl_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
                        Logger.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
                    Logger.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 = oRow.Item("CONNECTION_ID")
                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
                        Logger.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
                    Logger.Error(ex)
                    _DependingColumn_In_Action = False
                End Try
            Next
        End If
    End Sub

    Public Sub OnCmbselectedIndex(sender As System.Object, e As System.EventArgs)
        Dim oCombobox As Windows.Forms.ComboBox = sender
        If oCombobox.SelectedIndex <> -1 And _Indexe_Loaded = True Then
            If oCombobox.Name = last_control.Name Then
                'Abschluss()
            Else
                Try
                    Dim CONTROL_ID = DirectCast(oCombobox.Tag, ClassControlCreator.ControlMetadata).Guid
                    Dim sql = String.Format("select NAME,CONNECTION_ID,SQL_UEBERPRUEFUNG FROM TBPM_PROFILE_CONTROLS WHERE CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} AND SQL_UEBERPRUEFUNG LIKE '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name)
                    Dim DT As DataTable = DatabaseFallback.GetDatatable("TBPM_PROFILE_CONTROLS", New GetDatatableOptions(sql, DatabaseType.ECM) With {
                        .FilterExpression = String.Format("CONTROL_ACTIVE = 1 AND PROFIL_ID = {0} And SQL_UEBERPRUEFUNG Like '%{1}%'", CURRENT_ProfilGUID, oCombobox.Name)
                    })
                    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
                                If Not IsDBNull(ROW.Item("CONNECTION_ID")) And 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

                                End If
                            Catch ex As Exception
                                Logger.Error(ex)
                                Logger.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
                    Logger.Error(ex)
                    Logger.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
            ' 18.10.2021: ENABLE_SQL nicht beim Form Load verarbeiten
            If _FormLoaded = False Then
                Exit Sub
            End If

            Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
            Dim oExpression = $"SQL_ENABLE like '%#CTRL#{pControlName}%'"
            DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
            If oFilteredDatatable.Rows.Count > 0 Then
                Logger.Debug($"We got {oFilteredDatatable.Rows.Count} controls which got enable definitions!!")
            Else
                Logger.Debug($"Sorry NO controls with enabling definition!!")
            End If
            For Each oRowEnablingControl As DataRow In oFilteredDatatable.Rows
                Dim oENABLE_GUID = oRowEnablingControl.Item("GUID")
                Dim oENABLE_CtrlName = oRowEnablingControl.Item("NAME")
                Logger.Debug($"Control {oENABLE_CtrlName} is depending on Control: {pControlName}..")
                If _DependingControl_In_Action = True Then
                    Logger.Debug($"..but _dependingControl_in_action = True ==> Exit Sub!")
                    Exit Sub
                End If
                If Not IsDBNull(oRowEnablingControl.Item("CONNECTION_ID")) And Not IsDBNull(oRowEnablingControl.Item("SQL_ENABLE")) Then
                    Dim oSqlCommand = IIf(IsDBNull(oRowEnablingControl.Item("SQL_ENABLE")), "", oRowEnablingControl.Item("SQL_ENABLE"))
                    oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)
                    _DependingControl_In_Action = True

                    Dim oConnectionId As Integer = oRowEnablingControl.Item("CONNECTION_ID")

                    Dim oENABLERESULT As Boolean = False
                    oENABLERESULT = DatabaseFallback.GetScalarValueWithConnection(oSqlCommand, oConnectionId)


                    Try
                        Dim oFound As Boolean = False

                        For Each oControl As Control In PanelValidatorControl.Controls
                            If DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid = oENABLE_GUID Then
                                oFound = True
                                Logger.Debug($"Got the depending control ID:{oENABLE_GUID}..Setting enabled/Disabled...")
                                oControl.Enabled = oENABLERESULT
                                _DependingControl_In_Action = False
                                Exit For
                            End If

                        Next

                        If oFound = False Then
                            Logger.Debug($"Could not find the enabling Control with ID {oENABLE_GUID} on panel!!!")
                        End If
                    Catch ex As Exception
                        Logger.Warn($"Error while setting enabling control-value for [{oENABLE_CtrlName}]:  " & ex.Message)
                        _DependingControl_In_Action = False
                    End Try
                Else
                    Logger.Debug($"Error: Check CoNN ID and SQL on NULL VALUES!")
                End If
            Next

        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub
    'Private Sub Controls2beDisabled()
    '    Try
    '        Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
    '        Dim oExpression = $"LEN(SQL_ENABLE) > 0"
    '        DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
    '        If oFilteredDatatable.Rows.Count > 0 Then
    '            Logger.Debug($"We got {oFilteredDatatable.Rows.Count} controls which need to be disabled!!")
    '        End If
    '        For Each oRowEnablingControl As DataRow In oFilteredDatatable.Rows
    '            Dim oENABLE_GUID = oRowEnablingControl.Item("GUID")
    '            Dim oENABLE_CtrlName = oRowEnablingControl.Item("NAME")
    '            For Each oControl As Control In PanelValidatorControl.Controls
    '                If oENABLE_GUID = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid Then
    '                    oControl.Enabled = False
    '                    Exit For
    '                End If
    '            Next
    '        Next
    '    Catch ex As Exception
    '        Logger.Error(ex)
    '    End Try
    'End Sub
    Private Sub Controls2B_EnDisabled_on_Load()
        If LOG_PERF Then PerformanceLogger.Info("Controls2B_EnDisabled_on_Load")

        Try
            Dim oFilteredDatatable As DataTable = DT_CONTROLS.Clone()
            Dim oExpression = $"LEN(SQL_ENABLE_ON_LOAD) > 0"
            DT_CONTROLS.Select(oExpression).CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
            If oFilteredDatatable.Rows.Count > 0 Then
                Logger.Debug($"We got {oFilteredDatatable.Rows.Count} controls which need to be checked dis/enable on load!")
            End If
            For Each oRowEnablingControl As DataRow In oFilteredDatatable.Rows
                Dim oENABLE_GUID = oRowEnablingControl.Item("GUID")
                Dim oENABLE_CtrlName = oRowEnablingControl.Item("NAME")
                For Each oControl As Control In PanelValidatorControl.Controls
                    If oENABLE_GUID = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid Then
                        Logger.Debug($"Found the Control on panel which needs to be checked [{oENABLE_GUID}]...")

                        'Dim oSqlCommand = IIf(IsDBNull(oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD")), "", oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD"))
                        'Dim oConID = oRowEnablingControl.Item("SQL_ENABLE_ON_LOAD_CONID")

                        Dim oConnectionId As Integer = oRowEnablingControl.ItemEx("CONNECTION_ID", 0)
                        Dim oSqlCommand = oRowEnablingControl.ItemEx("SQL_ENABLE_ON_LOAD", String.Empty)
                        oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)

                        Dim oResult = DatabaseFallback.GetScalarValueWithConnection(oSqlCommand, oConnectionId)

                        Try
                            Logger.Debug($"Result of Enable SQL [{oResult}]...")
                            oControl.Enabled = oResult
                        Catch ex As Exception
                            Logger.Warn($"Error en/disabling control onLoad: [{ex.Message}]")
                        End Try

                    End If
                Next
            Next
        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub
    Private Sub Depending_Control_Set_Result(displayboxname As String, sqlCommand As String, sqlConnection As String)
        Try
            Logger.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
                Logger.Debug("Result Table has [{0}] rows", oResultTable.Rows.Count)
                Logger.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
                    Logger.Debug("Control is Multivalue")

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

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

                        If IsNothing(oCombobox) Then
                            Exit Sub
                        End If

                        Logger.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
                        Logger.Debug("Filling Lookup Control with Results")

                        Dim oLookup As LookupControl3 = PanelValidatorControl.Controls(displayboxname)

                        If IsNothing(oLookup) Then
                            Exit Sub
                        End If

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

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

                    Else
                        'not implemented     
                        Logger.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"
                        Logger.Info(">> Datatable-SQL: " & sqlCommand)
                    End If
                End If
            Else
                Logger.Warn("Result Table is nothing!")
            End If
        Catch ex As Exception
            Logger.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 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
                        Logger.Debug("SQL Check is not configured!")
                        Return True
                    End If
                    If check.ToString.Length > 0 And dr.Item("INDEX_NAME") <> "DD PM-ONLY FOR DISPLAY" Then
                        Dim cs As String = DatabaseFallback.GetConnectionString(dr.Item("CONNECTION_ID"))

                        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
            Logger.Error(ex)
            Logger.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
            Logger.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)
                Catch ex As Exception
                    Logger.Warn($">> Attention: in GetNextGUID - Could not get the next GUID - SQL [{oSQL}]")
                    Logger.Warn($"ERRORMESSAGE [{ex.Message}]")
                End Try

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

                Try
                    Amount_Docs2Validate = oDT.Rows(0).Item(2)
                    Logger.Debug($"Get_Next_GUID: Amount_Docs2Validate [{Amount_Docs2Validate}]...")
                Catch ex As Exception
                    Amount_Docs2Validate = 0
                    Logger.Warn("Amount_Docs2Validate Error: " & ex.Message)
                End Try
            Else
                Logger.Info($">> Attention: GetNextGUID - Could not get the next GUID - SQL [{oSQL}]")
                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
                Logger.Debug("newGUID: " & oNewGUID.ToString)

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

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

    End Function



    Private Function CreateWMObject() As String
        Logger.Debug($"in GetWMDocFileString...'")

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

        Logger.Debug($"oWMOwnPath: {oWMOwnPath}")
        Try
            Dim oNormalizedPath = WINDREAM_MOD.GetNormalizedPath(oWMOwnPath, 1)
            CURRENT_WMFILE = WINDREAM_MOD.Session.GetWMObjectByPath(WMEntity.WMEntityDocument, oNormalizedPath)
            Logger.Debug("CURRENT_WMFILE: [{0}]", CURRENT_WMFILE)
            Return True
        Catch ex As Exception
            Dim _err1 As Boolean = False
            Logger.Error(ex)
            Logger.Info("Unexpected error creating WMObject(1) in GetWMDocFileString: " & ex.Message)
            Logger.Info("Error Number: " & Err.Number.ToString)
            errormessage = $"Could not create a WMObject(1) for [{oWMOwnPath}]!"
            frmError.ShowDialog()
            Return False

        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 oResult As String

            Dim oSQL = $"SELECT dbo.FNPM_GET_FILEPATH ({CURRENT_DOC_GUID},{_CheckStandard})"
            oResult = DatabaseFallback.GetScalarValueECM(oSQL)

            Logger.Debug($"Checking file 0 [{oResult}] exists?...")
            WMDocPathWindows = String.Empty
            If File.Exists(oResult) = False And OPERATION_MODE_FS <> ClassConstants.OpModeFS_ZF Then
                DocPathWindows = oResult
                Logger.Info($"GetWMDocPathWindows returned false [{oResult}] - trying with standard again...")
                oSQL = $"SELECT [dbo].[FNPM_GET_FILEPATH] ({CURRENT_DOC_GUID},1)"

                oResult = DatabaseFallback.GetScalarValueECM(oSQL)

                Logger.Debug($"Checking file 1[{oResult}] exists?...")
                If File.Exists(oResult) = False Then
                    Logger.Info($"GetWMDocPathWindows FileExists2 also returned false [{oResult}]!")
                    DocPathWindows = oResult
                    Logger.Warn($"GetDocPathWindows: File [{oResult}] not existing!")
                    Return False
                End If

            End If
            WMDocPathWindows = oResult
            CURRENT_DOC_PATH = WMDocPathWindows
            Logger.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
    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)
            Logger.Debug($"Load_IDB_DOC_DATA SQL: {oSQl}")
            IDB_DT_DOC_DATA = DatabaseFallback.GetDatatableECM(oSQl)
        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub


    Sub Load_Next_Document(first As Boolean)

        CURRENT_WMFILE = Nothing
        activate_controls(False)
        oErrMsgMissingInput = ""
        WMDocPathWindows = ""

        Override = False
        OverrideAll = False
        'Me.lblerror.Visible = False
        _Indexe_Loaded = False
        Logger.Debug("In Load_Next_Document")
        Try
            If first = True Then
                Logger.Debug("First Document")
                CURRENT_WMFILE = Nothing
            Else
                Logger.Debug("Following Document ")
            End If

            ' Controls nicht beim ersten Laden leeren
            If first = False Then
                Clear_all_Input()
            End If

            'Select Case navtype
            '    Case "next"
            '    Case "previous"
            '    Case "first"
            '    Case "last"
            'End Select
            Logger.Debug($"CURRENT_JUMP_DOC_GUID: {CURRENT_JUMP_DOC_GUID}'")
            If CURRENT_JUMP_DOC_GUID = 0 Then
                CURRENT_DOC_GUID = Get_Next_GUID()
                Logger.Debug($"CURRENT_JUMP_DOC_GUID = 0 ## NEW CURRENT_DOC_GUID: {CURRENT_DOC_GUID}'")
            ElseIf first = False Then
                CURRENT_DOC_GUID = 0
            End If
            Logger.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 IDB_ACTIVE = False Then
                    If CreateWMObject() = False Then
                        Exit Sub
                    End If
                Else
                    Load_IDB_DOC_DATA()
                    If IsNothing(IDB_DT_DOC_DATA) Then
                        Logger.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
                            Logger.Debug("Got one IDB DocData Result")
                        End If
                    End If
                End If


                'Beschriftung des Navigators
                'lblNavigator_anzDok.Text = position & " Of " & Anzahl_ValDoks & " files"
                'If WMDocPathWindows <> String.Empty Then
                ' >> >> >> >> >> >>##### Das Dokument in Bearbeitung nehmen ###########################
                Dim sql = $"UPDATE TBPM_PROFILE_FILES Set IN_WORK = 1, IN_WORK_WHEN = GETDATE(), WORK_USER = '{USER_USERNAME}' WHERE GUID = {CURRENT_DOC_GUID}"
                DatabaseFallback.ExecuteNonQueryECM(sql)

                ' ############ Infos eintragen #################
                ' txtDateipfad.Text = Document_Path
                'Dim omsg = $"{ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("remainingOps")}: {Amount_Docs2Validate}"
                Dim omsg = String.Format(S.Verbleibende_Vorgänge___0_, Amount_Docs2Validate)

                If Amount_Docs2Validate > 0 Then
                    bsiInformation.Caption = omsg
                Else
                    bsiInformation.Caption = "Could not get the amount of remaining docs!"
                End If

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

                Logger.Debug("AllDocInfo created...")
                If IDB_ACTIVE = False Then
                    oErrMsgMissingInput = Windream_get_Doc_info()
                Else
                    ' oErrorMessage = IDB_GetDocInfo()
                End If



                If oErrMsgMissingInput = "" Then
                    If WMDocPathWindows <> String.Empty Or OPERATION_MODE_FS = ClassConstants.OpModeFS_ZF Then
                        load_viewer()
                        Logger.Debug("Viewer loaded!")
                        If Current_Document.Extension <> "pdf" Then
                            bbtniAnnotation.Visibility = BarItemVisibility.Never
                        End If
                    End If

                    FillIndexValues(first)

                    For Each oControl As Control In PanelValidatorControl.Controls
                        LoadSQLData(oControl, DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid)
                    Next

                    Logger.Debug("Indexmask loaded")

                    'Nun loggen das das Profil geladen wurde
                    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 = S.Ende_des_Profils___Keine_weiteren_Vorgänge
                    Logger.Info(oMsg)
                    Logger.Debug(oMsg)
                    activate_controls(True)
                    Logger.Debug("Closing the form...")
                    Me.Close()
                End If
            End If
            Try
                Dim oCurrency = GetVariableValuefromSource(PROFIL_CURRENCY_ATTRIBUTE, 1, False)
                If Not IsNothing(oCurrency) Then

                    Dim oValueType = oCurrency.GetType.ToString
                    If IsDBNull(oCurrency) Then
                        oCurrency = "EUR"
                    Else
                        Try
                            oCurrency = oCurrency.ToString
                        Catch ex As Exception
                            Logger.Warn($"Unexpected error in Converting oCurreny to string: " & ex.Message)
                            oCurrency = "EUR"
                        End Try
                    End If
                    If oCurrency <> String.Empty Then
                        If oCurrency.ToString.Length = 2 Then
                            Logger.Debug("oCurrency-Length = 2 - Setting to EUR")
                            oCurrency = "EUR"
                        End If
                        Logger.Debug($"oCurrency = {oCurrency}")
                        For Each oControl As Control In PanelValidatorControl.Controls
                            Try
                                Dim oMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)
                                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 = oCurrency
                                    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 'Optional
                                    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")

                                        Select Case oColumnType
                                            Case "CURRENCY"
                                                Console.WriteLine("CurrencyFormatNecessary")
                                                oCol.DisplayFormat.FormatType = FormatType.Custom
                                                oCol.ColumnEdit = riTextEdit
                                        End Select
                                    Next
                                End If
                            Catch ex As Exception
                                Logger.Error(ex)
                            End Try
                        Next
                    Else
                        Logger.Warn($"oCurrency is String.empty! ")
                    End If
                Else
                    Logger.Warn($"oCurrency is Nothing! ")

                End If
            Catch ex As Exception
                Logger.Warn($"Unexpected error in display format Currency: " & ex.Message)
            End Try
            Try

                Show_WF_Messages()
            Catch ex As Exception
                Logger.Error(ex)
            End Try


            Logger.Debug("frmValidator: LoadNextDocument finished!")
        Catch ex As Exception
            Logger.Error(ex)
            errormessage = "unexpected error in Load_Next_Document:" & ex.Message
            My.Settings.Save()
            Logger.Info("unexpected error in Load_Next_Document: " & ex.Message)
            frmError.ShowDialog()
        End Try
    End Sub
    Sub Show_WF_Messages()
        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
                    bbtnitmInfoWorkflow.Visibility = BarItemVisibility.Always
                    Dim ofrmMessage As New frmValidator_Messages(DTInfoDoc)
                    frmMessages = ofrmMessage
                    ofrmMessage.Show()
                    ofrmMessage.BringToFront()
                Else
                    bbtnitmInfoWorkflow.Visibility = BarItemVisibility.Never
                End If
            End If

        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub
    Sub load_viewer()
        Try

            Dim oDocument As DocumentResultList.Document = Nothing
            ' Load DocumentInfo 
            oDocument = Documentloader.Load(CURRENT_DOC_ID, WMDocPathWindows)
            If oDocument Is Nothing Then
                Exit Sub
            End If
            Current_Document = oDocument
        Catch ex As Exception
            Logger.Error(ex)
            Exit Sub
        End Try
        If ActiveWorkflowType = ConstAHWorkflow_BlindFile Or PROFILE_SHOW_DOCUMENT = False Then
            SplitContainer1.Panel2Collapsed = True
            DocumentViewerValidator.Visible = False
            RibbonPageFile.Visible = False
            Exit Sub
        Else
            DocumentViewerValidator.Visible = True
        End If


        ' Load Document in Document Viewer
        Dim oFileName = $"{CURRENT_DOC_ID}.{Current_Document.Extension}"
        DocumentViewerValidator.LoadFile(oFileName, New MemoryStream(Current_Document.Contents))


        DocumentViewerValidator.RightOnlyView(USER_RIGHT_VIEW_ONLY) 'war auskommentiert.....WARUM?
        If USER_RIGHT_VIEW_ONLY = True Then
            RibbonPageFile.Visible = False
        Else
            RibbonPageFile.Visible = True
        End If
        SplitContainer1.Panel2Collapsed = False
    End Sub
    Sub activate_controls(pStatus As Boolean)
        Try
            Logger.Debug("Sub activate_controls - status = " + pStatus.ToString)
            Me.PanelValidatorControl.Enabled = pStatus
            Me.btnSave.Enabled = pStatus
        Catch ex As Exception
            Logger.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
                Logger.Debug($"GetVariableValue [{INDEX_DMS_ERSTELLT}]...")
                CURRENT_DOC_CREATION_DATE = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT)
            Catch ex As Exception
                Logger.Error(ex)
                If ex.Message.Contains("Variable: " & INDEX_DMS_ERSTELLT & " not found!") Then
                    Logger.Info("1. Ausnahme in Windream_get_Doc_info: Variable: " & INDEX_DMS_ERSTELLT & " not found", True)
                    Logger.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
                    Logger.Info("error in Windream_get_Doc_info 1: " & ex.Message)
                    Return "error in Windream_get_Doc_info 1: " & ex.Message
                End If
            End Try

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

            Try
                Logger.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
                    Logger.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
                    Logger.Debug($"GetVariableValue (2) [{INDEX_DMS_ERSTELLT_ZEIT}]...")
                    CURRENT_DOC_CREATION_TIME = CURRENT_WMFILE.GetVariableValue(INDEX_DMS_ERSTELLT_ZEIT)
                Else
                    Logger.Error(ex)
                    Logger.Info("error in Windream_get_Doc_info 3: " & ex.Message)
                    Return "error in Windream_get_Doc_info 3: " & ex.Message
                End If
            End Try

            Logger.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
            Logger.Error(ex)
            Logger.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
            Logger.Error(ex)
            MsgBox("error in ReturnVektor_IndexValue: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, ADDITIONAL_TITLE)
            Logger.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
                oValuefromSource = CURRENT_WMFILE.GetVariableValue(oSourceIndexName)
            Else
                Logger.Debug($"GetVariableValuefromSource - IDBCase...")
                oValuefromSource = IDBData.GetVariableValue(oSourceIndexName, oIDBTyp, FromIDB)
            End If
            Return oValuefromSource
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try

    End Function

    Sub FillIndexValues(first As Boolean, Optional SingleAttribute As String = "")
        If LOG_PERF Then PerformanceLogger.Info("FillIndexValues")

        Dim oControlType As String
        Dim oIndexName As String
        Dim oControName As String
        Dim oIDBOverride As Boolean = False
        Try
            If DTVWCONTROL_INDEX.Rows.Count > 0 Then
                Dim oCount As Integer = 0
                For Each oControl As Control In Me.PanelValidatorControl.Controls
                    'If SingleAttribute <> "" Then
                    '    oIDBOverride = True
                    '    If SingleAttribute <> oControl.Name Then
                    '        Continue For
                    '    End If
                    'End If

                    Dim oValueFromSource
                    Dim oFormattedValue As String = ""
                    Dim oControlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid
                    Dim oControlRow = (From form In DTVWCONTROL_INDEX.AsEnumerable()
                                       Select form
                                       Where form.Item("GUID") = oControlId).Single()

                    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")
                    ' Wenn kein defaultValue existiert, leeren String setzen
                    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")

                    Logger.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:" & vbNewLine & "for control " & oControl.Name & " no INDEX configured!" & vbNewLine & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical)
                                    Exit For
                                End If
                                If oSourceIndexName Is Nothing = False Then
                                    If oLoadIndex = False Or oSourceIndexName = "DD PM-ONLY FOR DISPLAY" Then
                                        ' Wenn kein Index exisitiert, defaultValue laden
                                        oTextBox.EditValue = oDefaultValue
                                        Logger.Debug("Indexwert soll nicht geladen werden.")
                                        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
                                                Logger.Debug("TextBox with VektorField: " & oSourceIndexName)
                                                Try
                                                    Logger.Debug($"Length of Vektorarray: {oValueFromSource.length}")
                                                Catch ex As Exception
                                                    Logger.Info($"Error in gettin the lenth of vektorfield {oSourceIndexName} - {ex.Message}")
                                                End Try
                                                If oValueFromSource.length = 1 Then
                                                    oValueFromSource = oValueFromSource(0)
                                                Else '
                                                    Logger.Info(" >> Vectorfield " & oSourceIndexName & "' contains more then one value - First value will be used")
                                                    oValueFromSource = oValueFromSource(0)
                                                End If
                                                Logger.Debug($"wertWD has been saved...")

                                            End If
                                        End If
                                    End If

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

                                    Try
                                        'Dim oFormatString As String = oControlRow.ItemEx("CTRL_FORMAT_STRING", "")
                                        'oFormattedValue = ClassFormat.GetFormattedValue(oControl.Name, oValueFromSource, oFormatString)

                                        'If Not IsNothing(oFormattedValue) And oFormattedValue <> String.Empty Then
                                        '    oTextBox.EditValue = ObjectEx.NotNull(oFormattedValue, oDefaultValue)
                                        'Else
                                        '    oTextBox.EditValue = ObjectEx.NotNull(oValueFromSource, oDefaultValue)
                                        'End If

                                        oTextBox.EditValue = ObjectEx.NotNull(oValueFromSource, oDefaultValue)

                                        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
                                            Logger.Warn($"Unexpected error in Set Backcolor [{oControl.Name}]: {ex.Message}")
                                            Logger.Error(ex)
                                        End Try

                                        ControlCreator.GridTables_HandleControlValueChange(PanelValidatorControl, DT_COLUMNS_GRID_WITH_SQL_WITH_CTRL_PLACEHOLDER)

                                    Catch ex As Exception
                                        Logger.Info("Error While converting defaultValue [" & oDefaultValue & "]: " & ex.Message)
                                        oTextBox.EditValue = ""
                                    End Try


                                End If
                            Catch ex As Exception
                                Logger.Error(ex)
                                errormessage = $"Unvorhergesehener Fehler bei FillIndexValues TextBox [{oControl.Name}]:" & vbNewLine & ex.Message & vbNewLine & "Check Logfile"
                                My.Settings.Save()
                                frmError.ShowDialog()
                                Logger.Info("Unexpected error in FillIndexValuesTextBox: " & ex.Message, True)
                                Logger.Info(">> Controltype: " & oControlType)
                                Logger.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:" & vbNewLine & "for control " & oControl.Name & " no INDEX configured!" & vbNewLine & "Bitte prüfen Sie den Formulardesigner!", MsgBoxStyle.Critical)
                                    Exit For
                                End If
                                If oSourceIndexName Is Nothing = False Then
                                    If oLoadIndex = False Or oSourceIndexName = "DD PM-ONLY FOR DISPLAY" Then
                                        If oDefaultValue = String.Empty Then
                                            oMyCombobox.SelectedIndex = -1
                                        Else
                                            oMyCombobox.Text = oDefaultValue
                                        End If
                                        Logger.Debug($" oMyComboBox {oMyCombobox.Name}: Indexwert soll nicht geladen werden.")
                                        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 Then

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

                                        End If
                                        Logger.Debug($"Indexwert from Index {oSourceIndexName}: {oValueFromSource}")
                                        Logger.Debug($"Items in Combobox: {oMyCombobox.Items.Count}")

                                        If oMyCombobox.Items.Count = 0 Then
                                            '    If LogErrorsOnly = False Then Logger.Info($"Index Wert wurde gesetzt")
                                            oMyCombobox.Text = oValueFromSource
                                        Else
                                            '    If LogErrorsOnly = False Then Logger.Info($"Index Wert wurde ausgewählt")
                                            oMyCombobox.SelectedIndex = oMyCombobox.FindStringExact(oValueFromSource)
                                            Logger.Debug($"oMyComboBox {oMyCombobox.Name} .SelectedIndex: {oMyCombobox.SelectedIndex}")

                                        End If
                                    End If
                                End If
                                Logger.Debug("")
                            Catch ex As Exception
                                Logger.Error(ex)
                                Logger.Info(">> Unexpected error in FillIndexValues(Combobox: " & oMyCombobox.Name & "): " & ex.Message, True)
                                Logger.Info(">> Controltype: " & oControlType)
                                Logger.Info(">> Indexname windream: " & oIndexName)
                                errormessage = "Unexpected error in FillIndexValues(Combobox: " & oMyCombobox.Name & "): " & vbNewLine & ex.Message & vbNewLine & "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
                            Dim oDTColumnsPerDevExGrid As DataTable = DT_COLUMNS_GRID.Clone()
                            Try

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

                                    If oValueFromSource Is Nothing = False Then
                                        Dim oValueType = oValueFromSource.GetType.ToString
                                        Logger.Debug($"oValueType is [{oValueType}]!")
                                        'Es wird gegen ein Vektorfeld nachindexiert
                                        If oValueType.Contains("System.Object") Or oValueType = "System.Data.DataTable" Or oValueType = "System.String" Then
                                            Select Case oTyp
                                            'Tabellendarstellung
                                                Case "TABLE"
                                                    Dim oExpression = $"CONTROL_ID = {oControlId}"
                                                    DT_COLUMNS_GRID.Select(oExpression, "SEQUENCE").CopyToDataTable(oDTColumnsPerDevExGrid, LoadOption.PreserveChanges)

                                                    Dim oColValuesfromSource As String()
                                                    Logger.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
                                                            Logger.Debug("ValueFromSource contains {0} items", oValueFromSource)

                                                            For Each Zeile As Object In oValueFromSource
                                                                Logger.Debug($"vektorrow Value {Zeile.ToString}...")
                                                                oColValuesfromSource = Split(Zeile, PMDelimiter)

                                                                Dim oNewRow = oDataSource.NewRow()
                                                                Logger.Debug("Creating new row..")

                                                                For index = 0 To oDTColumnsPerDevExGrid.Rows.Count - 1
                                                                    Logger.Debug("Column Index {0}", index)
                                                                    If oColValuesfromSource.Length > index Then
                                                                        Logger.Debug("Value: {0}", oColValuesfromSource(index))
                                                                        oNewRow.Item(index) = oColValuesfromSource(index)
                                                                    Else
                                                                        Logger.Debug("Value: String.Empty")
                                                                        oNewRow.Item(index) = String.Empty
                                                                    End If
                                                                Next
                                                                Logger.Debug("Adding row to grid..")
                                                                oDataSource.Rows.Add(oNewRow)


                                                            Next
                                                        Else
                                                            If oValueType = "System.String" Then
                                                                Logger.Debug($"IDB Fill Grid [{oControl.Name}] with String")
                                                                Logger.Debug($"oValueFromSource [{oValueFromSource}] - PMDelimiter[{PMDelimiter}]")

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

                                                                Dim oRowData As New List(Of Object)

                                                                For index = 1 To oColValuesfromSource.Length
                                                                    Dim oColumnType = oDTColumnsPerDevExGrid.Rows.Item(index - 1).Item("TYPE_COLUMN")
                                                                    Dim oConvertedValue = ClassFormat.GetConvertedValue(oColValuesfromSource(index - 1), oColumnType)
                                                                    oRowData.Add(oConvertedValue)
                                                                Next

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


                                                            ElseIf oValueType = "System.Data.DataTable" Then
                                                                Dim oMyDatatable As DataTable = oValueFromSource
                                                                Logger.Debug($"IDB Fill Grid [{oControl.Name}] with Datatable - Rows: " & oMyDatatable.Rows.Count)
                                                                For Each oRow As DataRow In oMyDatatable.Rows
                                                                    Try
                                                                        Logger.Debug($"IDB ROW Vector {oRow.Item(0).ToString}...")
                                                                        oColValuesfromSource = Split(oRow.Item(0).ToString, PMDelimiter)

                                                                        If oColValuesfromSource.Length > 8 Then
                                                                            Logger.Warn("Fill Grid with DatatableSplit Error - Max 8 columns can be configured!")
                                                                        End If
                                                                        Logger.Debug($"oColValuesfromSource splitted - Length ({oColValuesfromSource.Length.ToString})")
                                                                        Dim oRowData As New List(Of Object)

                                                                        For index = 1 To oColValuesfromSource.Length
                                                                            Try
                                                                                Dim oColumnType = oDTColumnsPerDevExGrid.Rows.Item(index - 1).Item("TYPE_COLUMN")
                                                                                Logger.Debug($"oColumnType of DGView-Column ({oColumnType.ToString})...")
                                                                                Dim oConvertedValue = ClassFormat.GetConvertedValue(oColValuesfromSource(index - 1), oColumnType)
                                                                                oRowData.Add(oConvertedValue)
                                                                            Catch ex As Exception
                                                                                Logger.Warn($"Error while converting/adding Value to oRowData: " & ex.Message)
                                                                            End Try
                                                                        Next
                                                                        oDataSource.Rows.Add(oRowData.ToArray())
                                                                    Catch ex As Exception
                                                                        Logger.Warn($"Error while adding datarow [{oRow.Item(0).ToString}] to Grid: " & ex.Message)
                                                                    End Try


                                                                Next
                                                            End If

                                                        End If
                                                    Else
                                                        Logger.Info($"DevExpressGrid: There are no columns configured/listed for control {oControlId}.")
                                                    End If

                                                Case Else
                                                    'es handelt sich um ein einfaches Vektorfeld mit einem Wert
                                                    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})
                                                            'dgv.Rows.Add(New String() {obj.ToString})

                                                        End If

                                                    Next
                                            End Select
                                        Else
                                            Logger.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
                                    Try
                                        'Dim oFilteredDatatable As DataTable = DTGRID_COLUMNS.Clone()
                                        'Dim oExpression = $"CONTROL_ID = {oControlRow.Item("GUID")}"
                                        'DTGRID_COLUMNS.Select(oExpression, "SEQUENCE").CopyToDataTable(oFilteredDatatable, LoadOption.PreserveChanges)
                                        Dim oMyGridView As DevExpress.XtraGrid.Views.Grid.GridView = oMyGridControl.MainView
                                        oMyGridView.OptionsView.ColumnAutoWidth = False
                                        'AddHandler oMyGridView.ColumnWidthChanged, AddressOf GridControlColumnWidthChanged
                                        For Each oRow As DataRow In oDTColumnsPerDevExGrid.Rows
                                            For Each oActGridColumn As DevExpress.XtraGrid.Columns.GridColumn In oMyGridView.Columns
                                                Dim oGridDXFieldName = oActGridColumn.FieldName
                                                Dim GridDXColumnEditName = oActGridColumn.ColumnEditName
                                                If oRow.Item("SPALTENNAME") = oGridDXFieldName Then
                                                    oActGridColumn.Width = oRow.Item("SPALTENBREITE")
                                                    Exit For
                                                End If

                                            Next
                                        Next
                                        Dim i = 0

                                        ' RestoreDevExpressGridControl_Layout(CURRENT_CLICKED_PROFILE_ID, oControlId, oMyGridView)
                                    Catch ex As Exception
                                        Logger.Error(ex)
                                    End Try
                                End If
                            Catch ex As Exception
                                Logger.Error(ex)
                                Logger.Info(">> Unexpected error in FillIndexValues(GridControl: " & oMyGridControl.Name & "): " & ex.Message, True)
                                Logger.Info(">> Controltype: " & oControlType)
                                Logger.Info(">> Indexname windream: " & oIndexName)
                                errormessage = "Unexpected error in FillIndexValues(Combobox: " & oMyGridControl.Name & "): " & vbNewLine & ex.Message & vbNewLine & "Check Logfile"
                                My.Settings.Save()
                                frmError.ShowDialog()
                            End Try


                        Case oControl.GetType = GetType(CheckBox)
                            Logger.Debug("Loading checkbox...")
                            oControlType = "CheckBox"
                            If oSourceIndexName = "" Then
                                MsgBox("Attention wrong configuration:" & vbNewLine & "for control " & oControl.Name & " no INDEX configured!" & vbNewLine & "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 oSourceIndexName = "DD PM-ONLY FOR DISPLAY" Then
                                    Logger.Debug("Indexwert soll nicht geladen werden.")
                                End If


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

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

                                End If


                                If oValueFromSource Is Nothing Then
                                    Logger.Info(">> Zurückgegebener Wert des Wertes für Checkbox mit Indexname '" & oIndexName & "' ist nothing. Checking defaultvalue")
                                    Logger.Debug(">> Zurückgegebener Wert des Wertes für Checkbox mit Indexname '" & oIndexName & "' ist nothing. Checking defaultvalue")
                                    If oDefaultValue <> String.Empty Then
                                        Logger.Info($"Using Default value [{oDefaultValue}]")
                                        Logger.Debug($"Using Default value [{oDefaultValue}]")
                                        myCheckBox.Checked = CBool(oDefaultValue)
                                        Exit Select
                                    Else
                                        Logger.Debug("No Default Value for Checkbox - so using false!")
                                        myCheckBox.CheckState = CheckState.Indeterminate
                                    End If


                                Else
                                    Logger.Debug("oValueFromSource: " & oValueFromSource.ToString)
                                    If oValueFromSource.ToString = "" Then
                                        Logger.Info(">> Versuch, default Value zu laden")
                                        If oDefaultValue <> String.Empty Then
                                            Dim result = False
                                            If Boolean.TryParse(oDefaultValue, result) Then
                                                Logger.Info(">> defaultValue wurde geladen")
                                                myCheckBox.Checked = result
                                                If result = False Then
                                                    myCheckBox.CheckState = CheckState.Unchecked
                                                Else
                                                    myCheckBox.CheckState = CheckState.Checked
                                                End If

                                            Else
                                                myCheckBox.Checked = False
                                                myCheckBox.CheckState = CheckState.Unchecked
                                            End If
                                        Else
                                            Logger.Info(">> defaultValue war leer")
                                            myCheckBox.Checked = False
                                            myCheckBox.CheckState = CheckState.Unchecked
                                        End If
                                    Else
                                        Dim _value
                                        If oValueFromSource.ToString = "System.Object[]" Then
                                            Logger.Debug("CheckBoxValue with VectorField: " & oSourceIndexName)
                                            If oValueFromSource.length = 1 Then
                                                _value = oValueFromSource(0)
                                            Else '
                                                Logger.Info(" >> Vectorfield " & oSourceIndexName & "' contains more then one value - First value will be used")
                                                _value = oValueFromSource(0)
                                            End If
                                        Else
                                            _value = oValueFromSource
                                            Logger.Debug($"Value is not nothing and also not System.Object: [{_value}]")
                                        End If
                                        Try
                                            Select Case CBool(_value)
                                                Case True
                                                    Logger.Debug(">> CBool(_value) = True")
                                                    myCheckBox.Checked = True
                                                    myCheckBox.CheckState = CheckState.Checked
                                                Case False
                                                    Logger.Debug(">> CBool(_value) = False")
                                                    myCheckBox.Checked = False
                                                    myCheckBox.CheckState = CheckState.Unchecked
                                            End Select
                                        Catch ex As Exception
                                            Logger.Error(ex)
                                            Logger.Info("Unexpected error in CBool(wertWD) - CheckBox: " & ex.Message & vbNewLine & "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
                                oValueFromSource = GetVariableValuefromSource(oSourceIndexName, oIDBTyp, oIDBOverride)
                                'Dim oWindreamValue = CURRENT_WMFILE.GetVariableValue(oSourceIndexName)
                                Try
                                    oLookup.Properties.SelectedValues = Nothing
                                    oLookup.Properties.SelectedValues = New List(Of String)
                                Catch ex As Exception

                                End Try
                                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

                                        oLookup.Properties.SelectedValues = oArrlist
                                    Else
                                        Dim oArrlist As New List(Of String)
                                        oArrlist.Add(oValueFromSource.ToString)
                                        oLookup.Properties.SelectedValues = oArrlist
                                    End If
                                Else
                                    If Not IsNothing(oLookup.Properties.SelectedValues) Then
                                        If oLookup.Properties.SelectedValues.Count = 0 And oDefaultValue <> String.Empty Then
                                            Dim oValues As List(Of String) = oDefaultValue.Split(",").ToList()
                                            oLookup.Properties.SelectedValues = oValues
                                        End If
                                    End If
                                End If

                            Catch ex As Exception
                                Logger.Error(ex)
                                Logger.Info(" - Unvorhergesehener Unexpected error in AddVorschlag_ComboBox - Indexname: " & oIndexName & " - Fehler: " & vbNewLine & 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:" & vbNewLine & "for control " & oControl.Name & " no INDEX configured!" & vbNewLine & "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
                                        Logger.Debug("DATE über PM-Vektor holen")

                                        oValueFromSource = ReturnVektor_IndexValue(oSourceIndexName)
                                        Logger.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)
                                            Logger.Debug("DATE konnte umgewandelt werden")
                                        Catch ex As Exception
                                            Logger.Error(ex)
                                            Logger.Debug("DATE wurde auf heute gesetzt")
                                        End Try
                                        DTP.Text = tempdate
                                    Else
                                        Logger.Debug("DATE ist leer")
                                        DTP.Text = tempdate
                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)
                                    errormessage = "Unvorhergesehener Fehler bei DTP: " & vbNewLine & ex.Message

                                    Logger.Info("Unexpected error in FillIndex DTP: " & ex.Message & vbNewLine & "Wert WD: " & oValueFromSource.ToString & vbNewLine & "Indexname: " & oSourceIndexName, True)
                                    frmError.ShowDialog()
                                    Logger.Info("Unexpected error in FillIndex DTP: " & ex.Message, True)
                                End Try
                            End If
                    End Select
                    oCount += 1
                Next


                Focus_FirstControl()

                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)

                    For Each oRow As DataRow In oDataTable.Rows

                        Dim oDEPENDING_CTRL_ID = oRow.Item("CONTROL_ID")
                        Dim oDEPENDING_COLUMN = oRow.Item("SPALTENNAME")
                        Dim oSqlCommand = oRow.Item("SQL_COMMAND")
                        Dim oCONNID = oRow.Item("CONNECTION_ID")
                        Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")
                        oSqlCommand = clsPatterns.ReplaceAllValues(oSqlCommand, PanelValidatorControl, True)

                        Try
                            'Dim oDTRESULT_FOR_COLUMN As DataTable = ClassDatabase.Return_Datatable_ConId(oSqlCommand, oCONNID, $"oDEPENDING_CTRL_ID: {oDEPENDING_CTRL_ID}")
                            Dim oDTRESULT_FOR_COLUMN As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(oSqlCommand, DatabaseType.ECM) With {
                                .ConnectionId = oCONNID
                            })

                            If Not IsNothing(oDTRESULT_FOR_COLUMN) Then
                                Logger.Debug($"Trying to create a DropDown(FIV) for CONTROL-ID [{oDEPENDING_CTRL_ID}] - RowCount: [{oDTRESULT_FOR_COLUMN.Rows.Count}] ")
                                For Each oControl As Control In PanelValidatorControl.Controls
                                    Dim oControlId = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata).Guid
                                    If oControlId = oDEPENDING_CTRL_ID Then
                                        ControlCreator.GridTables_CacheDatatableForColumn(oControlId, oDEPENDING_COLUMN, oSqlCommand, oCONNID, oAdvancedLookup)
                                        Exit For
                                    End If
                                Next
                            Else
                                Logger.Warn($"FillIndexValues - oDTRESULT_FOR_COLUMN is nothing!")
                            End If

                        Catch ex As Exception
                            Logger.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
                    Logger.Warn($"FillIndexValues - Unexpected error in creating dropdown for Grid: " & ex.Message)
                End Try

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

                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
                                    'ITEM 1
                                    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
                                    'ITEM 1
                                    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
                                Logger.Debug($"No PM_Info-Configuration!!")
                                RibbonPageGroup2.Visible = False
                            End If
                        Else
                            Logger.Warn($"oDTINFO is nothing!!")
                            RibbonPageGroup2.Visible = False
                        End If
                    Catch ex As Exception
                        Logger.Warn($"Unexpected error in Setting PMINFO - ERROR: {ex.Message}")
                        RibbonPageGroup2.Visible = False
                    End Try

                Else
                    RibbonPageGroup2.Visible = False
                End If

                'Flag setzen das Indexe geladen sind
                _Indexe_Loaded = True

                ' Should the custom Ribbon group be displayed at all?
                ' Will be hidden later if not search results are found
                If RibbonPageCustItm1 <> "" Then
                    Attmt_bbtnitmShow.Caption = RibbonPageCustItm1
                    Attmt_bbtnitmShow.Visibility = BarItemVisibility.Always
                    Attmnt_bbtnitm_LoadonClick.Checked = CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK
                    Attmnt_bbtnitm_LoadonClick.Visibility = BarItemVisibility.Always
                Else
                    Attmt_bbtnitmShow.Visibility = BarItemVisibility.Never
                    Attmnt_bbtnitm_LoadonClick.Visibility = BarItemVisibility.Never
                End If
                Load_Additional_Searches(True)
                ' If Searches should be loaded automatically, not only on click
                If CONFIG.Config.ADDITIONAL_SEARCHES_LOAD_ONCLICK = False And (AdditionalDocResultsExist = True Or AdditionalDataResultsExist = True) Then
                    ' _frmValidatorSearch?.Show()
                    Click_Additional_Searches()
                End If
            Else
                MsgBox("No Form-Mask defined for this profile!" & vbNewLine & "Please inform Your admin!" & vbNewLine & "The validator will be closed!", MsgBoxStyle.Exclamation, "Attention:")
                Me.Close()
            End If

        Catch ex As Exception
            Logger.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}" & vbNewLine & "Check Logfile"
            My.Settings.Save()
            frmError.ShowDialog()
        End Try


    End Sub
    Private Sub frmValidation_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        '  Refresh_FileList()
        Load_Next_Document(True)

        Controls2B_EnDisabled_on_Load()
        _DependingControl_In_Action = False
        _DependingColumn_In_Action = False

        ' 18.10.2021: Brauchen Sie das Überhaupt??
        'Controls2beDisabled()

        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(WMDocPathWindows) And ActiveWorkflowType = ConstAHWorkflow_BlindFile) Then
                If ButtonExport2Folder_Caption <> "" And WMDocPathWindows <> "" Then
                    Logger.Debug("Enabling Export2File, Caption set")
                    Logger.Debug("Button Caption: [{0}]", ButtonExport2Folder_Caption)
                    Logger.Debug("Export root folder: [{0}]", ButtonExport2Folder_RootFolder)

                    If File.Exists(WMDocPathWindows) Then
                        Logger.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
                                        Logger.Debug("Last export path exists, using as default path")
                                        FolderBrowserDialog1.SelectedPath = CONFIG.Config.LastExportPath
                                    Else
                                        FolderBrowserDialog1.SelectedPath = ButtonExport2Folder_RootFolder
                                    End If

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

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

                    End If
                End If
            End If

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

        Logger.Debug("frmValidation_Shown finished!")
    End Sub
    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        btnSave.Enabled = False

        ' TODO: Use when working on Validation
        If ForceGridValidation() = True Then
            Finish_WFStep()
        End If

        btnSave.Enabled = True
    End Sub

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

        Logger.Debug("Forcing grid Validation")

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

            Dim oView As GridView = oGrid.MainView

            If oView.RowCount = 0 Then
                Continue For
            End If

            If DoCellValidation(oView) = False Then
                oValidation = False
            End If

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

            If oValidation = False Then
                Return False
            End If
        Next

        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
            Logger.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
                Logger.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
            Logger.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, "")
                    Logger.Warn($"No valid action provided [{oMsgType}] in btnFinishContinue!")
                    Return False
            End Select
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("An unhandled exeception occured in btnFinish Procedure! Please inform Your WorkflowTeam and Check Your log!" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
            Return False
        End Try
    End Function
    Sub Finish_WFStep(Optional includeFI As Boolean = True)
        btnSave.Enabled = False
        Logger.Debug("Abschluss für Dok: " & CURRENT_DOC_PATH & " gestartet")
        _ItemWorked = True
        Dim oErrorOcurred As Boolean = False
        If OverrideAll = False Then
            'Eingaben auf Form überprüfen
            If Check_UpdateIndexe() = True Then
                If PROFIL_FINISH_SQL <> String.Empty Then
                    If btnFinish_continue() = False Then
                        Exit Sub
                    End If
                End If

                If includeFI = True Then
                    Try
                        Dim oSQL = $"SELECT * FROM TBPM_PROFILE_FINAL_INDEXING WHERE PROFIL_ID = {CURRENT_ProfilGUID} AND ACTIVE = 1 ORDER BY SEQUENCE"
                        Dim oDTFinalIndexing As DataTable
                        oDTFinalIndexing = DatabaseFallback.GetDatatable("TBPM_PROFILE_FINAL_INDEXING", New GetDatatableOptions(oSQL, DatabaseType.ECM) With {
                            .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}",
                            .SortByColumn = "SEQUENCE"
                        })

                        If oDTFinalIndexing?.Rows.Count > 0 Then
                            'Jetzt finale Indexe setzen
                            Logger.Debug("FINAL INDEXING STARTING...")
                            For Each oFinalIndexRow As DataRow In oDTFinalIndexing.Rows
                                Dim oValue As String = oFinalIndexRow.Item("VALUE").ToString
                                Dim oFinalIndex = oFinalIndexRow.Item("INDEXNAME")
                                Logger.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 '###### Indexierung mit variablen SQL ###
                                    Logger.Debug("Indexing wih dynamic sql...")
                                    Dim oGUID = oFinalIndexRow.Item("GUID")
                                    Dim oSQLCommand = oFinalIndexRow.Item("SQL_COMMAND")
                                    Dim oConnectionID = oFinalIndexRow.Item("CONNECTION_ID")
                                    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
                                        _ItemWorked = False
                                    End If
                                    If Not IsNothing(oSQLCommand) Then
                                        Dim oResultfromSQL As Object = DatabaseFallback.GetScalarValueWithConnection(oSQLCommand, oConnectionID)
                                        If Not IsNothing(oResultfromSQL) Then
                                            Logger.Debug($"oResultfromSQL is [{oResultfromSQL.ToString}]")
                                            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
                                                    _ItemWorked = False
                                                Else
                                                    Logger.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
                                            If Len(oResultfromSQL) = 0 Then
                                                If oContinueOnIndifferentState = False Then
                                                    errormessage = "Result from SQL is EmptyValue - Check the SQL and the log"
                                                    My.Settings.Save()
                                                    frmError.ShowDialog()
                                                    oErrorOcurred = True
                                                    _ItemWorked = False
                                                Else
                                                    Logger.Warn($"FinalIndexResult from SQL is EmptyValue - AttributeName [{oFinalIndexRow.Item("INDEXNAME")}] - oContinueOnIndifferentState = true, So continuing with next Attribute")
                                                    Continue For
                                                End If
                                            End If
                                            oValue = oResultfromSQL
                                        Else
                                            Logger.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
                                ReDim Preserve oResult(0)
                                oResult(0) = oValue

                                Logger.Debug($"oIndexType {oIndexType.ToString}")
                                If oIndexType > 4000 And oIndexType < 5000 Then
                                    'If dr.Item("INDEXNAME").ToString.StartsWith("[%VKT") Then
                                    ' Dim PM_String = Return_PM_VEKTOR(value, dr.Item("INDEXNAME"))
                                    'Hier muss nun separat as Vektorfeld indexiert werden
                                    If WMIndexVectofield(oValue, oFinalIndexRow.Item("INDEXNAME"), oFinalIndexRow.Item("PREVENT_DUPLICATES"), oFinalIndexRow.Item("ALLOW_NEW_VALUES")) = False Then
                                        Logger.Debug("Final Vektorindex '" & oFinalIndexRow.Item("INDEXNAME").ToString & "' has beens et suxxessfully!")
                                    Else
                                        errormessage = "Error in final indexing:" & vbNewLine & idxerr_message
                                        My.Settings.Save()
                                        frmError.ShowDialog()
                                        oErrorOcurred = True
                                        _ItemWorked = False
                                    End If
                                Else
                                    Logger.Debug("Now the final 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)
                                        Logger.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
                                            Logger.Debug("FINALER INDEX '" & oFinalIndexRow.Item("INDEXNAME") & "' WURDE ERFOLGREICH GESETZT")

                                            'Nun das Logging
                                            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
                                            Logger.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:" & vbNewLine & idxerr_message
                                        My.Settings.Save()
                                        frmError.ShowDialog()
                                        oErrorOcurred = True
                                        _ItemWorked = False
                                    End If

                                End If
                                If oErrorOcurred = True Then
                                    _ItemWorked = False
                                    Exit For
                                End If
                            Next
                        End If
                    Catch ex As Exception
                        Logger.Warn($"Error in finalIndexing: {ex.Message}")
                        oErrorOcurred = True
                    End Try
                End If
                Try
                    ''Wenn kein Fehler nach der finalen Indexierung gesetzt wurde
                    If Override = True And Override_SQLCommand <> "" Then
                        DatabaseFallback.ExecuteNonQueryECM(Override_SQLCommand)
                    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
                            Logger.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}"
                                ' einen Regulären Ausdruck laden
                                Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
                                ' die Vorkommen im SQL-String auslesen
                                Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(WORK_HISTORY_ENTRY)
                                '####
                                ' alle Vorkommen innerhalb der Namenkonvention durchlaufen
                                For Each element As System.Text.RegularExpressions.Match In elemente
                                    Try
                                        Logger.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
                                                                Logger.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
                                                                Logger.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
                                                                Logger.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
                                                                Logger.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
                                        Logger.Error(ex)
                                        Logger.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
                        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
                        'Close_document_viewer()
                        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) ', "Finish_WFStep2")
                                    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) ', "Finish_WFStep3")
                                    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") & vbNewLine
                                            Next
                                            ClassAnnotation.Annotate_PDF("Workflow History:", AnnotationString, 0, False, 10, 40)
                                        End If
                                    End If
                                End If
                            End If
                        End If

                        'wenn Move2Folder aktiviert wurde
                        If Move2Folder <> "" And (OPERATION_MODE_FS = ClassConstants.OpModeFS_PWM Or OPERATION_MODE_FS = ClassConstants.OpModeFS_IDBWM) Then
                            idxerr_message = allgFunk.Move2Folder(WMDocPathWindows, Move2Folder, CURRENT_ProfilGUID, WINDREAM_ALLG)
                            If idxerr_message <> "" Then
                                errormessage = "Fehler bei Move2Folder:" & vbNewLine & idxerr_message
                                My.Settings.Save()
                                frmError.ShowDialog()
                                oErrorOcurred = True
                                _ItemWorked = False
                            End If
                        End If



                    End If

                Catch ex As Exception
                    Logger.Error(ex)
                    errormessage = "Unexpected error in Finish:" & ex.Message
                    My.Settings.Save()
                    frmError.ShowDialog()
                    oErrorOcurred = True
                    _ItemWorked = False
                    Logger.Info("Unexpected error in Finish: " & ex.Message, True)
                    Exit Sub
                End Try
            Else
                'lblerror.Visible = True
                'lblerror.Text = errmessage
                errormessage = oErrMsgMissingInput
                frmError.ShowDialog()
                oErrorOcurred = True
                _ItemWorked = False
                Exit Sub
            End If
        Else
            Logger.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
            ' Wert muss für den nächsten Beleg wieder zurückgesetzt werden.
            OverrideAll = False
        End If
        If oErrorOcurred = True Then
            MsgBox("Unhandled error occured in Finish Workflow-Step...Please check your log!", MsgBoxStyle.Exclamation, ADDITIONAL_TITLE)
            _ItemWorked = False
        Else
            Logger.Debug("Validation of document ended successfully!")
            Dim oPROCSQL = $"EXEC PRPM_CHECK_NEXT_WF {CURRENT_DOC_GUID}"
            If DatabaseFallback.ExecuteNonQueryECM(oPROCSQL) = False Then
                Logger.Warn($"Attention: Error executing proc {oPROCSQL}")
            End If
        End If

        If CURRENT_JUMP_DOC_GUID <> 0 Then
            Me.Close()
        Else
            'Das nächste Dokument laden
            Load_Next_Document(False)

            Focus_FirstControl()

        End If

        btnSave.Enabled = True
    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
            Logger.Error(ex)
            Logger.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
            Logger.Error(ex)
            Logger.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(input As String, 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

            ' Add the new value
            oValueList.Add(input)
        Else
            ' Just add input as the only value
            oValueList.Add(input)
        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
                Logger.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() As Boolean
        Dim oControlName
        Dim oControlId As String
        Try
            Dim oMissing As Boolean = False
            'Jedes Control auf panel durchlaufen
            For Each oControl As Control In Me.PanelValidatorControl.Controls
                'Der input der Box,Cmb muss jedes mal geleert werden
                Dim oMyInput As String = ""
                'Jedes Control in Konfig Tab durchlaufn
                For Each oControlRow As DataRow In DTVWCONTROL_INDEX.Rows
                    Dim oCtrlType = oControlRow.Item("CTRL_TYPE").ToString
                    'Den Indexnamen auslesen
                    Dim oIndexName As String = oControlRow.Item("INDEX_NAME")
                    If oCtrlType = "LBL" Or oCtrlType = "LINE" Or oCtrlType = "BUTTON" Then
                        Continue For
                    End If
                    If oIndexName = "@@DISPLAY_ONLY" Then
                        'Logger.Debug($"Index [{oIndexName}] will be skipped")
                        Continue For
                    End If


                    Dim oDBControlName = oControlRow.Item("CTRL_NAME").ToString
                    Dim oIsRequired As Boolean = CBool(oControlRow.Item("VALIDATION"))
                    Dim oSQLCheckCommand As String = IIf(IsDBNull(oControlRow.Item("SQL_UEBERPRUEFUNG")), "", oControlRow.Item("SQL_UEBERPRUEFUNG"))
                    Dim oIsReadOnly As Boolean = CBool(oControlRow.Item("READ_ONLY"))
                    Dim oSaveChangeEnabledFalse As Boolean = CBool(oControlRow.Item("SAVE_CHANGE_ON_ENABLED"))
                    'Wenn eine Ablehnung aktiv ist und der Index identisch ist, dann skipping
                    If REJECTION_ACTIVE = True And (oIndexName = PROFIL_REJECT_ACTIONS_ATTRIBUTE Or oIndexName = PROFIL_REJECT_COMMENT_ATTRIBUTE) Then
                        Logger.Debug($"Index [{oIndexName}] will be skipped as Rejection is in progress!")
                        Continue For
                    End If
                    'Readonly felder werden über finale indexe gefüllt, nicht mit SetControlData
                    If oIsReadOnly = True And oSaveChangeEnabledFalse = False Then
                        Logger.Debug($"Skipping ReadOnly ControlName [{oDBControlName}] !")
                        Continue For
                    End If


                    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")

                    'Nur wenn der Name der Zeile entspricht und der Index READ_ONLY FALSE ist
                    If oDBControlName = oControl.Name And oIndexName <> "DD PM-ONLY FOR DISPLAY" Then
                        Logger.Debug("Indexierung für Control (" & oControlId & ") '" & oControlName & "' gestartet. Indexname '" & oIndexName & "'")
                        If oIndexName = "" Then
                            Logger.Info(" >> Indexname is unexpected empty.")
                            Continue For
                        End If
                        Select Case True
                            Case oControl.GetType = GetType(LookupControl3)
                                Try
                                    Dim lookup As LookupControl3 = oControl
                                    If lookup.Properties.SelectedValues.Count = 0 And oIsRequired = True Then
                                        oMissing = True
                                        oErrMsgMissingInput = $"Kein Auswahl getroffen in LookupGrid '{oControl.Name}'"
                                        Logger.Warn($"Kein Auswahl getroffen in LookupGrid '{oControl.Name}'")
                                        oControl.BackColor = Color.Red
                                        Exit For
                                    Else

                                        If lookup.Properties.MultiSelect = True Then
                                            Dim oLookupRows As Integer = lookup.Properties.SelectedValues.Count

                                            'Wenn kein Wert ausgewählt wurde und der Index aber gesetzt werden muss
                                            If oLookupRows > 0 Then
                                                Dim ZeilenGrid As Integer = 0
                                                Dim myVektorArr As String()
                                                'Jeden Werte des Datagridviews durchlaufen
                                                For Each value As String In lookup.Properties.SelectedValues
                                                    If value Is Nothing = False Then
                                                        'Das Array anpassen
                                                        ReDim Preserve myVektorArr(ZeilenGrid)
                                                        'Den Wert im Array speichern
                                                        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
                                                        Logger.Warn($"Error while indexing [{oIndexName}] von LookupGrid - ERROR: " & idxerr_message)
                                                        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"
                                                        Logger.Warn($"Error while indexing IDB-Object LookupGrid [{oIndexName}] ")
                                                        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
                                                        Logger.Warn($"Error while indexing LookupGrid [{oIndexName}] ")
                                                        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
                                            oMyInput = lookup.Properties.SelectedValues.FirstOrDefault()
                                            If IsNothing(oMyInput) And oIsRequired = True Then
                                                oMissing = True
                                                oErrMsgMissingInput = $"Could not get FirstOrDefault-Value of LookUpGrid! - LookUPGridName: {lookup.Name}"
                                                Logger.Warn(oErrMsgMissingInput)
                                                Exit For
                                            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
                                            'den aktuellen Wert in windream auslesen
                                            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 '
                                                                Logger.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
                                                    Logger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is NOTHING!")
                                                    oValueIsIndifferent = True
                                                End If
                                                If oValueIsIndifferent = False Then
                                                    If IsDBNull(oValueFromObject) Then
                                                        Logger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is DBNULL!")
                                                        oValueIsIndifferent = True
                                                    End If
                                                End If
                                                Dim oValueSourceIsDifferent As Boolean = False
                                                If oValueIsIndifferent = False Then
                                                    Logger.Debug($"CheckUpdateIndex.LookUpGrid: oValueFromObject is [{oValueFromObject}]")
                                                    Try
                                                        If oValueFromObject <> oMyInput Then
                                                            oValueSourceIsDifferent = True
                                                            Logger.Debug($"CheckUpdateIndex.LookUpGrid: There is a difference between oValueFromObject and  [{oValueFromObject}]")
                                                        End If
                                                    Catch ex As Exception
                                                        oValueSourceIsDifferent = True
                                                        Logger.Debug($"oValueFromObject <> oMyInput not possible as one object might be a multiple row object")
                                                    End Try

                                                Else

                                                End If

                                                'wenn Wert in Windream <> der Eingabe darf indexiert werden
                                                'IsNothing(oValueFromObject) Or oValueFromObject <> oMyInput
                                                If (oValueIsIndifferent = True Or oValueSourceIsDifferent = True) Then
                                                    'Wenn der Wert in ein Vektorfeld geschrieben wird
                                                    If oIndexName.StartsWith("[%VKT") Then
                                                        oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                                        'Hier muss nun separat as Vektorfeld indexiert werden
                                                        If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                            oMissing = True
                                                            oErrMsgMissingInput = "Error while indexing Textbox as VEKTOR - ERROR: " & idxerr_message
                                                            Logger.Warn(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
                                                                oMissing = True
                                                                oErrMsgMissingInput = "Error while indexing Textbox - ERROR: " & idxerr_message
                                                                Logger.Warn(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 oLogStr = Return_LOGString(oMyInput, oValueFromObject, oIndexName)
                                                                WMIndexVectofield(oLogStr, PROFIL_LOGINDEX)
                                                                'Else
                                                                '    IDBData.SetVariableValue(PROFIL_LOGINDEX, oLogStr)
                                                            End If
                                                        End If
                                                        'Nun das Logging


                                                    End If
                                                End If
                                            End If
                                        End If

                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)

                                End Try

                            Case oControl.GetType = GetType(DevExpress.XtraEditors.TextEdit) Or oControl.GetType = GetType(MemoEdit)
                                Try
                                    'Dim oWrongInputMessage = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.WrongInputControl")
                                    Dim oWrongInputMessage = S.Falsche_Eingabe

                                    Logger.Debug("Validating Textbox..")

                                    If oRegexMatch <> String.Empty AndAlso Not Regex.IsMatch(oControl.Text, oRegexMatch) Then
                                        oMissing = True

                                        oErrMsgMissingInput = oWrongInputMessage & " textbox '" & oControl.Name & "'"

                                        Logger.Warn(oErrMsgMissingInput)
                                        If oRegexMessage <> String.Empty Then
                                            oErrMsgMissingInput &= ":" & vbCrLf & oRegexMessage
                                        End If

                                        oControl.BackColor = Color.Red
                                        Exit For
                                    End If

                                    'as erstes überprüfen ob überhaupt etwas eingetragen worden ist
                                    If Check_Missing_Control_Value(oControl, "txt") = True And oIsRequired = True Then 'NICHTS EINGETRAGEN
                                        oMissing = True
                                        oErrMsgMissingInput = oWrongInputMessage & " textbox '" & oControl.Name & "'"
                                        Logger.Warn(oErrMsgMissingInput)
                                        oControl.BackColor = Color.Red
                                        Exit For
                                    Else
                                        Logger.Debug("Reading current value from Textbox")

                                        Dim oTextEdit As BaseEdit = DirectCast(oControl, BaseEdit)
                                        oMyInput = ClassFormat.GetStringValue(oTextEdit.EditValue)

                                        Logger.Debug("Form Value: [{0}]", oMyInput)

                                        'den aktuellen Wert in windream auslesen
                                        Dim oSourceValue = GetVariableValuefromSource(oIndexName, oIDBTyp)

                                        Logger.Debug("Current Value: [{0}]", oSourceValue)

                                        If oIndexName.StartsWith("[%VKT") Then
                                            oSourceValue = ReturnVektor_IndexValue(oIndexName)
                                        Else
                                            'wertWD = CURRENT_WMFILE.GetVariableValue(oIndexName)
                                            If Not IsNothing(oSourceValue) Then
                                                If oSourceValue.ToString = "System.Object[]" Then
                                                    If oSourceValue.Length = 1 Then
                                                        oSourceValue = oSourceValue(0)
                                                    Else '
                                                        Logger.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

                                        Logger.Debug("Preparing Indexing for Textbox")

                                        'wenn Wert in Windream <> der Eingabe darf indexiert werden
                                        If oSetValue = True Then
                                            'Wenn der Wert in ein Vektorfeld geschrieben wird
                                            If oIndexName.StartsWith("[%VKT") Then
                                                oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                                'Hier muss nun separat as Vektorfeld indexiert werden
                                                If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                    oMissing = True
                                                    oErrMsgMissingInput = "Error while indexing textbox as VEKTOR - ERROR: " & idxerr_message
                                                    Logger.Warn(oErrMsgMissingInput)
                                                    Exit For
                                                End If
                                            Else
                                                If IDB_ACTIVE = False Then
                                                    Dim result() As String
                                                    ReDim Preserve result(0)
                                                    result(0) = oMyInput

                                                    Logger.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 - ERROR: " & idxerr_message
                                                        Logger.Warn(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)
                                                        'Else
                                                        'IDBData.SetVariableValue(PROFIL_LOGINDEX, oMyLogString)
                                                    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"
                                    Logger.Error(ex)
                                    Dim st As New StackTrace(True)
                                    st = New StackTrace(ex, True)
                                    Logger.Warn("Unexpected error in Check_UpdateIndexe  TextBox :" & ex.Message, True)
                                    Return False
                                End Try

                            Case oControl.GetType = GetType(System.Windows.Forms.ComboBox)
                                Try
                                    Logger.Debug($"Working on Combobox...")
                                    Dim cmb As Windows.Forms.ComboBox = oControl
                                    'Wenn kein Wert ausgewählt wurde und der Index aber gesetzt werden muss
                                    If cmb.SelectedIndex = -1 And oIsRequired = True Then
                                        oMissing = True
                                        oErrMsgMissingInput = "Please Choose an entry out of ComboBox '" & cmb.Name & "'"
                                        Logger.Warn(oErrMsgMissingInput)
                                        Exit For
                                        'ElseIf cmb.SelectedIndex <> -1 Then
                                    Else 'Änderung 28.08.2018: Ein leerer Wert in der Combobox wird in den Index geschrieben
                                        oMyInput = cmb.Text
                                        Logger.Debug($"inputvalue Combobox: {cmb.Text}")
                                        Dim oValue
                                        'den aktuellen Wert in windream auslesen
                                        If oIndexName.StartsWith("[%VKT") Then
                                            oValue = ReturnVektor_IndexValue(oIndexName)
                                        Else
                                            oValue = GetVariableValuefromSource(oIndexName, oIDBTyp)
                                        End If
                                        If IsNothing(oValue) Then
                                            Logger.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
                                            Logger.Debug($"Exception while oValue.ToString = System.Object[]...")
                                        End Try
                                        If oIndexType = "Vector" Then
                                            Logger.Debug($"Control with ID{oControlId} is a vectorfield...")
                                            If oValue.Length = 1 Then
                                                oValue = oValue(0).ToString
                                            Else '
                                                Logger.Info(" >> Vectorfield " & oIndexName & "' contains more then one value - First value will be used")
                                                oValue = oValue(0).ToString
                                            End If
                                        Else
                                            Logger.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
                                                Logger.Warn($"Could not convert the oValue of Control with ID{oControlId}...")
                                                Logger.Error(ex.Message)
                                                oitsadifference = True
                                            End Try
                                            'wenn Wert in Windream <> der Eingabe darf indexiert werden
                                            If oitsadifference = True Then
                                                Logger.Debug($"Index with ID{oControlId} will now be indexed...")
                                                'Wenn der Wert in ein Vektorfeld geschrieben wird
                                                If oIndexName.StartsWith("[%VKT") Then
                                                    oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                                    'Hier muss nun separat as Vektorfeld indexiert werden
                                                    If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                        oMissing = True
                                                        oErrMsgMissingInput = "Error while indexing Combobox as VEKTOR - ERROR: " & idxerr_message
                                                        Logger.Warn(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
                                                            Logger.Warn(oErrMsgMissingInput)
                                                            Exit For
                                                        End If
                                                    Else
                                                        If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                            cmb.DroppedDown = True
                                                            oMissing = True
                                                            oErrMsgMissingInput = "Error indexing combobox idb"
                                                            Logger.Warn(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)
                                                            'Else
                                                            'IDBData.SetVariableValue(PROFIL_LOGINDEX, ologStr)
                                                        End If

                                                    End If
                                                    'Nun das Logging

                                                End If
                                            Else
                                                Logger.Debug($"oitsadifference = False...Index with ID {oControlId} will not be indexed...")
                                                'Wenn der Wert in ein Vektorfeld geschrieben wird
                                            End If
                                        End If



                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)
                                    Dim st As New StackTrace(True)
                                    st = New StackTrace(ex, True)
                                    MsgBox($"Unexpected error in Check_UpdateIndexe Combobox : ID{oControlId} " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Error:")
                                    Logger.Info($"Unexpected error in Check_UpdateIndexe Combobox : ID{oControlId}" & ex.Message)
                                    Return False
                                End Try

                            Case oControl.GetType = GetType(DateTimePicker)
                                Try
                                    Dim dtp As DateTimePicker = oControl
                                    'Wenn kein Wert ausgewählt wurde und der Index aber gesetzt werden muss
                                    If oIsRequired = True And dtp.Value.ToString = String.Empty Then
                                        oMissing = True
                                        oErrMsgMissingInput = "Please Choose DateValue for field'" & dtp.Name & "'"
                                        Logger.Warn(oErrMsgMissingInput)
                                        Exit For
                                    ElseIf dtp.Value.ToString <> "01.01.0001 00:00:00" Then
                                        oMyInput = CDate(dtp.Value)
                                        'den aktuellen Wert in windream auslesen
                                        ' Dim wertWD As String = CURRENT_WMFILE.GetVariableValue(_IDXName)
                                        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
                                        'wenn Wert in Windream <> der Eingabe darf indexiert werden
                                        If oObjectValue <> oMyInput Then
                                            'Wenn der WErt in ein Vektorfeld geschrieben wird
                                            If oIndexName.StartsWith("[%VKT") Then
                                                'Input = die String komponente as String
                                                oMyInput = Return_PM_VEKTOR(oMyInput, oIndexName)
                                                'Hier muss nun separat as Vektorfeld indexiert werden
                                                If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                    oMissing = True
                                                    oErrMsgMissingInput = "Error while indexing DatePicker as VEKTOR - ERROR: " & idxerr_message
                                                    Logger.Warn(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
                                                        Logger.Warn(oErrMsgMissingInput)
                                                        Exit For
                                                    End If
                                                Else
                                                    If IDBData.SetVariableValue(oIndexName, oMyInput) = False Then
                                                        oMissing = True
                                                        oErrMsgMissingInput = "Error indexing datepicker idb"
                                                        Logger.Warn(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)
                                                        'Else
                                                        'IDBData.SetVariableValue(PROFIL_LOGINDEX, oLogstr)
                                                    End If
                                                End If
                                            End If
                                        Else
                                            Logger.Debug("Value WD ('" & oObjectValue.ToString & "') = Input-value ('" & oMyInput.ToString & "')")

                                        End If
                                    Else
                                        Logger.Debug("DateValue is 01.01.0001 00:00:00")
                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)
                                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
                                        oMissing = True
                                        oErrMsgMissingInput = "Please set Checkbox value for field '" & chk.Name & "'"
                                        Logger.Warn(oErrMsgMissingInput)
                                        Exit For
                                    End If

                                    'den aktuellen Wert in windream auslesen
                                    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 '
                                                    Logger.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



                                    ' Dim Bool_WD = CBool(CURRENT_WMFILE.GetVariableValue(_IDXName))
                                    'wenn Wert in Windream <> der Eingabe darf indexiert werden
                                    If 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
                                            'Input = die String komponente mit Boolean as String
                                            oMyInput = Return_PM_VEKTOR(chk.Checked.ToString, oIndexName)
                                            'Hier muss nun separat as Vektorfeld indexiert werden
                                            If WMIndexVectofield(oMyInput, PROFIL_VEKTORINDEX) = True Then
                                                oMissing = True
                                                oErrMsgMissingInput = "Error while indexing Checkbox as VEKTOR - ERROR: " & idxerr_message
                                                Logger.Warn(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
                                                    Logger.Warn(oErrMsgMissingInput)
                                                    Exit For
                                                End If
                                            Else
                                                If IDBData.SetVariableValue(oIndexName, chk.Checked.ToString) Then
                                                    oErrMsgMissingInput = "error indexing checkboxidb"
                                                    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)
                                                    'Else
                                                    'IDBData.SetVariableValue(PROFIL_LOGINDEX, oLogstr)
                                                End If
                                            End If

                                        End If
                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)
                                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
                                        ' MsgBox(row.Cells(0).Value.GetType.ToString)
                                        If row.Cells(0).Value Is Nothing = False Then
                                            Zeilen += 1
                                        End If
                                    Next
                                    'Wenn kein Wert ausgewählt wurde und der Index aber gesetzt werden muss
                                    If oIsRequired = True And Zeilen = 0 Then
                                        oMissing = True
                                        oErrMsgMissingInput = "Fehlende Eingabe in Vektorfeld '" & dgv.Name & "'"
                                        Logger.Warn(oErrMsgMissingInput)
                                        Exit For
                                    ElseIf Zeilen > 0 Then
                                        Dim ZeilenGrid As Integer = 0
                                        Dim myVektorArr As String()
                                        'Jeden Werte des Datagridviews durchlaufen
                                        For Each row As DataGridViewRow In dgv.Rows
                                            Dim exists = False
                                            Select Case oControlType
                                                Case "TABLE"
                                                    ' MsgBox(row.Cells(0).Value.GetType.ToString)
                                                    Dim str As String
                                                    If row.Cells(0).Value Is Nothing = False Then
                                                        'Das Array anpassen
                                                        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
                                                        'Den Wert im Array speichern
                                                        myVektorArr(ZeilenGrid) = str
                                                        ZeilenGrid += 1

                                                    End If
                                                Case Else
                                                    ' MsgBox(row.Cells(0).Value.GetType.ToString)
                                                    If row.Cells(0).Value Is Nothing = False Then
                                                        'Das Array anpassen
                                                        ReDim Preserve myVektorArr(ZeilenGrid)
                                                        'Den Wert im Array speichern
                                                        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
                                                Logger.Warn(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"
                                                    Logger.Warn(oErrMsgMissingInput)
                                                    Exit For
                                                End If
                                            End If
                                        End If
                                        'Jetzt die Datei indexieren
                                    End If
                                Catch ex As Exception
                                    Logger.Error(ex)
                                End Try

                            Case oControl.GetType = GetType(GridControl)
                                Dim oGrid As GridControl = oControl
                                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
                                    Exit For
                                End If


                        End Select
                    End If  'End If für Control und ReadOnly = False
                Next

                ' If Error happened in inner For, exit the outer as well
                If oMissing = True Then
                    Logger.Info("oMissing = True...Exiting")
                    Exit For
                End If
            Next
            If oMissing = True Then
                Logger.Warn("Check_UpdateIndexe: ERROR or Missing Indexing - returning False")
                Return False
            Else
                Logger.Debug("Check_UpdateIndexe: Everything OK - returning True")
                Return True
            End If

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

    End Function

    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

            Logger.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
                pMissingMessage = "Fehlende Eingabe in Tabelle '" & pGrid.Name & "'"
                pGrid.BackColor = Color.Red
                Logger.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}'"
                                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
                    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
                                item = ObjectEx.NotNull(item, String.Empty)
                                ' Convert to string using InvariantCulture, so converting back from string does not screw up values
                                If TypeOf item IsNot String Then
                                    item = String.Format(CultureInfo.InvariantCulture, "{0}", item)
                                End If
                                oValueList.Add(item)
                            Next

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

                            ' 22.10.2021 Attempt at fixing empty lines appearing in indexes
                            Logger.Debug("Grid Value before saving: [{0}]", str)
                            If str.Trim.Length = 0 Or str.Trim.Replace(PMDelimiter, "").Length = 0 Then
                                Logger.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
                        Logger.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
                            Logger.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
                        'oErrorMessage = "Error while indexing der Tabelle - ERROR: " & idxerr_message
                        pMissingMessage = $"Error while indexing table (2) {pGrid.Name} - ERROR: " & idxerr_message
                        Logger.Warn(pMissingMessage)
                        'Exit For
                        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
                            Logger.Debug("User cleared the grid, so data needs to be erased!")
                            IDBData.Delete_AttributeData(CURRENT_DOC_ID, pSettings.IndexName)
                        End If
                    Else
                        Logger.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
            Logger.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
                    Logger.Debug("Indexing Index '" & pIndexName & "' with Arrayvalue")

                    For Each oValue In pIndexValues
                        Try
                            Logger.Debug("Current Index Value for [{0}] is [{1}]", pIndexName, oValue)
                        Catch ex As Exception
                            Logger.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
                    Logger.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
            Logger.Error(ex)
            idxerr_message = "Unexpected error in Indexiere_File: " & ex.Message.ToString
            Logger.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()
        Try
            Logger.Debug("Skipping document....(Datei_ueberspringen)")
            'Das Dokument freigeben
            Free_File()
            Dim oSQL = $"EXECUTE PRPM_FILES_NOT_INDEXED '{USER_USERNAME}',{CURRENT_ProfilGUID},'{WMDocPathWindows}',{CURRENT_DOC_GUID}"
            DatabaseFallback.ExecuteNonQueryECM(oSQL)
            Logger.Debug($"Skipped DocGUID {CURRENT_DOC_GUID}")
            Load_Next_Document(False)
        Catch ex As Exception
            Logger.Error(ex)
            MsgBox("Fehler bei Überspringen:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
    Private Function Free_File()
        Try
            Dim sql = $"UPDATE TBPM_PROFILE_FILES SET EDIT = 0, IN_WORK = 0, IN_WORK_WHEN = NULL, WORK_USER = NULL WHERE GUID = {CURRENT_DOC_GUID}"
            Return DatabaseFallback.ExecuteNonQueryECM(sql)
        Catch ex As Exception
            Logger.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?" & vbNewLine & "Danach wird die nächste Datei angezeigt!", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
            If result = MsgBoxResult.Yes Then
                Try
                    DocumentViewerValidator.CloseDocument()
                    DocumentViewerValidator.Done()
                Catch ex As Exception
                    Logger.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
            Logger.Error(ex)
            MsgBox("Fehler bei Löschen windream-Datei:" & vbNewLine & 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()
                        Logger.Debug("## Delete_WMFile WMFile unlocked! ##")
                    End If
                    Try
                        CURRENT_WMFILE.Delete()
                        Logger.Info("Manual deleting of file [" & CURRENT_WMFILE.aName & "] successfull!")
                        Return True
                    Catch ex As Exception
                        Logger.Warn($"Could not delete via windream-function - ERROR: [{ex.Message}] {vbNewLine} Trying system.io...")
                        Try
                            Try
                                CURRENT_WMFILE.unlock()
                            Catch exul As Exception
                                Logger.Warn($"Could not unlock WMFile - ERROR: [{exul.Message}] - now teh system.io.Delete...")
                            End Try
                            WMDocPathWindows = ""
                            CURRENT_DOC_PATH = ""
                            CURRENT_WMFILE = Nothing
                            File.Delete(WMDocPathWindows)
                            Logger.Info("Deleting of file via system.io [" & WMDocPathWindows & "] successfull!")
                            Return True
                        Catch ex1 As Exception
                            Logger.Warn($"Could not delete via System.IO - ERROR: [{ex1.Message}] {vbNewLine} Trying system.io...")
                            Return False
                        End Try

                    End Try
                Catch ex As Exception
                    Logger.Error(ex)
                    MsgBox("Das windream-Objekt konnte nicht gelöscht werden!" & vbNewLine & vbNewLine & "Fehlermeldung:" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
                    Logger.Info(" windream-Objekt konnte nicht gelöscht werden - Fehlermeldung: " & ex.Message, True)
                    Return False
                End Try
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Logger.Info("Fehler bei Delete_File")
            Logger.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 WMDocPathWindows 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
            Datei_ueberspringen()
        ElseIf e.KeyCode = Keys.F2 Then
            If USER_GHOST_MODE_ACTIVE Then
                Exit Sub
            End If

            btnSave.Enabled = False
            Finish_WFStep()
            btnSave.Enabled = True
        End If

    End Sub

    Private Sub frmValidator_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing

    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)
        'Dim oMsg = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("F2forSave")
        ToolTip1.Show(S.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
            bsiInformation.ItemAppearance.Normal.BackColor = Color.FromName(pColor)
            bsiInformation.ItemAppearance.Normal.ForeColor = GraphicsEx.GetContrastedColor(Color.FromName(pColor))
        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 WMDocPathWindows <> "" Then
            Try
                Cursor = Cursors.WaitCursor
                Dim oShellExecuteInfo As New SHELLEXECUTEINFO
                oShellExecuteInfo.cbSize = Marshal.SizeOf(oShellExecuteInfo)
                oShellExecuteInfo.lpVerb = "properties"
                oShellExecuteInfo.lpFile = WMDocPathWindows
                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:" & vbNewLine & 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
        Click_Additional_Searches()
    End Sub
    Sub Click_Additional_Searches()
        Try
            _frmValidatorSearch?.Close()
            _frmValidatorSearch = New frmValidatorSearch(Me, Environment)
            _frmValidatorSearch.Show()
        Catch ex As Exception
            Logger.Error(ex)
        End Try
        Load_Additional_Searches(False)
    End Sub
    Private Sub bbtniRefresh_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniRefresh.ItemClick
        Reload_Controls("")
        Try
            'btnSave.Text = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("frmValidator.ValidationButton")
            btnSave.Text = S.Speichern___Nächster_Vorgang__F2_
        Catch ex As Exception

        End Try
        listChangedLookup.Clear()
        SetStatusLabel("All Data refreshed", "Yellow")
    End Sub

    Private Sub bbtniNext_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtniNext.ItemClick
        If ForceGridValidation() = True Then
            Reset_CurrentReferences()
            Datei_ueberspringen()
        End If
    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()

        load_viewer()
    End Sub

    Private Sub BbtnItm_ItemClick(sender As Object, e As ItemClickEventArgs) Handles BbtnitmSave.ItemClick
        If ForceGridValidation() = True Then
            Dim oRESULT As String
            'oRESULT = ClassAllgemeineFunktionen.GUI_LANGUAGE_INFO("InputSaved")
            oRESULT = S.Eingaben_gespeichert

            If Check_UpdateIndexe() = True Then
                SetStatusLabel($"Data saved", "LimeGreen")
                Logger.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")
            End If
        End If
    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
            Logger.Error(ex)
            Logger.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
            Logger.Error(ex)
            Logger.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
        Click_Additional_Searches()
    End Sub

    Private Sub barbtnitmExport_ItemClick(sender As Object, e As ItemClickEventArgs) Handles barbtnitmExport.ItemClick
        If File.Exists(WMDocPathWindows) = 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(WMDocPathWindows)
            oExtension = Path.GetExtension(WMDocPathWindows)
            oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbNewLine &
                $"EXEC dbo.PRPM_GETFILENAME_EXPORT {CURRENT_DOC_ID}, 1, @Outputfilename = @Filename OUTPUT;" & vbNewLine &
                "SELECT @Filename"

            Dim oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
            If Not IsNothing(oExportFilename) Then
                If IsDBNull(oExportFilename) Then
                    Logger.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(WMDocPathWindows, oTempFullFilename) = False Then
                                    Logger.Warn("File [{0}] could not be converted to plain PDF!", WMDocPathWindows)
                                    oFile2Export = WMDocPathWindows
                                Else
                                    Logger.Info("File [{0}] successfully converted to plain PDF!", oTempFullFilename)
                                    Logger.Info("File [{0}] successfully converted to plain PDF!", WMDocPathWindows)
                                    oFile2Export = oTempFullFilename
                                End If
                            Else
                                Logger.Warn("No converting as File [{0}] not ending with pdf [{1}]", WMDocPathWindows, oExtension.ToLower)
                                oFile2Export = WMDocPathWindows
                            End If
                        Else
                            Logger.Warn("No converting as barbtnitmExport.Tag.ToString <> Convert to PDF")
                            oFile2Export = WMDocPathWindows
                        End If
                    Else
                        oFile2Export = WMDocPathWindows
                    End If
                    Logger.Info("Final export path is: [{0}]", oFile2Export)
                    File.Copy(oFile2Export, oTargetPath)
                    Logger.Info($"File {WMDocPathWindows} exported successfully!")
                    oCount += 1
                Else
                    MsgBox("Error encountered while extracting Export-Filename!" & vbNewLine & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                End If
            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
                        oFileCount += 1
                        oSQLGetFilename = $"DECLARE @Filename Varchar(512) " & vbNewLine &
                         $"EXEC dbo.PRPM_GETFILENAME_EXPORT {oDocID}, {oFileCount}, @Outputfilename = @Filename OUTPUT;" & vbNewLine &
                        "SELECT @Filename"
                        oExportFilename = DatabaseFallback.GetScalarValueECM(oSQLGetFilename)
                        oExtension = Path.GetExtension(oFromFilename)
                        If Not IsNothing(oExportFilename) Then
                            If IsDBNull(oExportFilename) Then
                                Logger.Info($"#### ATTENTION: oExportFilename is DBNULL - SQL: {oSQLGetFilename}")
                                oExportFilename = ""
                            End If
                            If oExportFilename <> String.Empty Then
                                oTargetPath = FolderBrowserDialog1.SelectedPath & "\" & oExportFilename & oExtension
                                File.Copy(oFromFilename, oTargetPath)
                                oCount += 1
                            Else
                                Dim omsg = $"Error encountered while extracting ATTACHMENT-Export-Filename  DocID [{oDocID}]!"
                                Logger.Info($"#### ATTENTION: {omsg} SQL: {oSQLGetFilename}")
                                MsgBox(omsg & vbNewLine & "Please inform Admin-Team!", MsgBoxStyle.Critical, ADDITIONAL_TITLE)
                            End If
                        End If
                        'oFilenameOnly = Path.GetFileName(oFromFilename)

                    End If
                Next
            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
            Logger.Error(ex)
            MsgBox("Could not move file to target: " & vbNewLine & 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
            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!" & vbNewLine & "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
                Logger.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
                        Logger.Warn($"Unexpected error in Checking EditValue: {ex.Message}")
                    End Try
                End If
            End If
        Next


        oProfile_NOT_RESP_SQL = 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)
        frmDialog.ShowDialog()
        ' result = MessageBox.Show(oProfileNotResponsibleQuestion, ADDITIONAL_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
        If frmDialog.DialogResult = DialogResult.OK Then

            '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
            '        Logger.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
            '                Logger.Warn($"Unexpected error in Setting EditValue NotResponsible: {ex.Message}")
            '            End Try
            '        End If
            '    End If
            'Next


            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

            OverrideAll = True
            Override_SQLCommand = oProfile_NOT_RESP_SQL
            Override = True
            Finish_WFStep()
        End If
    End Sub

    Private Sub bbtnitmInfoWorkflow_ItemClick(sender As Object, e As ItemClickEventArgs) Handles bbtnitmInfoWorkflow.ItemClick
        Show_WF_Messages()
    End Sub
End Class