Imports DD_LIB_Standards Public Class frmFormDesigner Private COLUMN_GUID Private MouseIsDown As Boolean = False Private idxlbl As Integer = 0 Private idxtxt As Integer = 0 Private idxcmb As Integer = 0 Private idxdtp As Integer = 0 Private idxdgv As Integer = 0 Private idxchk As Integer = 0 Private _loading As Boolean = False Dim frmTableColumn As New frmControl_Detail Private CURRENT_CONTROL As Control ' Movement Variables Private MouseMoving As Boolean Private BeginLocation As Point Private EndLocation As Point Private Sub frmFormDesigner_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing If CURRENT_ProfilGUID > 0 Then Dim sql As String = $"SELECT NAME, INDEX_NAME FROM TBPM_PROFILE_CONTROLS WHERE PROFIL_ID = {CURRENT_ProfilGUID} AND CTRL_TYPE <> 'LBL'" Dim dt As DataTable = ClassDatabase.Return_Datatable(sql) Dim missingIndexControls As New List(Of String) For Each row As DataRow In dt.Rows If NotNull(row.Item("INDEX_NAME"), String.Empty) = String.Empty Then missingIndexControls.Add(row.Item("NAME")) End If Next If missingIndexControls.Count > 0 Then e.Cancel = True Dim missingControls As String = String.Join(vbCrLf, missingIndexControls.ToArray()) MsgBox($"Für die folgenden Controls wurden noch keine Indexdefinitionen hinterlegt: {vbCrLf}{vbCrLf}{missingControls}") End If End If If Application.OpenForms().OfType(Of frmControl_Detail).Any Then frmControl_Detail.Close() End If End Sub Private Sub frmFormDesigner_Load(sender As Object, e As System.EventArgs) Handles Me.Load Try lblDesign.Text = "FormDesigner für Profil: " & CURRENT_ProfilName 'löscht alle Controls pnldesigner.Controls.Clear() CURRENT_CONTROL = Nothing Try ' Windream initialisieren clsWindream.Create_Session() Catch ex As Exception MsgBox("Fehler bei Initialisieren von windream: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") End Try Try TBPM_PROFILE_CONTROLSTableAdapter.Connection.ConnectionString = MyConnectionString TBPM_CONNECTIONTableAdapter.Connection.ConnectionString = MyConnectionString TBWH_CHECK_PROFILE_CONTROLSTableAdapter.Connection.ConnectionString = MyConnectionString TBPM_CONTROL_TABLETableAdapter.Connection.ConnectionString = MyConnectionString TBPM_CONNECTIONTableAdapter.Fill(DD_DMSLiteDataSet.TBPM_CONNECTION) Catch ex As Exception MsgBox("Fehler bei Laden der Connection-Strings und Grunddaten: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") End Try Load_indexe() Controls_laden() Catch ex As System.Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "error loading form:") End Try End Sub Sub Load_indexe() cmbIndex.Items.Clear() Dim indexe = clsWD_GET.GetIndicesByObjecttype(CURRENT_OBJECTTYPE) If indexe IsNot Nothing Then cmbIndex.Items.Add("") For Each index As String In indexe cmbIndex.Items.Add(index) Next cmbIndex.Items.Add("DD PM-ONLY FOR DISPLAY") cmbIndex.SelectedIndex = -1 End If End Sub Sub Load_Indexe_Vektor() Try Me.cmbIndex.Items.Clear() Dim indexe = clsWD_GET.GetIndicesByObjecttype(CURRENT_OBJECTTYPE) If indexe IsNot Nothing Then Me.cmbIndex.Items.Add("") For Each index As String In indexe Dim _vektorString As Boolean = False Select Case clsWD_GET.GetTypeOfIndexAsIntByName(index) Case 4107 'Vektor Zahl _vektorString = True Case 4097 _vektorString = True Case Else _vektorString = False End Select If _vektorString = True Then Me.cmbIndex.Items.Add(index) End If Next End If Catch ex As Exception MsgBox("Fehler bei Indexe Volltext eintragen: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") End Try End Sub Sub Load_Control(Optional ID As Integer = 0) _loading = True Try TabControlEigenschaften.SelectedIndex = 0 cmbIndex.Visible = False INDEX_NAMETextBox.Visible = False If ID = 0 Then If IsNothing(CURRENT_CONTROL.Tag) Then Dim ID_CTRL = GetControlGUID(CURRENT_CONTROL.Name) If ID_CTRL > 0 Then CURRENT_CONTROL.Tag = ID_CTRL End If End If CURRENT_CONTROL_ID = CURRENT_CONTROL.Tag Else CURRENT_CONTROL_ID = ID End If If CURRENT_CONTROL_ID <> 0 Then gbxControl.Enabled = True TBPM_PROFILE_CONTROLSTableAdapter.Fill(DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS, CURRENT_CONTROL_ID) Dim dt As DataTable = DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS Dim dr As DataRow = dt.Rows(0) If dr Is Nothing = False Then ' MsgBox(dr.Item("INDEX_NAME").ToString) If dr.Item("INDEX_NAME").ToString.StartsWith("[%VKT") Then Me.rbVektor.Checked = True Me.rbIndex.Checked = False Me.INDEX_NAMETextBox.Visible = True Me.cmbIndex.Visible = False Me.INDEX_NAMETextBox.Text = dr.Item("INDEX_NAME").ToString.Replace("[%VKT", "") Else Me.rbIndex.Checked = True Me.rbVektor.Checked = False Me.INDEX_NAMETextBox.Visible = False Me.cmbIndex.Visible = True IDX_CMB(CURRENT_CONTROL.Name) End If Try If CheckBoxAuswahlliste.Visible = False Then _loading = False Exit Sub End If If dr.Item("CHOICE_LIST") <> "" Then CheckBoxAuswahlliste.Checked = True CHOICE_LISTTextBox.Text = dr.Item("CHOICE_LIST") End If Catch ex As Exception CheckBoxAuswahlliste.Checked = False End Try End If Else gbxControl.Enabled = False tslblAenderungen.Visible = True tslblAenderungen.Text = "Konte das aktuelle Control nicht wählen!!" End If btnsave.Visible = True Catch ex As Exception If Not ex.Message.Contains("Data Reader") Then MsgBox("Fehler bei Laden des Controls: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") End If End Try _loading = False End Sub Sub Controls_laden() Try TBPM_PROFILE_CONTROLSTableAdapter.FillByProfil(DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS, CURRENT_ProfilGUID) TBPM_CONTROL_TABLETableAdapter.FillAll(DD_DMSLiteDataSet.TBPM_CONTROL_TABLE) ' löscht alle Controls pnldesigner.Controls.Clear() Dim dt As DataTable = DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS For Each row As DataRow In dt.Rows ' Ein Base Control erstellen Dim guid As Integer = row.Item("GUID") Dim name As String = row.Item("NAME") Dim x As Integer = row.Item("X_LOC") Dim y As Integer = row.Item("Y_LOC") Dim style As FontStyle = NotNull(row.Item("FONT_STYLE"), FontStyle.Regular) Dim size As Single = NotNull(row.Item("FONT_SIZE"), 10) Dim familyString As String = NotNull(row.Item("FONT_FAMILY"), "Arial") Dim family As FontFamily = New FontFamily(familyString) Dim font As New Font(family, size, style, GraphicsUnit.Point) Dim color As Color = IntToColor(NotNull(row.Item("FONT_COLOR"), 0)) ' Jetzt die Control spezifischen Eigenschaften zuweisen Select Case row.Item("CTRL_TYPE") Case "TXT" Dim txt = ClassControlCreator.CreateExistingTextbox(row, True) pnldesigner.Controls.Add(txt) SetMovementHandlers(txt) 'Dim ctrl = CreateBaseControl(New TextBox, guid, name, x, y, font, color) 'AddExistingTextbox(ctrl, row.Item("WIDTH"), row.Item("HEIGHT")) Case "LBL" Dim lbl = ClassControlCreator.CreateExistingLabel(row, True) pnldesigner.Controls.Add(lbl) SetMovementHandlers(lbl) 'Dim ctrl = CreateBaseControl(New Label, guid, name, x, y, font, color) 'AddExistingLabel(ctrl, row.Item("CTRL_TEXT")) Case "CMB" Dim cmb = ClassControlCreator.CreateExistingCombobox(row, True) pnldesigner.Controls.Add(cmb) SetMovementHandlers(cmb) 'Dim ctrl = CreateBaseControl(New ComboBox, guid, name, x, y, font, color) 'AddExistingCombobox(ctrl, row.Item("WIDTH"), row.Item("HEIGHT")) Case "DTP" Dim dtp = ClassControlCreator.CreateExistingDatepicker(row, True) pnldesigner.Controls.Add(dtp) SetMovementHandlers(dtp) 'Dim ctrl = CreateBaseControl(New ComboBox, guid, name, x, y, font, color) 'AddExistingDatetimepicker(ctrl, row.Item("WIDTH"), row.Item("HEIGHT")) Case "CHK" Dim chk = ClassControlCreator.CreateExisingCheckbox(row, True) pnldesigner.Controls.Add(chk) SetMovementHandlers(chk) 'Dim ctrl = CreateBaseControl(New CheckBox, guid, name, x, y, font, color) 'AddExistingCheckbox(ctrl, row.Item("CTRL_TEXT"), row.Item("WIDTH"), row.Item("HEIGHT")) Case "DGV" Dim dgv = ClassControlCreator.CreateExistingDataGridView(row, True) pnldesigner.Controls.Add(dgv) SetMovementHandlers(dgv) 'Dim ctrl = CreateBaseControl(New DataGridView, guid, name, x, y, font, color) 'AddExistingDatagridview(ctrl, row.Item("WIDTH"), row.Item("HEIGHT")) Case "TABLE" Dim columns As List(Of DD_DMSLiteDataSet.TBPM_CONTROL_TABLERow) = (From r As DD_DMSLiteDataSet.TBPM_CONTROL_TABLERow In DD_DMSLiteDataSet.TBPM_CONTROL_TABLE Where r.CONTROL_ID = guid Select r).ToList() Dim table = ClassControlCreator.CreateExistingTable(row, columns, True) pnldesigner.Controls.Add(table) SetMovementHandlers(table) End Select Next Catch ex As Exception MsgBox("Fehler bei Controls_laden: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") End Try End Sub Private Sub DragDropButtons_MouseDown(sender As Object, e As MouseEventArgs) Handles btnlabel.MouseDown, btntextbox.MouseDown, btncmb.MouseDown, btndtp.MouseDown, btnVektor.MouseDown, btnTabelle.MouseDown, btnCheckbox.MouseDown MouseIsDown = True CURRENT_CONTROL = Nothing Try TBPM_PROFILE_CONTROLSBindingSource.Clear() Catch ex As Exception End Try End Sub Private Sub DragDropButtons_MouseMove(sender As Object, e As MouseEventArgs) Handles btnlabel.MouseMove, btntextbox.MouseMove, btncmb.MouseMove, btndtp.MouseMove, btnVektor.MouseMove, btnTabelle.MouseMove, btnCheckbox.MouseMove If MouseIsDown Then Dim btn As Button = sender Dim dragDropData As String Select Case btn.Name Case "btnlabel" dragDropData = "lbl" Case "btntextbox" dragDropData = "txt" Case "btncmb" dragDropData = "cmb" Case "btndtp" dragDropData = "dtp" Case "btnVektor" dragDropData = "dgv" Case "btnTabelle" dragDropData = "tb" Case "btnCheckbox" dragDropData = "chk" End Select btn.DoDragDrop(dragDropData, DragDropEffects.Copy) End If End Sub Private Sub btnlabel_MouseMove(sender As Object, e As MouseEventArgs) Handles btnlabel.MouseMove If MouseIsDown Then ' Initiate dragging. btnlabel.DoDragDrop("lbl", DragDropEffects.Copy) End If MouseIsDown = False End Sub Private Sub btntextbox_MouseMove(sender As Object, e As MouseEventArgs) Handles btntextbox.MouseMove If MouseIsDown Then ' Initiate dragging. btntextbox.DoDragDrop("txt", DragDropEffects.Copy) End If MouseIsDown = False End Sub Private Sub Panel2_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles pnldesigner.DragDrop Dim r As New Random() Dim random As Integer = r.Next(8, 100) Select Case e.Data.GetData(DataFormats.Text) Case "lbl" 'idxlbl += 1 AddNewLabel("lbl" & random.ToString) Case "txt" 'idxtxt += 1 AddNewTextbox("txt" & random) Case "cmb" 'idxcmb += 1 AddNewCombobox("cmb" & random) Case "dtp" 'idxdtp += 1 AddNewDatetimepicker("dtp" & random) Case "dgv" 'idxdgv += 1 AddNewDGV("dgv" & random) Case "chk" ' idxchk += 1 AddNewCheckbox("chk" & random) Case "tb" AddNewTable("tb" & random) End Select End Sub Private Sub Panel2_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles pnldesigner.DragEnter ' Check the format of the data being dropped. If (e.Data.GetDataPresent(DataFormats.Text)) Then ' Display the copy cursor. e.Effect = DragDropEffects.Copy Else ' Display the no-drop cursor. e.Effect = DragDropEffects.None End If End Sub Private Function GetControlGUID(control_name As String) Try CURRENT_CONTROL_ID = TBPM_PROFILE_CONTROLSTableAdapter.cmdGetGUID(CURRENT_ProfilGUID, control_name) Return CURRENT_CONTROL_ID Catch ex As Exception MsgBox("Fehler bei GetControlGUID: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Achtung:") Return 0 End Try End Function Function AddNewLabel(lblname As String) Try Dim lbl As New Label lbl.Name = lblname lbl.Text = "Bez. definieren" lbl.AutoSize = True Dim clientPosition As Point = pnldesigner.PointToClient(Cursor.Position) lbl.Location = New Point(clientPosition) pnldesigner.Controls.Add(lbl) CURRENT_CONTROL = lbl SetMovementHandlers(lbl) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, lbl.Name, "LBL", lblname, lbl.Location.X, lbl.Location.Y, Environment.UserName, 16, 200) CURRENT_CONTROL.Tag = GetLastID() 'Load_Control() btnsave.Visible = True Catch ex As Exception MsgBox("Fehler bei Anlegen Label: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingLabel(lbl As Label, text As String) lbl.Text = text lbl.AutoSize = True pnldesigner.Controls.Add(lbl) SetMovementHandlers(lbl) End Function Private Function GetLastID() Dim sql = String.Format("SELECT MAX(GUID) FROM TBPM_PROFILE_CONTROLS WHERE PROFIL_ID = {0}", CURRENT_ProfilGUID) Return ClassDatabase.Execute_Scalar(sql, MyConnectionString, True) End Function Function AddNewTextbox(txtname As String) Try Dim txt As New TextBox txt.Name = txtname txt.Size = New Size(200, 27) txt.Cursor = Cursors.Hand txt.ReadOnly = True Dim clientPosition As Point = pnldesigner.PointToClient(Cursor.Position) txt.Location = New Point(clientPosition) txt.BackColor = Color.White pnldesigner.Controls.Add(txt) CURRENT_CONTROL = txt SetMovementHandlers(txt) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, txt.Name, "TXT", txtname, txt.Location.X, txt.Location.Y, Environment.UserName, 27, 200) CURRENT_CONTROL.Tag = GetLastID() btnsave.Visible = True Catch ex As Exception MsgBox("Fehler bei Anlegen TextBox: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingTextbox(txt As TextBox, vwidth As Integer, vheight As Integer) If vheight > 27 Then txt.Multiline = True Else txt.Multiline = False End If txt.Size = New Size(vwidth, vheight) txt.Cursor = Cursors.Hand txt.ReadOnly = True txt.BackColor = Color.White pnldesigner.Controls.Add(txt) SetMovementHandlers(txt) btnsave.Visible = True End Function Function AddNewCheckbox(chkname As String) Try Dim chk As New CheckBox chk.Name = chkname 'chk.Size = New Size(200, 27) chk.AutoSize = True chk.Text = "Beschriftung def." chk.Cursor = Cursors.Hand Dim clientPosition As Point = pnldesigner.PointToClient(Cursor.Position) chk.Location = New Point(clientPosition) pnldesigner.Controls.Add(chk) CURRENT_CONTROL = chk SetMovementHandlers(chk) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, chk.Name, "CHK", chkname, chk.Location.X, chk.Location.Y, Environment.UserName, 27, 200) CURRENT_CONTROL.Tag = GetLastID() 'Load_Control() btnsave.Visible = True Catch ex As Exception MsgBox("Fehler bei Anlegen Checkbox: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingCheckbox(chk As CheckBox, text As String, vwidth As Integer, vheight As Integer) chk.AutoSize = True chk.Text = text chk.Cursor = Cursors.Hand pnldesigner.Controls.Add(chk) SetMovementHandlers(chk) btnsave.Visible = True End Function Function AddNewCombobox(cmbname As String) Try Dim cmb As New ComboBox cmb.Name = cmbname cmb.Size = New Size(180, 24) cmb.Cursor = Cursors.Hand Dim clientPosition As Point = Me.pnldesigner.PointToClient(Cursor.Position) cmb.Location = New Point(clientPosition) pnldesigner.Controls.Add(cmb) CURRENT_CONTROL = cmb SetMovementHandlers(cmb) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, cmb.Name, "CMB", cmbname, cmb.Location.X, cmb.Location.Y, Environment.UserName, 24, 180) CURRENT_CONTROL.Tag = GetLastID() 'Load_Control() btnsave.Visible = True Catch ex As Exception MsgBox("Fehler bei Anlegen Combobox: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingCombobox(cmb As ComboBox, vwidth As Integer, vheight As Integer) cmb.Size = New Size(vwidth, vheight) cmb.Cursor = Cursors.Hand pnldesigner.Controls.Add(cmb) SetMovementHandlers(cmb) btnsave.Visible = True End Function Function AddExistingDatetimepicker(dtp As DateTimePicker, vwidth As Integer, vheight As Integer) dtp.Size = New Size(vwidth, vheight) dtp.Cursor = Cursors.Hand dtp.Format = DateTimePickerFormat.Short pnldesigner.Controls.Add(dtp) SetMovementHandlers(dtp) btnsave.Visible = True End Function Function AddNewDatetimepicker(dtpname As String) Try Dim dtp As New DateTimePicker dtp.Name = dtpname dtp.Size = New Size(180, 24) dtp.Cursor = Cursors.Hand dtp.Format = DateTimePickerFormat.Short Dim clientPosition As Point = Me.pnldesigner.PointToClient(Cursor.Position) dtp.Location = New Point(clientPosition) pnldesigner.Controls.Add(dtp) CURRENT_CONTROL = dtp SetMovementHandlers(dtp) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, dtp.Name, "DTP", dtpname, dtp.Location.X, dtp.Location.Y, Environment.UserName, 24, 180) CURRENT_CONTROL.Tag = GetLastID() 'Load_Control() Catch ex As Exception MsgBox("Fehler bei Anlegen DatetimePicker: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingDatagridview(dgv As DataGridView, vwidth As Integer, vheight As Integer) dgv.Size = New Size(vwidth, vheight) dgv.Cursor = Cursors.Hand dgv.AllowUserToAddRows = False dgv.AllowUserToDeleteRows = False dgv.AllowUserToResizeColumns = False dgv.AllowUserToResizeRows = False Dim col As New DataGridViewTextBoxColumn col.HeaderText = "" col.Name = "column1" dgv.Columns.Add(col) pnldesigner.Controls.Add(dgv) SetMovementHandlers(dgv) btnsave.Visible = True End Function Function AddNewDGV(dgvName As String) Try Dim dgv As New DataGridView dgv.Name = dgvName dgv.Size = New Size(130, 150) dgv.Cursor = Cursors.Hand Dim clientPosition As Point = Me.pnldesigner.PointToClient(System.Windows.Forms.Cursor.Position) dgv.Location = New Point(clientPosition) dgv.AllowUserToAddRows = False dgv.AllowUserToDeleteRows = False dgv.AllowUserToResizeColumns = False dgv.AllowUserToResizeRows = False Dim col As New DataGridViewTextBoxColumn col.HeaderText = "" col.Name = "column1" dgv.Columns.Add(col) pnldesigner.Controls.Add(dgv) CURRENT_CONTROL = dgv SetMovementHandlers(dgv) TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, dgv.Name, "DGV", dgvName, dgv.Location.X, dgv.Location.Y, Environment.UserName, 130, 150) CURRENT_CONTROL.Tag = GetLastID() 'Load_Control() Catch ex As Exception MsgBox("Fehler bei Anlegen DGV: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddNewTable(tableName As String) Try Dim table As New DataGridView table.Name = tableName table.Size = New Size(200, 150) table.Cursor = Cursors.Hand Dim clientPosition As Point = Me.pnldesigner.PointToClient(System.Windows.Forms.Cursor.Position) table.Location = New Point(clientPosition) table.AllowUserToAddRows = False table.AllowUserToDeleteRows = False table.AllowUserToResizeColumns = True table.AllowUserToResizeRows = False Dim col1 As New DataGridViewTextBoxColumn With { .HeaderText = "Column1", .Name = "column1" } Dim col2 As New DataGridViewTextBoxColumn With { .HeaderText = "Column2", .Name = "column2" } table.Columns.Add(col1) table.Columns.Add(col2) pnldesigner.Controls.Add(table) CURRENT_CONTROL = table SetMovementHandlers(table) AddHandler table.ColumnHeaderMouseClick, AddressOf table_ColumnHeaderMouseClick TBPM_PROFILE_CONTROLSTableAdapter.cmdInsertAnlage(CURRENT_ProfilGUID, table.Name, "TABLE", tableName, table.Location.X, table.Location.Y, Environment.UserName, 130, 150) CURRENT_CONTROL.Tag = GetLastID() TBPM_CONTROL_TABLETableAdapter.Insert(CURRENT_CONTROL.Tag, "column1", "Column1", 95, Environment.UserName) TBPM_CONTROL_TABLETableAdapter.Insert(CURRENT_CONTROL.Tag, "column2", "Column2", 95, Environment.UserName) 'Load_Control() Catch ex As Exception MsgBox("Fehler bei Anlegen Tabelle: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) End Try End Function Function AddExistingTable(table As DataGridView, vwidth As Integer, vheight As Integer) table.Size = New Size(vwidth, vheight) table.Cursor = Cursors.Hand table.AllowUserToAddRows = False table.AllowUserToDeleteRows = False table.AllowUserToResizeColumns = True table.AllowUserToResizeRows = False CURRENT_CONTROL = table 'Columns laden TBPM_CONTROL_TABLETableAdapter.Fill(Me.DD_DMSLiteDataSet.TBPM_CONTROL_TABLE, table.Tag) Dim DT As DataTable = Me.DD_DMSLiteDataSet.TBPM_CONTROL_TABLE If DT.Rows.Count > 0 Then For Each Row As DataRow In DT.Rows Dim col As New DataGridViewTextBoxColumn col.HeaderText = Row.Item("SPALTEN_HEADER") col.Name = Row.Item("SPALTENNAME") col.Width = Row.Item("SPALTENBREITE") table.Columns.Add(col) Next End If pnldesigner.Controls.Add(table) SetMovementHandlers(table) AddHandler table.ColumnHeaderMouseClick, AddressOf table_ColumnHeaderMouseClick btnsave.Visible = True End Function Sub SetActiveControlColor() CURRENT_CONTROL.BackColor = Color.DarkOrange For Each inctrl As Control In Me.pnldesigner.Controls If inctrl.Name <> CURRENT_CONTROL.Name Then Dim Type As String = inctrl.GetType.ToString Select Case Type Case "System.Windows.Forms.TextBox" inctrl.BackColor = Color.White Case "System.Windows.Forms.ComboBox" inctrl.BackColor = Color.White Case "System.Windows.Forms.Label" inctrl.BackColor = Color.Transparent Case "System.Windows.Forms.CheckBox" inctrl.BackColor = Color.Transparent End Select End If Next End Sub 'Public Sub OndgvClick(sender As System.Object, e As System.EventArgs) ' CURRENT_CONTROL = sender ' Dim dgv As DataGridView = sender ' CURRENT_CONTROL = dgv ' If dgv.ColumnCount > 1 Then ' Me.rbVektor.Visible = False ' Load_Indexe_Vektor() ' Dim selectedColumnCount As Integer = dgv.Columns.GetColumnCount(DataGridViewElementStates.Selected) ' If selectedColumnCount > 0 Then ' COLUMN_GUID = TBPM_CONTROL_TABLETableAdapter.getColumnID(CURRENT_CONTROL_ID, dgv.SelectedColumns(selectedColumnCount).Name) ' End If ' Else ' Load_indexe() ' Me.rbVektor.Visible = True ' COLUMN_GUID = Nothing ' End If ' 'Load_Control() ' Me.lblBeschriftung.Visible = False ' Me.CTRL_TEXTTextBox.Visible = False ' Me.lblIndex.Visible = True ' Me.cmbIndex.Visible = True ' Me.rbIndex.Visible = True ' Me.CheckBoxAuswahlliste.Visible = False ' Me.CHOICE_LISTTextBox.Visible = False ' Me.lblAuswahlliste.Visible = False ' Me.VALIDATIONCheckBox.Visible = True ' gbxControl.Visible = True ' CHOICE_LISTTextBox.Visible = False ' 'Me.pnlAuswahlliste.Enabled = False ' Me.READ_ONLYCheckBox.Visible = True ' Me.LOAD_IDX_VALUECheckBox.Visible = True 'End Sub Public Sub table_ColumnHeaderMouseClick(sender As System.Object, e As DataGridViewCellMouseEventArgs) CURRENT_CONTROL = sender Dim dgv As DataGridView = sender CURRENT_CONTROL = dgv Me.rbVektor.Visible = False Dim dgvColumn As DataGridViewColumn = dgv.Columns(e.ColumnIndex) COLUMN_GUID = TBPM_CONTROL_TABLETableAdapter.getColumnID(CURRENT_CONTROL_ID, dgvColumn.Name) If Application.OpenForms().OfType(Of frmControl_Detail).Any Then ' MessageBox.Show("Opened") Else frmTableColumn = New frmControl_Detail frmTableColumn.Show() End If frmTableColumn.FillData(COLUMN_GUID) frmTableColumn.Text = "Konfiguration von Spalte: " & dgvColumn.Name 'Load_Control() Me.lblBeschriftung.Visible = True Me.CTRL_TEXTTextBox.Visible = True Me.lblIndex.Visible = True Me.cmbIndex.Visible = True Me.rbIndex.Visible = True Me.CheckBoxAuswahlliste.Visible = False Me.CHOICE_LISTTextBox.Visible = False Me.lblAuswahlliste.Visible = False Me.VALIDATIONCheckBox.Visible = True gbxControl.Visible = True ' Me.pnlAuswahlliste.Enabled = False Me.READ_ONLYCheckBox.Visible = True Me.LOAD_IDX_VALUECheckBox.Visible = True End Sub Sub IDX_CMB(controlname As String) Try Dim guid As Integer = TBPM_PROFILE_CONTROLSTableAdapter.cmdGetGUID(CURRENT_ProfilGUID, controlname) Dim indexname As String = TBPM_PROFILE_CONTROLSTableAdapter.cmdGetIndexname(guid) 'If indexname.StartsWith("[%") Then ' indexname = indexname.Replace("[%", "") 'End If cmbIndex.SelectedIndex = cmbIndex.FindStringExact(indexname) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "IDX_CMB:") End Try End Sub Sub delete_Control(_ctrlname As String) Try Dim result As MsgBoxResult = MsgBox("Wollen Sie das Control: " & _ctrlname & " wirklich löschen?", MsgBoxStyle.YesNo, "Bestätigung:") ' wenn Speichern ja If result = MsgBoxResult.Yes Then Dim guid As Integer = TBPM_PROFILE_CONTROLSTableAdapter.cmdGetGUID(CURRENT_ProfilGUID, _ctrlname) If guid > 0 Then Me.TBPM_CONTROL_TABLETableAdapter.Delete(guid) TBPM_PROFILE_CONTROLSTableAdapter.Delete(guid) Controls_laden() End If End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "delete_Control:") End Try End Sub ' +++ Public Helper Methods +++ Public Function GetCursorPosition() As Point Return pnldesigner.PointToClient(Cursor.Position) End Function Sub Clear_control_Details() Try CURRENT_CONTROL = Nothing TBPM_PROFILE_CONTROLSBindingSource.Clear() Catch ex As Exception End Try End Sub 'Private Sub MovableDGV_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown ' ' Check to see if the correct button has been pressed ' If e.Button = Windows.Forms.MouseButtons.Left And Cursor = Cursors.Default Then ' Clear_control_Details() ' Dim dgv As DataGridView = DirectCast(sender, DataGridView) ' Dim relativeMousePosition As Point = dgv.PointToClient(Cursor.Position) ' Dim hit As DataGridView.HitTestInfo = dgv.HitTest(relativeMousePosition.X, relativeMousePosition.Y) ' If hit.Type.ToString = "ColumnHeader" Then ' Exit Sub ' End If ' CURRENT_CONTROL = sender ' BeginLocation = e.Location ' CURRENT_CONTROL.Tag = New clsDragInfo(Form.MousePosition, sender.Location) ' dgv.BringToFront() ' ' Set the mode flag to signal the MouseMove event handler that it ' ' needs to now calculate new positions for our control ' MouseMoving = True ' CURRENT_CONTROL = sender ' 'Jetzt Controleigenschaften laden ' SetActiveControlColor() ' 'Load_Control() ' gbxControl.Visible = True ' End If 'End Sub 'Private Sub btnsave_Click(sender As System.Object, e As System.EventArgs) Handles btnsave.Click ' Save_Control() 'End Sub Sub Save_Control() Try If rbVektor.Checked Then If INDEX_NAMETextBox.Text = "" Then MsgBox("Bitte definieren Sie den Bezeichner für dieses Processmanager-Item:", MsgBoxStyle.Exclamation) Me.INDEX_NAMETextBox.BackColor = Color.Red Exit Sub Else Me.INDEX_NAMETextBox.BackColor = Color.White End If ' INDEX_NAME_VALUE.Text = "[%VKT" & INDEX_NAMETextBox.Text End If TBPM_PROFILE_CONTROLSBindingSource.EndEdit() If DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS.GetChanges Is Nothing = False Then Me.CHANGED_WHOTextBox.Text = Environment.UserName TBPM_PROFILE_CONTROLSBindingSource.EndEdit() TBPM_PROFILE_CONTROLSTableAdapter.Update(DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS) tslblAenderungen.Visible = True tslblAenderungen.Text = "Änderungen gespeichert - " & Now Else tslblAenderungen.Visible = False End If 'Wenn Datagridview dann Speichern Dim type As String = CURRENT_CONTROL.GetType.ToString If type.Contains("DataGridView") Then Dim dgv As DataGridView = DirectCast(CURRENT_CONTROL, DataGridView) If dgv.ColumnCount > 1 Then 'For Each col As DataColumn In dgv.Columns ' MsgBox(col.ColumnName) 'Next End If End If Catch ex As Exception If ex.Message.ToLower.Contains("interne datatable") = True Or ex.Message.ToLower.Contains("internal index is corrupted") = True Then Save_Control() ElseIf ex.Message.ToLower.Contains("geöffneter datareader") = True Then Exit Sub Else MsgBox(ex.Message, MsgBoxStyle.Critical, "Save Control:") End If End Try End Sub 'Private Sub cmbIndex_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbIndex.SelectedIndexChanged ' If cmbIndex.SelectedIndex <> -1 Then ' If cmbIndex.Text = "DD PM-ONLY FOR DISPLAY" Then ' LOAD_IDX_VALUECheckBox.Checked = False ' LOAD_IDX_VALUECheckBox.Enabled = False ' READ_ONLYCheckBox.Checked = True ' VALIDATIONCheckBox.Checked = False ' VALIDATIONCheckBox.Enabled = False ' Else ' LOAD_IDX_VALUECheckBox.Enabled = True ' VALIDATIONCheckBox.Enabled = True ' End If ' If _loading = False Then ' Save_Control() ' End If ' End If 'End Sub 'Private Sub btncmb_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles btncmb.MouseMove ' If MouseIsDown Then ' ' Initiate dragging. ' btncmb.DoDragDrop("cmb", DragDropEffects.Copy) ' End If ' MouseIsDown = False 'End Sub 'Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxAuswahlliste.CheckedChanged ' If CheckBoxAuswahlliste.Checked Then ' lblAuswahlliste.Visible = True ' CHOICE_LISTTextBox.Visible = True ' Else ' lblAuswahlliste.Visible = False ' CHOICE_LISTTextBox.Visible = False ' End If 'End Sub Private Sub btndelete_Click(sender As System.Object, e As EventArgs) Handles btndelete.Click If CURRENT_CONTROL Is Nothing = False Then delete_Control(CURRENT_CONTROL.Name) End If End Sub Private Sub btnwidth_plus_Click(sender As System.Object, e As EventArgs) Handles btnwidth_plus.Click If CURRENT_CONTROL Is Nothing = False Then CURRENT_CONTROL.Size = New Size(CURRENT_CONTROL.Width + 5, CURRENT_CONTROL.Height) UpdateSingleValue("WIDTH", CURRENT_CONTROL.Size.Width) End If End Sub Private Sub btnwidth_minus_Click(sender As System.Object, e As EventArgs) Handles btnwidth_minus.Click If CURRENT_CONTROL Is Nothing = False Then CURRENT_CONTROL.Size = New Size(CURRENT_CONTROL.Width - 5, CURRENT_CONTROL.Height) UpdateSingleValue("WIDTH", CURRENT_CONTROL.Size.Width) End If End Sub Private Sub btnheight_plus_Click(sender As System.Object, e As EventArgs) Handles btnheight_plus.Click If CURRENT_CONTROL Is Nothing = False Then Dim newHeight As Integer = CURRENT_CONTROL.Height + 5 If newHeight > 21 And TypeOf CURRENT_CONTROL Is TextBox Then DirectCast(CURRENT_CONTROL, TextBox).Multiline = True End If CURRENT_CONTROL.Size = New Size(CURRENT_CONTROL.Width, newHeight) UpdateSingleValue("WIDTH", newHeight) End If End Sub Private Sub btnheight_minus_Click(sender As System.Object, e As EventArgs) Handles btnheight_minus.Click If CURRENT_CONTROL Is Nothing = False Then Dim newHeight As Integer = CURRENT_CONTROL.Height - 5 If newHeight < 22 And TypeOf CURRENT_CONTROL Is TextBox Then DirectCast(CURRENT_CONTROL, TextBox).Multiline = True End If CURRENT_CONTROL.Size = New Size(CURRENT_CONTROL.Width, newHeight) UpdateSingleValue("WIDTH", newHeight) End If End Sub Private Sub Button2_MouseMove(sender As System.Object, e As MouseEventArgs) Handles btndtp.MouseMove If MouseIsDown Then 'Initiate dragging. btndtp.DoDragDrop("dtp", DragDropEffects.Copy) End If MouseIsDown = False End Sub Private Sub btnVektor_MouseMove(sender As Object, e As MouseEventArgs) Handles btnVektor.MouseMove If MouseIsDown Then 'Initiate dragging. btnVektor.DoDragDrop("dgv", DragDropEffects.Copy) End If MouseIsDown = False End Sub Private Sub btnTabelle_MouseMove(sender As Object, e As MouseEventArgs) Handles btnTabelle.MouseMove If MouseIsDown Then 'Initiate dragging. btnVektor.DoDragDrop("tb", DragDropEffects.Copy) End If MouseIsDown = False End Sub Private Sub Button1_MouseMove(sender As Object, e As MouseEventArgs) Handles btnCheckbox.MouseMove If MouseIsDown Then 'Initiate dragging. btnCheckbox.DoDragDrop("chk", DragDropEffects.Copy) End If MouseIsDown = False End Sub 'Private Sub rbIndex_CheckedChanged(sender As Object, e As EventArgs) Handles rbIndex.CheckedChanged ' If rbIndex.Checked Then ' cmbIndex.Visible = True ' INDEX_NAMETextBox.Visible = False ' lblIndex.Text = "Zugeordneter Index" ' Else ' cmbIndex.Visible = False ' INDEX_NAMETextBox.Visible = True ' lblIndex.Text = "Bezeichner und getätigte Eingabe werden in das Vektorfeld geschrieben" ' End If 'End Sub 'Private Sub rbVektor_CheckedChanged(sender As Object, e As EventArgs) Handles rbVektor.CheckedChanged ' If rbVektor.Checked Then ' Me.INDEX_NAMETextBox.Visible = True ' Me.cmbIndex.Visible = False ' Me.lblIndex.Text = "Bezeichner und getätigte Eingabe werden in das Vektorfeld geschrieben" ' Else ' Me.INDEX_NAMETextBox.Visible = False ' Me.cmbIndex.Visible = True ' Me.lblIndex.Text = "Zugeordneter Index" ' End If 'End Sub Private Sub INDEX_NAMETextBox_Leave(sender As Object, e As EventArgs) Handles INDEX_NAMETextBox.Leave If INDEX_NAMETextBox.Text <> "" And CURRENT_CONTROL_ID <> 0 Then TBPM_PROFILE_CONTROLSTableAdapter.cmdUpdateIndexname("[%VKT" & INDEX_NAMETextBox.Text, Environment.UserName, CURRENT_CONTROL_ID) End If End Sub Private Sub READ_ONLYCheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles READ_ONLYCheckBox.CheckedChanged If READ_ONLYCheckBox.Checked Then Me.VALIDATIONCheckBox.Checked = True Me.LOAD_IDX_VALUECheckBox.Checked = True End If End Sub Private Sub btnrefresh_Click(sender As Object, e As EventArgs) Handles btnrefresh.Click Controls_laden() End Sub Private Sub btnShowConnections_Click(sender As Object, e As EventArgs) Handles btnShowConnections.Click frmConnection.ShowDialog() Try Me.TBPM_CONNECTIONTableAdapter.Fill(Me.DD_DMSLiteDataSet.TBPM_CONNECTION) Catch ex As Exception ClassLogger.Add(ex.Message) End Try End Sub Private Sub btnEditor_Click(sender As Object, e As EventArgs) Handles btnEditor.Click Dim CONID = 0 If cmbConnection.SelectedValue > 0 Then CONID = cmbConnection.SelectedValue End If TBPM_PROFILE_CONTROLSBindingSource.EndEdit() If DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS.GetChanges Is Nothing = False Then Me.CHANGED_WHOTextBox.Text = Environment.UserName TBPM_PROFILE_CONTROLSBindingSource.EndEdit() TBPM_PROFILE_CONTROLSTableAdapter.Update(DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS) End If If CURRENT_CONTROL_ID <> 0 Then Dim sql = "SELECT T.CONNECTION_ID,T1.BEZEICHNUNG AS 'CON_STRING',ISNULL(T.SQL_UEBERPRUEFUNG,'') AS 'SQL_COMMAND' FROM TBPM_PROFILE_CONTROLS T, TBPM_CONNECTION T1 WHERE " & "T.CONNECTION_ID = T1.GUID AND T.GUID = " & CURRENT_CONTROL_ID CURRENT_DT_SQL_CONFIG_TABLE = ClassDatabase.Return_Datatable(sql, True) CURRENT_INDEX_ID = CURRENT_CONTROL_ID CURRENT_DESIGN_TYPE = "INPUT_INDEX" CURRENT_SQL_COMAMND = SQL_CommandTextBox.Text CURRENT_SQL_CON = CONID frmSQL_DESIGNER.ShowDialog() 'Load_Control(CURRENT_CONTROL_ID) TabControlEigenschaften.SelectedIndex = 2 Else MsgBox("Please choose a control!", MsgBoxStyle.Information) End If End Sub #Region "Rewrite" ''' ''' Setzt die Eventhandler für ein Control, die für die Bewegung via Drag & Drop und das Laden der Eigentschaften verantwortlich sind ''' ''' Das Control, für das die Eventhandler gesetzt werden sollen Private Sub SetMovementHandlers(control As Control) AddHandler control.Click, AddressOf OnControl_Click AddHandler control.MouseDown, AddressOf OnControl_MouseDown AddHandler control.MouseUp, AddressOf OnControl_MouseUp AddHandler control.MouseMove, AddressOf OnControl_MouseMove End Sub Private Sub OnControl_MouseDown(sender As Control, e As MouseEventArgs) If e.Button = MouseButtons.Left Then CURRENT_CONTROL = sender BeginLocation = e.Location sender.BringToFront() MouseMoving = True Console.WriteLine("CURRENT_CONTROL:" & CURRENT_CONTROL.Name) End If End Sub Private Sub OnControl_MouseUp(sender As Control, e As MouseEventArgs) If MouseMoving Then MouseMoving = False EndLocation = e.Location Dim CurrentPosition As Point = DirectCast(pgControls.SelectedObject, BaseProperties).Location If Point.op_Inequality(CurrentPosition, EndLocation) Then DirectCast(pgControls.SelectedObject, BaseProperties).Location = CURRENT_CONTROL.Location UpdateSingleValue("X_LOC", CURRENT_CONTROL.Location.X) UpdateSingleValue("Y_LOC", CURRENT_CONTROL.Location.Y) End If End If MyBase.Cursor = Cursors.Default End Sub Private Sub OnControl_MouseMove(sender As Control, e As MouseEventArgs) Try If CURRENT_CONTROL Is Nothing Then Exit Sub End If If MouseMoving Then Cursor = Cursors.Hand Refresh() Dim CurrentPosition As Point = GetCursorPosition() If Point.op_Inequality(CurrentPosition, BeginLocation) Then CURRENT_CONTROL.Location = New Point(CurrentPosition.X - BeginLocation.X, CurrentPosition.Y - BeginLocation.Y) End If End If Catch ex As Exception MouseMoving = False End Try End Sub ''' ''' Weist die grundlegenden Eigenschaften zu einem Properties Objekt zu ''' Die Properties werden an das Property Grid weitergegeben ''' ''' Das grundlegende Properties Objekt ''' Die DataRow, die die Eigenschaften des Controls enthält ''' Das gefüllt Properties Objekt Private Function CreatePropsObject(obj As BaseProperties, row As DataRow, Optional indicies As List(Of String) = Nothing) obj.ID = row.Item("GUID") obj.Location = New Point(row.Item("X_LOC"), row.Item("Y_LOC")) obj.Name = row.Item("NAME") obj.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT")) obj.ChangedAt = NotNull(row.Item("CHANGED_WHEN"), Nothing) obj.ChangedWho = NotNull(row.Item("CHANGED_WHO"), "") Dim style As FontStyle = NotNull(row.Item("FONT_STYLE"), FontStyle.Regular) Dim size As Single = NotNull(row.Item("FONT_SIZE"), 10) Dim familyString As String = NotNull(row.Item("FONT_FAMILY"), "Arial") Dim family As FontFamily = New FontFamily(familyString) obj.Font = New Font(family, size, style) Dim color As Integer = NotNull(row.Item("FONT_COLOR"), 0) obj.TextColor = IntToColor(color) Return obj End Function ''' ''' Funktioniert wie CreatePropsObject mit dem Unterschied, dass zusätzlich noch eine Liste von Indicies übergeben wird ''' Diese können dann im PropertyGrid angezeigt und ausgewählt werden. ''' Außerdem werden noch einige Eigenschaften gesetzt, die alle Controls (außer reine Anzeige-Controls) haben ''' ''' Das grundlegende Properties Objekt ''' Die DataRow, die die Eigenschaften des Controls enthält ''' Eine Liste von Indicies ''' Das gefüllt Properties Objekt Private Function CreatePropsObjectWithIndicies(obj As InputProperties, row As DataRow, indicies As List(Of String)) obj = CreatePropsObject(obj, row) obj.Indicies = indicies obj.ReadOnly = StrToBool(row.Item("READ_ONLY")) obj.Required = StrToBool(row.Item("VALIDATION")) obj.Index = NotNull(row.Item("INDEX_NAME"), "") obj.SQLCommand = New InputProperties.SQLValue(row.Item("SQL_UEBERPRUEFUNG")) Return obj End Function Private Sub OnControl_Click(sender As Control, e As MouseEventArgs) Dim props Dim dt As DataTable = DD_DMSLiteDataSet.TBPM_PROFILE_CONTROLS Dim row = dt.AsEnumerable().Where(Function(r As DataRow) Return r.Item("GUID") = sender.Tag End Function).Single() ' Globale Variablen setzen CURRENT_CONTROL = sender CURRENT_CONTROL_ID = sender.Tag SetActiveControlColor() gbxControl.Visible = True 'Windream Abfragen, sollten einmal beim Start des Formulars geladen werden Dim indicies As List(Of String) = clsWD_GET.GetIndicesByObjecttype(CURRENT_OBJECTTYPE).ToList() Dim choiceLists As List(Of String) = clsWD_GET.GetChoiceLists() ' Mithilfe von CreatePropsObject(WithIndicies) wird ein Basis Objekt mit grundlegenden ' Eigenschaften angelegt. Danach können für jeden Control Typ spezifische Eigenschaften festgelegt werden. If TypeOf sender Is Label Then Dim label As Label = sender Dim labelProps As LabelProperties = CreatePropsObject(New LabelProperties, row) labelProps.Text = label.Text props = labelProps ElseIf TypeOf sender Is CheckBox Then Dim check As CheckBox = sender Dim checkProps As CheckboxProperties = CreatePropsObjectWithIndicies(New CheckboxProperties, row, indicies) checkProps.Text = check.Text props = checkProps ElseIf TypeOf sender Is TextBox Then Dim txt As TextBox = sender Dim txtProps As TextboxProperties = CreatePropsObjectWithIndicies(New TextboxProperties, row, indicies) props = txtProps ElseIf TypeOf sender Is ComboBox Then Dim cmb As ComboBox = sender Dim cmbProps As ComboboxProperties = CreatePropsObjectWithIndicies(New ComboboxProperties, row, indicies) cmbProps.ChoiceLists = choiceLists cmbProps.ChoiceList = NotNull(row.Item("CHOICE_LIST"), "") props = cmbProps ElseIf TypeOf sender Is DateTimePicker Then Dim dtp As DateTimePicker = sender Dim dtpProps As DatepickerProperties = CreatePropsObjectWithIndicies(New DatepickerProperties, row, indicies) props = dtpProps ElseIf TypeOf sender Is DataGridView Then Dim grid As DataGridView = sender Dim gridProps As GridViewProperties = CreatePropsObjectWithIndicies(New GridViewProperties, row, indicies) props = gridProps Else MsgBox("This is not a supported control type!") Exit Sub End If ' Zum Schluss wird das Eigenschaften-Objekt ins PropertyGrid geladen pgControls.SelectedObject = props End Sub Private Sub pgControls_PropertyValueChanged(s As Object, e As PropertyValueChangedEventArgs) Handles pgControls.PropertyValueChanged Dim oldValue As Object = e.OldValue Dim newValue As Object = e.ChangedItem.Value Dim prop As String = e.ChangedItem.Label Select Case prop Case "Location" UpdateSingleValue("X_LOC", DirectCast(newValue, Point).X) UpdateSingleValue("Y_LOC", DirectCast(newValue, Point).Y) CURRENT_CONTROL.Location = newValue Case "X" UpdateSingleValue("X_LOC", CInt(newValue)) CURRENT_CONTROL.Location = New Point(newValue, CURRENT_CONTROL.Location.Y) Case "Y" UpdateSingleValue("Y_LOC", CInt(newValue)) CURRENT_CONTROL.Location = New Point(CURRENT_CONTROL.Location.X, newValue) Case "Size" UpdateSingleValue("WIDTH", DirectCast(newValue, Size).Width) UpdateSingleValue("HEIGHT", DirectCast(newValue, Size).Height) CURRENT_CONTROL.Size = newValue Case "Width" UpdateSingleValue("WIDTH", CInt(newValue)) CURRENT_CONTROL.Size = New Size(newValue, CURRENT_CONTROL.Size.Height) Case "Height" UpdateSingleValue("HEIGHT", CInt(newValue)) CURRENT_CONTROL.Size = New Size(CURRENT_CONTROL.Size.Width, newValue) Case "Name" UpdateSingleValue("NAME", newValue) CURRENT_CONTROL.Name = newValue Case "Index" UpdateSingleValue("INDEX_NAME", newValue) Case "Text" UpdateSingleValue("CTRL_TEXT", newValue) CURRENT_CONTROL.Text = newValue Case "Required" UpdateSingleValue("VALIDATION", IIf(newValue = True, 1, 0)) Case "ReadOnly" UpdateSingleValue("READ_ONLY", IIf(newValue = True, 1, 0)) Case "Font" Dim font As Font = newValue Dim fontSize As Integer = Math.Truncate(font.SizeInPoints) UpdateSingleValue("FONT_SIZE", fontSize) UpdateSingleValue("FONT_FAMILY", font.FontFamily.Name) UpdateSingleValue("FONT_STYLE", font.Style.ToString) CURRENT_CONTROL.Font = font Case "TextColor" Dim color As Color = newValue UpdateSingleValue("FONT_COLOR", ColorToInt(color)) CURRENT_CONTROL.ForeColor = color Case "SQLCommand" UpdateSingleValue("SQL_UEBERPRUEFUNG", newValue) UpdateSingleValue("CHOICE_LIST", "") Case "ChoiceList" UpdateSingleValue("CHOICE_LIST", newValue) UpdateSingleValue("SQL_UEBERPRUEFUNG", "") End Select End Sub Private Sub UpdateSingleValue(columnName As String, value As Object) Dim guid As Integer = CURRENT_CONTROL_ID Dim escapedValue = value ' Strings und SQL-Commands müssen vor dem speichern escaped und mit Anführungszeichen versehen werden If TypeOf value Is String Then escapedValue = $"'{value}'" ElseIf TypeOf value Is InputProperties.SQLValue Then Dim v As InputProperties.SQLValue = value escapedValue = $"'{v.Value.Replace("'", "''")}'" End If Try ClassDatabase.Execute_non_Query($"UPDATE TBPM_PROFILE_CONTROLS SET {columnName} = {escapedValue} WHERE GUID = {guid}") tslblAenderungen.Visible = True tslblAenderungen.Text = "Änderungen gespeichert - " & Now Catch ex As Exception Dim msg = $"Fehler beim Speichern von Control (Id: {guid}): {vbCrLf}{ex.Message}" MsgBox(msg) ClassLogger.Add(msg) End Try End Sub #End Region End Class