Namespace ControlLoader Public Class _BaseControl 'Public Shared Function ReplaceSqlCommandPlaceholders(sqlCommand As String, recordId As Integer, parentRecordId As Integer, entity_ID As Integer) ' sqlCommand = sqlCommand.Replace("@RECORD_ID", recordId) ' sqlCommand = sqlCommand.Replace("@RECORDID", recordId) ' Dim sql As String = "SELECT FORM_ID FROM TBPMO_RECORD WHERE FORM_ID = " ' ss() ' sqlCommand = sqlCommand.Replace("@ENTITY_ID", recordId) ' sqlCommand = sqlCommand.Replace("@PARENTRECORD_ID", parentRecordId) ' sqlCommand = sqlCommand.Replace("@PARENTRECORDID", parentRecordId) ' Return sqlCommand 'End Function Public Shared Function LoadAutoValue(control As System.Windows.Forms.Control, RecordId As Integer, ParentRecordId As Integer, entity_ID As Integer) Try Dim AutoValue As String = String.Empty Dim ControlId As Integer = DirectCast(control.Tag, ClassControlMetadata).Id Dim CONNID = ClassDatabase.Execute_Scalar(String.Format("SELECT CONNECTION_ID_1 FROM TBPMO_CONTROL WHERE GUID = {0}", ControlId)) Dim SQL As String = ClassDatabase.Execute_Scalar(String.Format("SELECT SQL_COMMAND_1 FROM TBPMO_CONTROL WHERE GUID = {0}", ControlId)) SQL = ClassControlValues.ReplaceSqlCommandPlaceholders(SQL, RecordId, ParentRecordId, entity_ID) If SQL = "" Or IsDBNull(SQL) Then Return Nothing End If If Not IsNothing(CONNID) Then AutoValue = ClassDatabase.Execute_ScalarWithConnection(CONNID, SQL) Else AutoValue = ClassDatabase.Execute_Scalar(SQL, True) End If ' AutoValue = ClassDatabase.Execute_Scalar(SQL) If String.IsNullOrEmpty(AutoValue) Or IsDBNull(AutoValue) Then Return Nothing End If Return AutoValue Catch ex As Exception LOGGER.Warn("Unexpected Error in LoadAutoValue: " & ex.Message) Return Nothing End Try End Function End Class Public Class _ListControl : Inherits _BaseControl Public Shared Function GetDynamicValue(controlId As Integer, formId As Integer, connID As Object, sqlCommand As String) As DynamicValue Dim returnValue As DynamicValue returnValue.StaticList = CheckForStaticList(controlId) returnValue.DataTable = GetSqlList(controlId, formId, connID, sqlCommand) Return returnValue End Function Private Shared Function CheckForStaticList(controlId As Integer) As List(Of String) Try ' Der alte SQL Befehl hat nicht wirklich nach der StaticList geschaut o_O ' Dim SQL As String = String.Format("SELECT VALUE FROM VWPMO_VALUES WHERE CONTROL_ID = {0} AND RECORD_ID = {1}", controlId, recordId) Dim SQL As String = String.Format("SELECT STATIC_LIST FROM TBPMO_CONTROL WHERE GUID = {0}", controlId) Dim staticList As String = ClassDatabase.Execute_Scalar(SQL, True) If IsNothing(staticList) Or String.IsNullOrWhiteSpace(staticList) Then Return Nothing Else Return New List(Of String)(staticList.Split(";").ToArray()) End If Catch ex As Exception MsgBox("Error in CheckForStaticList: " & vbNewLine & ex.Message) Return Nothing End Try End Function Public Shared Function GetSqlList(controlId As Integer, formId As Integer, connection_Id As Object, sqlCommand As String) As DataTable Try If sqlCommand Is Nothing Or sqlCommand = String.Empty Then Return Nothing End If Dim cached As DataTable = ClassControlValueCache.LoadFromCache(sqlCommand) Dim final As DataTable If cached Is Nothing Then If Not IsDBNull(connection_Id) Then final = ClassDatabase.MSSQL_ReturnDTWithConnection(connection_Id, sqlCommand) Else final = ClassDatabase.Return_Datatable(sqlCommand) End If ClassControlValueCache.SaveToCache(sqlCommand, final) Console.WriteLine("CACHE MISS") Else final = cached Console.WriteLine("CACHE HIT") End If Return final Catch ex As Exception MsgBox("Error in GetSqlList: " & vbNewLine & ex.Message) Return Nothing End Try End Function Overloads Shared Sub SetDataSource(control As DevExpress.XtraGrid.GridControl, dt As DataTable) Try Dim columnCount As Integer = dt.Columns.Count Dim rowCount As Integer = dt.Rows.Count ' Zuerst die Datasource leeren und neu setzen control.DataSource = Nothing control.DataSource = dt ' Wir müssen PopulateColumns und RefreshData nach dem Setzen der Datasource aufrufen ' ansonsten wird das Grid leer bleiben und die neuen Daten nicht anzeigen control.MainView.PopulateColumns() control.MainView.RefreshData() 'Jetzt noch den Columnname ändern Dim gridview = DirectCast(control.MainView, DevExpress.XtraGrid.Views.Grid.GridView) Dim caption As String = ClassDatabase.Execute_Scalar(String.Format("SELECT COL_NAME FROM TBPMO_CONTROL WHERE GUID = {0}", DirectCast(control.Tag, ClassControlMetadata).Id), True) gridview.Columns(0).Caption = caption Catch ex As Exception MsgBox("Error in SetDataSource - GridControl: " & ex.Message, MsgBoxStyle.Critical) End Try End Sub Overloads Shared Sub SetDataSource(control As CustomComboBox, dt As DataTable) Dim sw As New SW("SetDataSource CustomComboBox") Dim columnCount As Integer = dt.Columns.Count control.BeginUpdate() PerfomanceHelper.SuspendDraw(control) ' Damit beim Setzen von DisplayMember und ValueMember kein Fehler auftritt, ' muss die Datasource zunächst geleert werden und der selected index auf -1 gesetzt werden. control.DataSource = Nothing control.SelectedIndex = -1 ' Es ist wichtig, dass DisplayMember und ValueMember VOR der DataSource festgelegt werden, ' Dadurch ist das Laden der Datasource um einiges SCHNELLER If columnCount = 1 Then control.DisplayMember = dt.Columns(0).ColumnName control.ValueMember = dt.Columns(0).ColumnName ElseIf columnCount = 2 Then control.DisplayMember = dt.Columns(1).ColumnName control.ValueMember = dt.Columns(0).ColumnName End If ' Als letztes setzen wir die DataSource control.DataSource = dt PerfomanceHelper.ResumeDraw(control) control.EndUpdate() sw.Done() End Sub Overloads Shared Sub SetDataSource(control As DevExpress.XtraEditors.CheckedListBoxControl, dt As DataTable) Dim columnCount As Integer = dt.Columns.Count ' Damit beim Setzen von DisplayMember und ValueMember kein Fehler auftritt, ' muss die Datasource zunächst geleert werden und der selected index auf -1 gesetzt werden. control.DataSource = Nothing control.SelectedIndex = -1 ' Es ist wichtig, dass DisplayMember und ValueMember VOR der DataSource festgelegt werden, ' Dadurch ist das Laden der Datasource um einiges SCHNELLER If columnCount = 1 Then control.DisplayMember = dt.Columns(0).ColumnName control.ValueMember = dt.Columns(0).ColumnName ElseIf columnCount = 2 Then control.DisplayMember = dt.Columns(1).ColumnName control.ValueMember = dt.Columns(0).ColumnName End If ' Als letztes setzen wir die DataSource control.DataSource = dt End Sub Overloads Shared Sub SetDataSource(control As DevExpress.XtraEditors.ListBoxControl, dt As DataTable) Dim columnCount As Integer = dt.Columns.Count ' Damit beim Setzen von DisplayMember und ValueMember kein Fehler auftritt, ' muss die Datasource zunächst geleert werden und der selected index auf -1 gesetzt werden. control.DataSource = Nothing control.SelectedIndex = -1 ' Es ist wichtig, dass DisplayMember und ValueMember VOR der DataSource festgelegt werden, ' Dadurch ist das Laden der Datasource um einiges SCHNELLER If columnCount = 1 Then control.DisplayMember = dt.Columns(0).ColumnName control.ValueMember = dt.Columns(0).ColumnName ElseIf columnCount = 2 Then control.DisplayMember = dt.Columns(1).ColumnName control.ValueMember = dt.Columns(0).ColumnName End If ' Als letztes setzen wir die DataSource control.DataSource = dt End Sub Overloads Shared Sub SetDataSource(control As System.Windows.Forms.DataGridView, dt As DataTable) control.DataSource = dt End Sub End Class Public Structure DynamicValue Public StaticList As List(Of String) Public DataTable As DataTable End Structure Public Class Label : Inherits _BaseControl Public Shared Sub LoadValue(control As System.Windows.Forms.Label, recordId As Integer, parentRecordId As Integer, value As String, entity_ID As Integer, Optional VARIABLE_VALUE As Boolean = False) Dim Sql Dim ControlId As Integer Try ControlId = DirectCast(control.Tag, ClassControlMetadata).Id Dim autoValue Dim drarray() As DataRow = CURRENT_SQL_AUTO_VALUES_DT.Select("GUID = " & ControlId) If drarray.Length > 0 Then Dim ID Try ID = drarray(0)("CONNECTION_ID_1").ToString Catch ex As Exception ID = drarray(0)("CONNECTION_ID").ToString End Try If Not IsNothing(ID) Then Sql = drarray(0)("SQL_COMMAND_1").ToString Sql = ClassControlValues.ReplaceSqlCommandPlaceholders(Sql, recordId, parentRecordId, entity_ID) autoValue = ClassDatabase.Execute_ScalarWithConnection(ID, Sql) Else autoValue = ClassDatabase.Execute_Scalar(Sql, True) End If If IsNothing(autoValue) Then If VARIABLE_VALUE = True Then control.Text = value Else Sql = String.Format("SELECT GUID FROM TBPMO_CONTROL_SCREEN WHERE CONTROL_ID = {0} AND SCREEN_ID = {1}", ControlId, CURRENT_SCREEN_ID) Dim ctrl_screen_id = ClassDatabase.Execute_Scalar(Sql, True) If ctrl_screen_id > 0 Then Sql = String.Format("SELECT CAPTION FROM TBPMO_CONTROL_LANGUAGE WHERE CONTROL_SCREEN_ID = {0} AND LANGUAGE_TYPE = '{1}'", ctrl_screen_id, USER_LANGUAGE) Dim labelText As String = ClassDatabase.Execute_Scalar(Sql) control.Text = labelText End If End If Else If IsDBNull(autoValue) Then control.Text = "ATTENTION: result of select was dbnull" Else control.Text = autoValue End If End If End If Catch ex As Exception MsgBox("Unexpected Error in LoadValueMain:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) LOGGER.Warn("Unexpected Error in LoadValueMain: " & ex.Message) LOGGER.Warn(String.Format("ControlID: {0}" & vbNewLine & "recordid: {1}" & vbNewLine & "parentRecordId: {2}" & vbNewLine & "value: {3}" & vbNewLine & "entity_ID: {4}" & vbNewLine & "VARIABLE_VALUE: {5}", ControlId, recordId, parentRecordId, value, entity_ID, VARIABLE_VALUE), False) End Try End Sub End Class Public Class Checkbox : Inherits _BaseControl Public Shared Sub LoadValue(control As System.Windows.Forms.CheckBox, value As String) Try Dim result As Boolean = False Boolean.TryParse(value, result) control.Checked = result Catch ex As Exception MsgBox("Unexpected Error in LoadValue1:" & vbNewLine & ex.Message) LOGGER.Warn("Unexpected Error in LoadValue1: " & ex.Message) End Try End Sub End Class Public Class RadioButton : Inherits _BaseControl Public Shared Sub LoadValue(control As System.Windows.Forms.RadioButton, value As String) Try Dim result As Boolean = False Boolean.TryParse(value, result) control.Checked = result Catch ex As Exception MsgBox("Unexpected Error in LoadValue2:" & vbNewLine & ex.Message) LOGGER.Warn("Unexpected Error in LoadValue2: " & ex.Message) End Try End Sub End Class Public Class TextBox : Inherits _BaseControl Public Shared Sub LoadValue(control As System.Windows.Forms.TextBox, recordId As Integer, parentRecordId As Integer, value As String, entity_ID As Integer, Optional VARIABLE_VALUE As Boolean = False) Try Dim ControlMeta As ClassControlMetadata = DirectCast(control.Tag, ClassControlMetadata) Dim ControlId As Integer = ControlMeta.Id Dim ControlFormat As String = ControlMeta.Format If CURRENT_RECORD_ENABLED = False Then If ControlFormat = "Currency" Then control.Text = ClassHelper.Format_Currency(value, USER_LANGUAGE) Else control.Text = value End If Else If VARIABLE_VALUE = True Then If ControlFormat = "Currency" Then control.Text = ClassHelper.Format_Currency(value, USER_LANGUAGE) Else control.Text = value End If Else Dim drarray() As DataRow = CURRENT_SQL_AUTO_VALUES_DT.Select("GUID = " & ControlId) If drarray.Length > 0 Then Dim autoValue Dim ID Try ID = drarray(0)("CONNECTION_ID_1").ToString Catch ex As Exception ID = drarray(0)("CONNECTION_ID").ToString End Try Dim Sql = drarray(0)("SQL_COMMAND").ToString If Not IsNothing(ID) Then autoValue = ClassDatabase.Execute_ScalarWithConnection(ID, Sql) Else autoValue = ClassDatabase.Execute_Scalar(Sql, True) End If ' AutoValue = ClassDatabase.Execute_Scalar(SQL) If String.IsNullOrEmpty(autoValue) Or IsDBNull(autoValue) Then control.Text = value Else control.Text = autoValue End If End If 'If USER_WAN = True Then 'WENN in einer WAN-Umgebung betrieben 'Else 'in LAN-Umgebung ' Dim autoValue = LoadAutoValue(control, recordId, parentRecordId, entity_ID) ' If IsNothing(autoValue) Then ' control.Text = value ' Else ' control.Text = autoValue ' End If 'End If End If End If Catch ex As Exception MsgBox("Unexpected Error in LoadValue3:" & vbNewLine & ex.Message) LOGGER.Warn("Unexpected Error in LoadValue3: " & ex.Message) End Try End Sub End Class Public Class DateTimePicker : Inherits _BaseControl Public Shared Sub LoadValue(control As DevExpress.XtraEditors.DateEdit, value As String) If String.IsNullOrWhiteSpace(value) Or value = "00:00:00" Then control.DateTime = DateTime.MinValue Else If Not DateTime.TryParse(value, control.DateTime) Then control.DateTime = DateTime.MinValue End If End If End Sub End Class Public Class Combobox : Inherits _ListControl Public Shared Sub LoadValue(control As CustomComboBox, recordId As Integer, parentRecordId As Integer, value As String) control.Text = value End Sub Public Shared Sub LoadList(control As CustomComboBox, formId As Integer, connID As Object, SQLCommand As String) Try Dim sw As New SW("LoadList CustomComboBox") Dim sw1 As New SW("GetDynamicValue CustomComboBox") Dim dynamic As DynamicValue = GetDynamicValue(DirectCast(control.Tag, ClassControlMetadata).Id, formId, connID, SQLCommand) sw1.Done() If dynamic.StaticList IsNot Nothing Then control.DataSource = dynamic.StaticList End If If dynamic.DataTable IsNot Nothing AndAlso dynamic.DataTable.Rows.Count > 0 Then SetDataSource(control, dynamic.DataTable) CalculateDropdownWidth(control, dynamic.DataTable) End If sw.Done() Catch ex As Exception MsgBox("Error in Combobox.LoadList:" & vbNewLine & ex.Message) End Try End Sub Private Shared Sub CalculateDropdownWidth(control As CustomComboBox, dt As DataTable) Try Const WIDEST_WIDTH As Integer = 300 Dim FinalWidth As Integer = WIDEST_WIDTH Dim index As Integer = 1 If dt.Columns.Count = 1 Then index = 0 End If For Each row As DataRow In dt.Rows 'Die Breite der Dropdown-List anpassen Using g As Graphics = control.CreateGraphics() Dim valueWidth As Integer = g.MeasureString(row.Item(index).ToString(), control.Font).Width If valueWidth + 30 > FinalWidth Then FinalWidth = valueWidth + 30 End If g.Dispose() End Using Next If FinalWidth > WIDEST_WIDTH Then control.DropDownWidth = Math.Max(FinalWidth, control.Width) End If Catch ex As Exception MsgBox("Error in CalculateDropdownWidth:" & vbNewLine & ex.Message) End Try End Sub End Class Public Class CheckedListBox : Inherits _ListControl Public Shared Sub LoadValue(control As DevExpress.XtraEditors.CheckedListBoxControl, values As List(Of Object)) If IsNothing(values) Then Exit Sub End If CURRENT_RECORD_ENABLED = False control.UnCheckAll() For Each v As String In values 'For i As Integer = 0 To control.ItemCount - 1 ' Console.WriteLine(control.GetItemText(i)) 'Next i Dim posBefore As Integer = 0 While (control.FindStringExact(v, posBefore) > -1) Dim pos = control.FindStringExact(v, posBefore) ' Wenn v gefunden wurde, anhaken If pos >= 0 Then control.SetItemCheckState(pos, CheckState.Checked) posBefore = pos + 1 End If ' Verhindere Endlosschleife If pos = 100 Then Exit While End If End While Next End Sub Public Shared Sub LoadList(control As DevExpress.XtraEditors.CheckedListBoxControl, formId As Integer, conn_Id As Object, SQLCommand As String) Try Dim sw As New SW("LoadList CheckedListBoxControl") Dim dynamic As DynamicValue = GetDynamicValue(DirectCast(control.Tag, ClassControlMetadata).Id, formId, conn_Id, SQLCommand) If dynamic.StaticList IsNot Nothing Then control.Items.Clear() For Each item In dynamic.StaticList control.Items.Add(item) Next 'control.DataSource = dynamic.StaticList End If If dynamic.DataTable IsNot Nothing AndAlso dynamic.DataTable.Rows.Count > 0 Then 'control.Items.Clear() SetDataSource(control, dynamic.DataTable) End If sw.Done() Catch ex As Exception MsgBox("Error in CheckedListBox.LoadList:" & vbNewLine & ex.Message) End Try End Sub End Class Public Class ListBox : Inherits _ListControl Public Shared Sub LoadValue(control As DevExpress.XtraEditors.ListBoxControl, value As String) If IsNothing(value) Then Exit Sub End If control.SelectedIndex = control.FindStringExact(value) End Sub Public Shared Sub LoadList(control As DevExpress.XtraEditors.ListBoxControl, formId As Integer, ConnId As Object, SQLCommand As String) Dim sw As New SW("LoadList ListBoxControl") Dim dynamic As DynamicValue = GetDynamicValue(DirectCast(control.Tag, ClassControlMetadata).Id, formId, ConnId, SQLCommand) If dynamic.StaticList IsNot Nothing Then control.DataSource = dynamic.StaticList End If If dynamic.DataTable IsNot Nothing AndAlso dynamic.DataTable.Rows.Count > 0 Then SetDataSource(control, dynamic.DataTable) End If sw.Done() End Sub End Class Public Class DataGridView : Inherits _ListControl Public Shared Sub LoadValue(control As System.Windows.Forms.DataGridView, values As List(Of Object)) control.Rows.Clear() For Each item In values control.Rows.Add(item.ToString) Next End Sub End Class Public Class DataGridViewCheckable : Inherits _ListControl Public Shared Sub LoadList(control As DevExpress.XtraGrid.GridControl, formId As Integer, ConnId As Object, SQLCommand As String) Dim sw As New SW("LoadList GridControl") Dim dynamic As DynamicValue = GetDynamicValue(DirectCast(control.Tag, ClassControlMetadata).Id, formId, ConnId, SQLCommand) If dynamic.StaticList IsNot Nothing Then control.DataSource = dynamic.StaticList End If If dynamic.DataTable IsNot Nothing AndAlso dynamic.DataTable.Rows.Count > 0 Then SetDataSource(control, dynamic.DataTable) End If End Sub Public Shared Sub LoadValue(control As DevExpress.XtraGrid.GridControl, values As List(Of Object)) Dim gridview As DevExpress.XtraGrid.Views.Grid.GridView = control.MainView Dim focused As Boolean = False 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) If values.Contains(rowvalue) Then If focused = False Then gridview.FocusedRowHandle = rowhandle focused = True End If gridview.SelectRow(rowhandle) End If Next End Sub End Class End Namespace