Imports DevExpress.XtraEditors.Controls Imports System.Text.RegularExpressions Public Class ClassControlValues Public Shared Function ControlHasValue(control As Control) As Boolean Try Select Case control.GetType() Case GetType(TextBox) Dim textbox As TextBox = DirectCast(control, TextBox) If textbox.Text.Trim() = String.Empty Then Return False Else Return True End If Case GetType(CustomComboBox) Dim combobox As CustomComboBox = DirectCast(control, CustomComboBox) If combobox.Text.Trim() = String.Empty Then Return False Else Return True End If Case GetType(CheckBox) Dim checkbox As CheckBox = DirectCast(control, CheckBox) Return checkbox.Checked Case GetType(RadioButton) Dim radiobutton As RadioButton = DirectCast(control, RadioButton) Return radiobutton.Checked Case GetType(DevExpress.XtraEditors.DateEdit) Dim datepicker As DevExpress.XtraEditors.DateEdit = DirectCast(control, DevExpress.XtraEditors.DateEdit) If IsDBNull(datepicker.EditValue) Or datepicker.EditValue = DateTime.MinValue Then Return False Else Return True End If Case GetType(DevExpress.XtraEditors.ListBoxControl) Dim listbox As DevExpress.XtraEditors.ListBoxControl = DirectCast(control, DevExpress.XtraEditors.ListBoxControl) If listbox.SelectedIndex = -1 Then Return False Else Return True End If Case GetType(DevExpress.XtraEditors.CheckedListBoxControl) Dim checkedlistbox = DirectCast(control, DevExpress.XtraEditors.CheckedListBoxControl) If checkedlistbox.CheckedItemsCount = 0 Then Return False Else Return True End If Case GetType(PictureBox) Dim picturebox = DirectCast(control, PictureBox) If IsNothing(picturebox.BackgroundImage) Then Return False Else Return True End If Case Else Return True End Select Catch ex As Exception Return False End Try End Function ' Überprüft, welche Controls "Required" sind Public Shared Function CheckRequiredControlValues(controls As Control.ControlCollection, Optional isGroupbox As Boolean = False) As List(Of String) Dim missingValues As New List(Of String) 'If isGroupbox = True Then ' Dim radiobuttons As New List(Of RadioButton) ' Dim otherControls As New List(Of Control) ' ' Nach allen Radiobuttons suchen ' For Each c As Control In controls ' If TypeOf c Is RadioButton Then ' radiobuttons.Add(DirectCast(c, RadioButton)) ' Else ' otherControls.Add(c) ' End If ' Next ' ' Wenn mindestens 1 MussFeld-Radiobutton in der Groupbox ' Dim atLeastOneRadioButtonHasRequired = False ' For Each rb As RadioButton In radiobuttons ' If DirectCast(rb.Tag, ClassControlMetadata).Required = True Then ' atLeastOneRadioButtonHasRequired = True ' Exit For ' End If ' Next ' If atLeastOneRadioButtonHasRequired Then ' ' Alle RadioButtons die angeklickt wurden (ist meistens einer :o) ' Dim radioButtonsWithValue = (From rb As RadioButton In radiobuttons ' Where ControlHasValue(rb) ' Select rb.Name).ToArray() ' ' Wenn kein RadioButton angeklickt wurde, nehmen wir alle in einen String, ' ' da GENAU EINER angeklickt werden MUSS ' If radioButtonsWithValue Is Nothing Then ' Dim missingValue As String = String.Join(", ", radiobuttons) ' missingValues.Add(missingValue) ' End If ' End If 'End If For Each Control As Control In controls Dim metadata = DirectCast(Control.Tag, ClassControlMetadata) If TypeOf Control Is Label Then Continue For End If 'Radio Buttons müssen nicht überprüft werden, da eine RadioButton Group 'immer ein Control mit Checked = true hat If TypeOf Control Is RadioButton Then Continue For End If Console.WriteLine(Control.Name) ' Groupbox muss rekursiv überprüft werden If TypeOf Control Is GroupBox Then Dim groupbox As GroupBox = DirectCast(Control, GroupBox) Dim gbfields As List(Of String) = CheckRequiredControlValues(groupbox.Controls, True) missingValues.AddRange(gbfields) Continue For End If If IsNothing(metadata.Required) OrElse metadata.Required = False Then Continue For End If If Not ControlHasValue(Control) And Control.Enabled = True Then missingValues.Add(Control.Name) End If Next Return missingValues.Distinct().ToList() End Function Public Shared Sub LoadControlValues(RecordId As Integer, ParentRecordId As Integer, FormId As Integer, controls As Control.ControlCollection, Entity_ID As Integer, Optional isGroupbox As Boolean = False) Try Dim sw As New SW("LoadControlValues1") If RecordId = 0 Then Exit Sub End If 'Dim SQL As String = String.Format("SELECT * FROM VWPMO_VALUES WHERE VALUE <> '' AND RECORD_ID = {0}", RecordId) Dim SQL As String = String.Format("SELECT * FROM VWPMO_VALUES WHERE RECORD_ID = {0}", RecordId) Dim DT_ControlValues As DataTable = MYDB_ECM.GetDatatable(SQL) CURRENT_CONTROL_VALUES = DT_ControlValues sw.Done() If controls.Count = 0 Then LOGGER.Warn("the control-Collection in LoadControlValuesNeu is empty!") If (Not isGroupbox) Then ENTITY_RELOAD_AFT_CONTROL_LOAD = True End If Exit Sub End If ' Zuerst alle Controls leeren ClearControlValues(controls) sw = New SW("LoadControlValues2") ' Load all Hints for controls Dim SQLHint = "SELECT * FROM VWPMO_CONTROL_HINT WHERE FORM_ID = " & FormId Dim DT_Hints As DataTable = MYDB_ECM.GetDatatable(SQLHint) ' ' Hint in DT_Hints suchen der zur aktuellen controlId passt For Each row As DataRow In DT_Hints.Rows ClassControlValueCache.SaveHint(row.Item(1), row.Item(2)) Next ' LoadControlHints(controls) sw.Done() sw = New SW("LoadControlValues3") For Each control As Control In controls PerfomanceHelper.SuspendDraw(control) Dim ControlId As Integer = DirectCast(control.Tag, ClassControlMetadata).Id ' Wert per LINQ aus DT_ControlValues suchen der zur aktuellen controlId passt Dim values As List(Of Object) = (From row In DT_ControlValues.AsEnumerable() Where row.Item("CONTROL_ID") = ControlId Select row.Item("VALUE")).ToList() If TypeOf control Is GroupBox Then Dim groupbox As GroupBox = DirectCast(control, GroupBox) LoadControlValues(RecordId, ParentRecordId, FormId, groupbox.Controls, Entity_ID, True) Else If ControlId = 439 Then Console.WriteLine("Control 439") End If LoadControlValue(RecordId, ParentRecordId, ControlId, control, values, Entity_ID) End If PerfomanceHelper.ResumeDraw(control) Next sw.Done() Catch ex As Exception LOGGER.Warn("Unexpected Error in LoadControlValuesNeu: " & ex.Message) MsgBox("Error in LoadControlValuesNeu:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub Public Shared Function GetControlValuesREC_CONTROL(RecordId As Integer, CONTROL_ID As Integer) Try 'Dim SQL As String = String.Format("SELECT * FROM VWPMO_VALUES WHERE VALUE <> '' AND RECORD_ID = {0}", RecordId) Dim SQL As String = String.Format("SELECT VALUE FROM VWPMO_VALUES WHERE RECORD_ID = {0} AND CONTROL_ID = {1}", RecordId, CONTROL_ID) Dim RESULT = MYDB_ECM.ExecuteNonQuery(SQL) If IsNothing(RESULT) Then Return Nothing ElseIf RESULT = "" Then Return Nothing Else Return RESULT End If Catch ex As Exception LOGGER.Warn("Unexpected Error in GetControlValuesREC_CONTROL: " & ex.Message) MsgBox("Error in GetControlValuesREC_CONTROL:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return Nothing End Try End Function Private Shared Sub LoadControlHints(controls As Control.ControlCollection) For Each c As Control In controls Dim id As Integer = DirectCast(c.Tag, ClassControlMetadata).Id Dim sql As String = String.Format("SELECT HINT FROM TBPMO_CONTROL_LANGUAGE WHERE CONTROL_SCREEN_ID = (SELECT GUID FROM TBPMO_CONTROL_SCREEN WHERE CONTROL_ID = {0} AND SCREEN_ID = 1) AND LANGUAGE_TYPE = '{1}' AND HINT IS NOT NULL", id, USER_LANGUAGE) Dim hint = MYDB_ECM.GetScalarValue(sql) If IsNothing(hint) Then Continue For End If ClassControlValueCache.SaveHint(id, hint.ToString) Next End Sub Public Shared Sub LoadControlValue(recordId As Integer, parentRecordId As Integer, controlId As Integer, control As Control, values As List(Of Object), entity_ID As Integer) ' Try ' Für die meisten Controls wird nur das erste Element der Liste benötigt Dim value As String = Nothing If values.Count > 0 Then value = values.Item(0) End If Select Case control.GetType() Case GetType(TextBox) If CURRENT_CONTROL_ID = 272 Then Console.WriteLine("272") End If Dim textbox As TextBox = DirectCast(control, TextBox) ControlLoader.TextBox.LoadValue(textbox, recordId, parentRecordId, value, entity_ID) Case GetType(Label) Dim label As Label = DirectCast(control, Label) ControlLoader.Label.LoadValue(label, recordId, parentRecordId, value, entity_ID) Case GetType(CustomComboBox) Dim combobox As CustomComboBox = DirectCast(control, CustomComboBox) ControlLoader.Combobox.LoadValue(combobox, recordId, parentRecordId, value) Case GetType(CheckBox) Dim checkbox As CheckBox = DirectCast(control, CheckBox) ControlLoader.Checkbox.LoadValue(checkbox, value) Case GetType(RadioButton) LOGGER.Debug("Sub LoadControlValueNeu - GetType(RadioButton) ") Dim radiobutton As RadioButton = DirectCast(control, RadioButton) ControlLoader.RadioButton.LoadValue(radiobutton, value) Case GetType(DevExpress.XtraEditors.DateEdit) Dim datepicker As DevExpress.XtraEditors.DateEdit = DirectCast(control, DevExpress.XtraEditors.DateEdit) ControlLoader.DateTimePicker.LoadValue(datepicker, value) Case GetType(DevExpress.XtraEditors.ListBoxControl) Dim listbox As DevExpress.XtraEditors.ListBoxControl = DirectCast(control, DevExpress.XtraEditors.ListBoxControl) ControlLoader.ListBox.LoadValue(listbox, value) Case GetType(DevExpress.XtraEditors.CheckedListBoxControl) Dim checkedlistbox As DevExpress.XtraEditors.CheckedListBoxControl = DirectCast(control, DevExpress.XtraEditors.CheckedListBoxControl) ControlLoader.CheckedListBox.LoadValue(checkedlistbox, values) Case GetType(PictureBox) Dim picturebox = DirectCast(control, PictureBox) LoadImage(recordId, controlId, picturebox) Case GetType(DataGridView) Dim gridview = DirectCast(control, DataGridView) ControlLoader.DataGridView.LoadValue(gridview, values) Case GetType(DevExpress.XtraGrid.GridControl) Dim gridcontrol As DevExpress.XtraGrid.GridControl = DirectCast(control, DevExpress.XtraGrid.GridControl) ControlLoader.DataGridViewCheckable.LoadValue(gridcontrol, values) Case Else If GetType(Control).ToString() <> "System.Windows.Forms.Control" Then LOGGER.Warn("Sub LoadControlValue - Control-Type nicht berücksichtigt: " & GetType(Control).ToString()) End If End Select 'Catch ex As Exception ' Logger.Warn("Unexpected Error in LoadControlValue: " & ex.Message) ' MsgBox("Error in LoadControlValue:" & vbNewLine & ex.Message) 'End Try End Sub Public Shared Sub LoadControlValuesList(FormID As Integer, controls As Control.ControlCollection) Try Dim sw As New SW("LoadControlValuesList - Database") If controls.Count = 0 Then 'MsgBox("LoadControlValuesList: Control.ControlCollection is unexpected empty!", MsgBoxStyle.Exclamation) LOGGER.Warn("LoadControlValuesList: Control.ControlCollection is unexpected empty!") Exit Sub End If ' Zuerst alle SQL Commands für FormID finden ' CONTROL_SQLCOMMAND_1 wird als SQL gealiast 'Dim SQL As String = String.Format("SELECT CONTROL_ID, CONTROL_CONNID_1,CONTROL_SQLCOMMAND_1 AS SQL FROM VWPMO_CONTROL_SCREEN WHERE FORM_ID = {0} AND CONTROL_SQLCOMMAND_1 NOT LIKE '%@%'", FormID) Dim Sql = String.Format("FORM_ID = {0} AND CONTROL_SQLCOMMAND_1 NOT LIKE '%@%'", FormID) Dim dt As DataTable = ClassHelper.FILTER_DATATABLE(DT_VWPMO_CONTROL_SCREEN, Sql, "") sw.Done() If dt.Rows.Count = 0 Then Exit Sub End If sw = New SW("LoadControlValuesList") For Each Ctrl As Control In controls Dim controlTagId = DirectCast(Ctrl.Tag, ClassControlMetadata).Id PerfomanceHelper.SuspendDraw(Ctrl) 'If controlTagId = 474 Then ' MsgBox("Thats it") 'End If 'Datatable nach row mit CONTROL_ID wie Ctrl suchen Dim row As DataRow = dt.Select(String.Format("CONTROL_ID={0}", controlTagId)).FirstOrDefault() If IsNothing(row) Then ' Beim aussteigen muss wieder ResumeDraw aufgerufen werden PerfomanceHelper.ResumeDraw(Ctrl) Continue For End If Dim sqlcommand As String = row.Item("CONTROL_SQLCOMMAND_1") Dim ConnID = row.Item("CONTROL_CONNID_1") Select Case Ctrl.GetType() Case GetType(CustomComboBox) Dim combobox = DirectCast(Ctrl, CustomComboBox) ControlLoader.Combobox.LoadList(combobox, FormID, ConnID, sqlcommand) Case GetType(DevExpress.XtraEditors.ListBoxControl) Dim listbox = DirectCast(Ctrl, DevExpress.XtraEditors.ListBoxControl) ControlLoader.ListBox.LoadList(listbox, FormID, ConnID, sqlcommand) Case GetType(DevExpress.XtraEditors.CheckedListBoxControl) Dim chlistbox = DirectCast(Ctrl, DevExpress.XtraEditors.CheckedListBoxControl) ControlLoader.CheckedListBox.LoadList(chlistbox, FormID, ConnID, sqlcommand) Case GetType(DevExpress.XtraGrid.GridControl) Dim grid = DirectCast(Ctrl, DevExpress.XtraGrid.GridControl) ControlLoader.DataGridViewCheckable.LoadList(grid, FormID, ConnID, sqlcommand) End Select PerfomanceHelper.ResumeDraw(Ctrl) Next sw.Done() Catch ex As Exception LOGGER.Warn("Unexpected Error in LoadControlValuesList: " & ex.Message) MsgBox("Unexpected Error in LoadControlValuesList:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub Public Shared Sub LoadControlValuesListWithPlaceholders(FormId As Integer, RecordId As Integer, ParentRecordId As Integer, controls As Control.ControlCollection, entity_ID As Integer) Try If controls.Count = 0 Then 'MsgBox("LoadControlValuesListWithPlaceholders: Control.ControlCollection is unexpected empty!", MsgBoxStyle.Exclamation) LOGGER.Warn("LoadControlValuesListWithPlaceholders: Control.ControlCollection is unexpected empty!") Exit Sub End If ' Dim SQL As String = String.Format("SELECT CONTROL_ID, CONTROL_CONNID_1, CONTROL_SQLCOMMAND_1 AS SQL FROM VWPMO_CONTROL_SCREEN WHERE FORM_ID = {0} AND CONTROL_SQLCOMMAND_1 <> '' AND CONTROL_SQLCOMMAND_1 LIKE '%@%'", FormId) Dim sw As New SW("LoadControlValuesListWithPlaceholders") Dim commands As New List(Of String) Dim expression As String = String.Format("FORM_ID = {0} AND CONTROL_SQLCOMMAND_1 <> '' AND CONTROL_SQLCOMMAND_1 LIKE '%@%'", FormId) Dim dt As DataTable = ClassHelper.FILTER_DATATABLE(DT_VWPMO_CONTROL_SCREEN, expression, "") If dt.Rows.Count = 0 Then Exit Sub End If For Each Ctrl As Control In controls Dim controlTagId = DirectCast(Ctrl.Tag, ClassControlMetadata).Id Dim row As DataRow = dt.Select(String.Format("CONTROL_ID={0}", controlTagId)).FirstOrDefault() If IsNothing(row) Then Continue For End If Dim connID = row.Item("CONTROL_CONNID_1") Dim sqlcommand As String = row.Item("CONTROL_SQLCOMMAND_1") If ParentRecordId = 0 And CURRENT_ACT_LEVEL > 1 Then 'eigentlich sollte eine Parent_RecordID da sein Try Dim _SQL = String.Format("SELECT RECORD1_ID FROM TBPMO_RECORD_CONNECT WHERE RECORD2_ID = {0}", RecordId) Dim ParentRec = MYDB_ECM.ExecuteNonQuery(_SQL) If Not IsNothing(ParentRec) Then If ParentRec > 0 Then ParentRecordId = ParentRec End If End If Catch ex As Exception LOGGER.Warn("Unexpected Error in Getting Parent-Record cause PRecord was 0: " & ex.Message) End Try End If sqlcommand = ReplaceSqlCommandPlaceholders(sqlcommand, RecordId, ParentRecordId, entity_ID) PerfomanceHelper.SuspendDraw(Ctrl) Select Case Ctrl.GetType() Case GetType(CustomComboBox) Dim combobox = DirectCast(Ctrl, CustomComboBox) ControlLoader.Combobox.LoadList(combobox, FormId, connID, sqlcommand) Case GetType(DevExpress.XtraEditors.ListBoxControl) Dim listbox = DirectCast(Ctrl, DevExpress.XtraEditors.ListBoxControl) ControlLoader.ListBox.LoadList(listbox, FormId, connID, sqlcommand) Case GetType(DevExpress.XtraEditors.CheckedListBoxControl) Dim chlistbox = DirectCast(Ctrl, DevExpress.XtraEditors.CheckedListBoxControl) ControlLoader.CheckedListBox.LoadList(chlistbox, FormId, connID, sqlcommand) Case GetType(DevExpress.XtraGrid.GridControl) Dim gridControl = DirectCast(Ctrl, DevExpress.XtraGrid.GridControl) ControlLoader.DataGridViewCheckable.LoadList(gridControl, FormId, connID, sqlcommand) End Select PerfomanceHelper.ResumeDraw(Ctrl) Next sw.Done() Catch ex As Exception LOGGER.Warn("Unexpected Error in LoadControlValuesListWithPlaceholders: " & ex.Message) MsgBox("Unexpected Error in LoadControlValuesListWithPlaceholders:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub ''' ''' Sucht alle Controls in der aktuellen Entität, die eine Abhängigkeit besitzen, ''' und (de)aktiviert sie basierend auf dem Wert er Abhängigkeit ''' ''' Public Shared Sub Enable_Depending_Controls(FormId As Integer, RecordId As Integer, ParentRecordId As Integer, controls As Control.ControlCollection, entity_ID As Integer) Try If controls.Count = 0 Then 'MsgBox("LoadControlValuesListWithPlaceholders: Control.ControlCollection is unexpected empty!", MsgBoxStyle.Exclamation) LOGGER.Warn("Enable_Depending_Controls: Control.ControlCollection is unexpected empty!") Exit Sub End If ' Alle Controls finden, die Abhängigkeiten haben Dim SQL As String = String.Format("select GUID,NAME,SQL_COMMAND_2 from TBPMO_CONTROL where FORM_ID = {0} AND SQL_COMMAND_2 IS NOT NULL " _ & "AND LEN(SQL_COMMAND_2) > 10 AND SQL_COMMAND_2 LIKE '%@%@%'", FormId) Dim sw As New SW("Enable_Depending_Controls") Dim commands As New List(Of String) Dim dt As DataTable = MYDB_ECM.GetDatatable(SQL) If dt.Rows.Count = 0 Then Exit Sub End If ' Durchlaufe alle Controls, die eine Abhängigheit haben For Each row As DataRow In dt.Rows Dim msg = String.Format("Working on Depending Control-ID: {0}", row.Item("GUID").ToString) LOGGER.Debug(msg) Dim DependingControlId As Integer = row.Item("GUID") Dim DependingControlSQL As String = row.Item("SQL_COMMAND_2") msg = String.Format("SQL: {0}", DependingControlSQL) LOGGER.Debug(msg) Dim DependingControl As Control = controls.OfType(Of Control)().Where(Function(c As Control) Return DirectCast(c.Tag, ClassControlMetadata).Id = DependingControlId End Function).SingleOrDefault() Dim regex As New Regex("(@(\d+)@)") Dim match As Match = regex.Match(DependingControlSQL) If match.Success Then ' Wir suchen aus dem SQL Befehl die ControlId heraus, ' von dem das aktuelle Control abhängt Dim otherControlId As Integer Integer.TryParse(match.Groups(2).Value, otherControlId) ' Jetzt suchen wir das Control, das zu dieser ControlId passt Dim otherControl As Control = controls.OfType(Of Control)().Where(Function(c As Control) Dim controlId As Integer = DirectCast(c.Tag, ClassControlMetadata).Id Console.WriteLine(controlId) Return controlId = otherControlId End Function).SingleOrDefault() Dim otherControlType As String = otherControl.GetType().Name ' Jetzt holen wir uns den Wert von dem 'OtherControl' ' und geben seinen Value zusammen mit dem dependingControl weiter Dim value As Object = Nothing ' Jetzt lesen wir den Wert aus, der im SQL Command ersetzt werden soll Select Case otherControlType Case "CheckBox" msg = String.Format("CheckBox-CtrlID: {0}", otherControlId) LOGGER.Debug(msg) value = DirectCast(otherControl, CheckBox).Checked Case "TextBox" msg = String.Format("TextBox-CtrlID: {0}", otherControlId) LOGGER.Debug(msg) value = DirectCast(otherControl, TextBox).Text Case "CustomComboBox" msg = String.Format("CustomComboBox-CtrlID: {0}", otherControlId) LOGGER.Debug(msg) value = DirectCast(otherControl, CustomComboBox).Text Case "DateEdit" msg = String.Format("DateEdit-CtrlID: {0}", otherControlId) LOGGER.Debug(msg) value = DirectCast(otherControl, DevExpress.XtraEditors.DateEdit).EditValue End Select ' Jetzt ersetzen wir den Platzhalter im SQL Command DependingControlSQL = regex.Replace(DependingControlSQL, value) msg = String.Format("DependingControlSQL: {0}", DependingControlSQL) LOGGER.Debug(msg) Dim enableDT As DataTable = MYDB_ECM.GetDatatable(DependingControlSQL) If IsNothing(enableDT) Then msg = String.Format("enableDT is nothing!! CHECK SQL {0}." & vbNewLine, DependingControlSQL) LOGGER.Warn(msg) Continue For End If If enableDT.Rows.Count = 1 Then Dim enabled As Boolean = True Try enabled = CBool(enableDT.Rows(0).Item(0)) Catch ex As Exception msg = String.Format("Could not convert value of tablecontent to boolean!! SQL {0} # tablecontent: {1}" & vbNewLine, DependingControlSQL, enableDT.Rows(0).Item(0).ToString) LOGGER.Warn(msg) End Try DependingControl.Enabled = enabled If enabled = False Then msg = String.Format("Control {0} will be disabled." & vbNewLine, DependingControlId.ToString) LOGGER.Debug(msg) Else msg = String.Format("Control {0} will be enabled." & vbNewLine, DependingControlId.ToString) LOGGER.Debug(msg) End If Else LOGGER.Warn("Attention in Enable_Depending_Controls: RowCount for enabling control was '" & enableDT.Rows.Count.ToString & "' and not 1 as expected - Check SQL: '" & DependingControlSQL & "'") End If End If Next sw.Done() Catch ex As Exception LOGGER.Warn("Unexpected Error in Enable_Depending_Controls: " & ex.Message, True) MsgBox("Unexpected Error in Enable_Depending_Controls:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub Public Shared Function ReplaceSqlCommandPlaceholders(sqlCommand As String, recordId As Integer, parentRecordId As Integer, entity_Id As Integer) Try sqlCommand = sqlCommand.Replace("@RECORD_ID", recordId) sqlCommand = sqlCommand.Replace("@RECORDID", recordId) sqlCommand = sqlCommand.Replace("@ENTITY_ID", entity_Id) sqlCommand = sqlCommand.Replace("@PARENTRECORD_ID", parentRecordId) sqlCommand = sqlCommand.Replace("@PARENTRECORDID", parentRecordId) Return sqlCommand Catch ex As Exception LOGGER.Warn("Unexpected Error in ReplaceSqlCommandPlaceholders: " & ex.Message) MsgBox("Unexpected Error in ReplaceSqlCommandPlaceholders:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return sqlCommand End Try End Function Public Shared Sub UnloadControlValuesList(RecordID As Integer, FormID As Integer, controls As Control.ControlCollection) For Each C As Control In controls If TypeOf C Is CustomComboBox Then Dim Combobox = DirectCast(C, CustomComboBox) Dim currentValue As String = Combobox.Text Combobox.DataSource = Nothing Combobox.Text = currentValue End If Next End Sub Public Shared Sub LoadImage(RecordID As Integer, ControlID As Integer, control As Control) Dim picbox As PictureBox = DirectCast(control, PictureBox) Dim SQL As String = String.Format("SELECT IMG FROM TBPMO_CONTROL_IMAGE WHERE RECORD_ID = {0} AND CONTROL_ID = {1}", RecordID, ControlID) Dim bimage As Byte() = MYDB_ECM.GetScalarValue(SQL) If Not IsNothing(bimage) Then picbox.BackgroundImage = ByteArrayToBitmap(bimage) picbox.BackgroundImageLayout = ImageLayout.Zoom Else picbox.BackgroundImage = Nothing End If End Sub #Region "ClearControlValue" Public Shared Sub ClearControlValues(controls As Control.ControlCollection) For Each control In controls If control.GetType().Name = "GroupBox" Then Dim groupbox As GroupBox = control ClearControlValues(groupbox.Controls) Else ClearControlValue(control) End If Next End Sub Public Shared Sub ClearControlValue(control As Control) Select Case control.GetType() Case GetType(TextBox) DirectCast(control, TextBox).Text = String.Empty Case GetType(CustomComboBox) Dim combo As CustomComboBox = DirectCast(control, CustomComboBox) combo.SelectedIndex = -1 combo.Text = String.Empty Case GetType(CheckBox) DirectCast(control, CheckBox).Checked = False Case GetType(RadioButton) DirectCast(control, RadioButton).Checked = False Case GetType(DevExpress.XtraEditors.DateEdit) DirectCast(control, DevExpress.XtraEditors.DateEdit).DateTime = DateTime.MinValue Case GetType(PictureBox) DirectCast(control, PictureBox).BackgroundImage = Nothing Case GetType(DevExpress.XtraEditors.CheckedListBoxControl) Dim chklbx As DevExpress.XtraEditors.CheckedListBoxControl = DirectCast(control, DevExpress.XtraEditors.CheckedListBoxControl) chklbx.UnCheckAll() Case GetType(DevExpress.XtraEditors.ListBoxControl) Dim lb As DevExpress.XtraEditors.ListBoxControl = DirectCast(control, DevExpress.XtraEditors.ListBoxControl) lb.SelectedIndex = -1 Case GetType(DataGridView) Dim dgv As DataGridView = DirectCast(control, DataGridView) Dim ds = dgv.DataSource If (IsNothing(ds)) Then dgv.Rows.Clear() dgv.Refresh() Else dgv.DataSource = Nothing dgv.Refresh() End If Case GetType(DevExpress.XtraGrid.GridControl) Dim gc = DirectCast(control, DevExpress.XtraGrid.GridControl) Dim gridview As DevExpress.XtraGrid.Views.Grid.GridView = gc.MainView ' Setzt den Filter zurück gridview.ActiveFilterString = String.Empty If gridview.RowCount = 0 Then Exit Select End If For i As Integer = 0 To gridview.RowCount - 1 Dim fieldName As String = gridview.Columns(0).FieldName Dim rowhandle As Integer = gridview.GetRowHandle(i) Dim rowvalue As String = gridview.GetRowCellValue(rowhandle, fieldName) gridview.UnselectRow(rowhandle) Next Try gridview.Columns(0).OptionsColumn.AllowEdit = False Catch ex As Exception End Try End Select End Sub #End Region #Region "LoadDefaultValue" Public Shared Sub LoadDefaultValues(FormID As Integer, RecordID As Integer, controls As Control.ControlCollection, parentRecordID As Integer, EntityID As Integer) Try Dim sw As New SW("LoadDefaultValues") ' Alle Controls leeren ClearControlValues(controls) ' Alle Controls laden, die einen Default Value haben Dim SQL As String = String.Format("SELECT CONTROL_ID, CONTROL_DEF_VALUE, CONTROL_NAME FROM VWPMO_CONTROL_SCREEN WHERE FORM_ID = {0} AND CONTROL_DEF_VALUE <> '' " & "UNION SELECT CONTROL_ID, CONTROL_SQLCOMMAND_1 AS CONTROL_DEF_VALUE, CONTROL_NAME FROM VWPMO_CONTROL_SCREEN where FORM_ID = {0} and CONTROL_SQLCOMMAND_1 <> '' AND CONTROL_SQLCOMMAND_1 NOT LIKE '%@%@%' AND CONTROL_SQLCOMMAND_1 LIKE '%@RECORD_ID%'", FormID) Dim DEFAULT_VALUE_DT As DataTable = MYDB_ECM.GetDatatable(SQL) For Each row As DataRow In DEFAULT_VALUE_DT.Rows Dim defaultValue = row.Item("CONTROL_DEF_VALUE") Dim controlId As Integer = row.Item("CONTROL_ID") Dim controlName As String = row.Item("CONTROL_NAME") Try Dim control As Control = controls.Find(controlName, False)(0) LoadDefaultValue(controlId, RecordID, control, parentRecordID, EntityID, defaultValue) Catch ex As Exception LOGGER.Warn("Unexpected Error in getting default value for control '" & controlName & " - " & ex.Message, True) End Try Next sw.Done() 'Den Focus auf das erste Steuerelement setzen For Each c As Control In controls If Not TypeOf c Is Label Then c.Focus() Exit For End If Next Catch ex As Exception MsgBox("Error in LoadDefaultValues: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub 'Public Shared Sub LoadDefaultValues_(FormID As Integer, RecordID As Integer, controls As Control.ControlCollection, ParentRecordId As Integer, entity_ID As Integer) ' '' Zuerst alle Controls leeren ' ClearControlValues(controls) ' Dim i = 0 ' For Each control As Control In controls ' Dim CONTROL_ID = DirectCast(control.Tag, ClassControlMetadata).Id ' GetControlID_for_Name(control.Name, FormID) ' If Not (TypeOf control Is Label) Then ' i += 1 ' End If ' If TypeOf control Is GroupBox Then ' LoadDefaultValues(FormID, RecordID, DirectCast(control, GroupBox).Controls, ParentRecordId, entity_ID) ' End If ' 'LoadDefaultValue(CONTROL_ID, RecordID, control, ParentRecordId, entity_ID) ' 'Den Focus auf das erste Steuerelement setzen ' If i = 1 Then ' control.Focus() ' End If ' Next 'End Sub Public Shared Sub LoadDefaultValue(ControlID As Integer, RecordID As Integer, control As Control, ParentRecordId As Integer, entity_ID As Integer, defaultValue As Object) Try 'Dim SQL = String.Format("SELECT CONTROL_DEF_VALUE FROM VWPMO_CONTROL_SCREEN WHERE CONTROL_ID = {0} and CONTROL_DEF_VALUE <> ''", ControlID) 'Dim defaultValue = MYDB_ECM.GetScalarValue(SQL) 'Dim SQL = "SELECT * FROM VWPMO_CONTROL_SCREEN WHERE CONTROL_ID = " & ControlID 'Dim DT As DataTable = MYDB_ECM.GetDatatable(SQL) 'Dim result = DT.Rows(0).Item("CONTROL_DEF_VALUE") Select Case control.GetType() Case GetType(TextBox) If ControlID = 272 Then Console.WriteLine("obacht") End If Dim textbox As TextBox = DirectCast(control, TextBox) If IsDBNull(defaultValue) Then textbox.Text = "" Else Dim vorgabe = defaultValue 'Wenn der Default Wert über einen Select kommt If vorgabe.ToString.ToLower.StartsWith("select") Then vorgabe = defaultValue.Replace("@FORM_ID", CURRENT_ENTITY_ID) vorgabe = vorgabe.Replace("@RECORD_ID", CURRENT_RECORD_ID) vorgabe = vorgabe.Replace("@RECORDID", CURRENT_RECORD_ID) vorgabe = vorgabe.Replace("@PARENTRECORD_ID", CURRENT_PARENT_RECORD_ID) defaultValue = MYDB_ECM.ExecuteNonQuery(vorgabe.ToString) If IsNothing(vorgabe) Then textbox.Text = "" End If End If textbox.Text = defaultValue End If Case GetType(CheckBox) Dim checkbox As CheckBox = DirectCast(control, CheckBox) checkbox.Checked = StrToBool(defaultValue) Case GetType(RadioButton) Dim radio As RadioButton = DirectCast(control, RadioButton) radio.Checked = StrToBool(defaultValue) Case GetType(CustomComboBox) Dim combobox As CustomComboBox = DirectCast(control, CustomComboBox) If IsDBNull(defaultValue) Then combobox.SelectedIndex = -1 Else combobox.SelectedIndex = combobox.FindStringExact(defaultValue) End If Case GetType(DevExpress.XtraEditors.DateEdit) Dim datepicker As DevExpress.XtraEditors.DateEdit = DirectCast(control, DevExpress.XtraEditors.DateEdit) If IsDBNull(defaultValue) Then defaultValue = String.Empty End If Dim result As EnumDateTimePickerDefaultValueOptions = EnumDateTimePickerDefaultValueOptions.Empty Dim success = [Enum].TryParse(Of EnumDateTimePickerDefaultValueOptions)(defaultValue, result) If success Then If result = EnumDateTimePickerDefaultValueOptions.Empty Then ' DBNull.Value leert das DateEdit control. defaultValue = DBNull.Value ElseIf result = EnumDateTimePickerDefaultValueOptions.CurrentDate Then defaultValue = Now End If Else 'Wenn der DefaultWert nicht gelesen werden konnte, DateEdit leeren defaultValue = DBNull.Value End If ' Mit EditValue kann man auch den angezeigten Wert leeren 'datepicker.DateTime = autoValue datepicker.EditValue = defaultValue Case GetType(Label) Dim lbl As Label = DirectCast(control, Label) Dim CONNID = MYDB_ECM.ExecuteNonQuery(String.Format("SELECT CONNECTION_ID_1 FROM TBPMO_CONTROL WHERE GUID = {0}", ControlID)) defaultValue = ClassControlValues.ReplaceSqlCommandPlaceholders(defaultValue, RecordID, ParentRecordId, entity_ID) If defaultValue = "" Or IsDBNull(defaultValue) Then Exit Sub End If 'If Not IsNothing(CONNID) Then ' defaultValue = ClassDatabase.Execute_ScalarWithConnection(CONNID, defaultValue) 'Else defaultValue = MYDB_ECM.ExecuteNonQuery(defaultValue) 'End If ' AutoValue = MYDB_ECM.GetScalarValue(SQL) If Not IsNothing(defaultValue) And Not IsDBNull(defaultValue) Then lbl.Text = defaultValue End If End Select Catch ex As Exception MsgBox("Unexpected Error in LoadDefaultValue:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Sub #End Region Public Shared Function Get_Control_Value_for_ID(Control_ID As Integer, Record_ID As Integer) Try Dim sql = "SELECT VALUE FROM TBPMO_CONTROL_VALUE WHERE CONTROL_ID = " & Control_ID & " AND RECORD_ID = " & Record_ID CURRENT_LAST_SQL = sql Return MYDB_ECM.GetScalarValue(sql) Catch ex As Exception LOGGER.Warn("Unexpected Error in GetControlValueForControlID: " & ex.Message) MsgBox("Error in GetControlValueForControlID:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return Nothing End Try End Function End Class