Imports DevExpress.Utils Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraEditors Imports DevExpress.XtraEditors.Repository Public Class ClassWindreamDocGrid Public Shared SELECTED_DOC_PATH As String 'Public Shared RESULT_OBJECTTYPE As String Public Shared SELECTED_INWORK As Boolean Public Shared SELECTED_DOC_ID As Integer 'Public Shared RESULT_DISPLAYNAME As String Public Shared RESULT_CONFIG_IDS As Hashtable Public Shared DT_RESULTFILES As DataTable Private Shared _dropdownValueChangedHandler As EventHandler Private Shared _datepickerValueChangedHandler As EventHandler Private Shared _textValueChangedHandler As EventHandler Private Shared Function Init_Table() Try Dim table As New DataTable table.TableName = "TBSELECTED_FILES" ' Create two columns, ID and Name. table.Columns.Add("DOC_ID", GetType(Integer)) table.Columns.Add("DOC_PATH", GetType(System.String)) table.Columns.Add("OBJECTTYPE", GetType(System.String)) table.Columns.Add("INWORK", GetType(System.Boolean)) table.Columns.Add("DISPLAYNAME", GetType(System.String)) DT_RESULTFILES = table Return True Catch ex As Exception ClassLogger.Add("Unexpected Error in Initting TableResult Docs: " & ex.Message, True) DT_RESULTFILES = Nothing Return False End Try End Function Public Shared Sub GetDocItems(gridView As GridView) If Init_Table() = True Then If gridView.SelectedRowsCount > 1 Then DT_RESULTFILES.Clear() For Each row In gridView.GetSelectedRows Dim newRow As DataRow = DT_RESULTFILES.NewRow() Try Dim DOC_ID = gridView.GetRowCellValue(row, "DocID") SELECTED_DOC_ID = DOC_ID newRow("DOC_ID") = gridView.GetRowCellValue(row, "DocID") Catch ex As Exception newRow("DOC_ID") = 0 SELECTED_DOC_ID = 0 End Try Try SELECTED_DOC_PATH = gridView.GetRowCellValue(row, "FULLPATH") newRow("DOC_PATH") = gridView.GetRowCellValue(row, "FULLPATH") Catch ex As Exception newRow("DOC_PATH") = "" End Try Try newRow("OBJECTTYPE") = gridView.GetRowCellValue(row, "OBJECTTYPE") Catch ex As Exception newRow("OBJECTTYPE") = "" End Try Try newRow("INWORK") = gridView.GetRowCellValue(row, "in work?") Catch ex As Exception newRow("INWORK") = False End Try Try Dim dpn = gridView.GetRowCellValue(row, "Displayname") If IsDBNull(dpn) Or IsNothing(dpn) Then dpn = "" End If newRow("DISPLAYNAME") = dpn Catch ex As Exception newRow("DISPLAYNAME") = "" End Try DT_RESULTFILES.Rows.Add(newRow) DT_RESULTFILES.AcceptChanges() Next Else Dim newRow As DataRow = DT_RESULTFILES.NewRow() Try Dim DOC_ID = gridView.GetFocusedRowCellValue(gridView.Columns("DocID")) SELECTED_DOC_ID = DOC_ID newRow("DOC_ID") = gridView.GetFocusedRowCellValue(gridView.Columns("DocID")) Catch ex As Exception newRow("DOC_ID") = 0 SELECTED_DOC_ID = 0 End Try Try SELECTED_DOC_PATH = gridView.GetFocusedRowCellValue(gridView.Columns("FULLPATH")) newRow("DOC_PATH") = gridView.GetFocusedRowCellValue(gridView.Columns("FULLPATH")) Catch ex As Exception newRow("DOC_PATH") = "" End Try Try newRow("OBJECTTYPE") = gridView.GetFocusedRowCellValue(gridView.Columns("OBJECTTYPE")) Catch ex As Exception newRow("OBJECTTYPE") = "" End Try Try newRow("INWORK") = gridView.GetFocusedRowCellValue(gridView.Columns("in work?")) Catch ex As Exception newRow("INWORK") = False End Try Try Dim dpn = gridView.GetFocusedRowCellValue(gridView.Columns("Displayname")) If IsDBNull(dpn) Or IsNothing(dpn) Then dpn = "" End If newRow("DISPLAYNAME") = dpn Catch ex As Exception newRow("DISPLAYNAME") = "" End Try DT_RESULTFILES.Rows.Add(newRow) DT_RESULTFILES.AcceptChanges() End If End If End Sub Public Shared Sub FillColumns(gridView As GridView, DT_RESULT As DataTable, DT_WINDREAM_RESULTLIST As DataTable, DT_DOCRESULT_DROPDOWN_ITEMS As DataTable, DropdownValueChangedHandler As EventHandler, DatepickerValueChangedHandler As EventHandler, TextValueChangedHandler As EventHandler, SearchType As String) ' Handler speichern _dropdownValueChangedHandler = DropdownValueChangedHandler _datepickerValueChangedHandler = DatepickerValueChangedHandler _textValueChangedHandler = TextValueChangedHandler ' Tabelle vor dem verändern klonen Dim clonedTable As DataTable = DT_RESULT.Clone() RESULT_CONFIG_IDS = New Hashtable() ' Datentypen der DataTable setzen For Each row As DataRow In DT_WINDREAM_RESULTLIST.Rows Dim guid As Integer = row.Item("GUID") Dim typeID As Integer = row.Item("TYPE_ID") Dim isVisible As Boolean = row.Item("VISIBLE") Dim isEditable As Boolean If SearchType = "RECORD" Then isEditable = row.Item("EDITABLE") Else isEditable = False End If Dim columnTitle As String = row.Item("HEADER_CAPTION") RESULT_CONFIG_IDS.Add(columnTitle, guid) ' Checkbox Spalte auf Boolean setzen If typeID = 2 And isVisible Then Dim checkboxColumn As DataColumn = clonedTable.Columns(columnTitle) If Not IsNothing(checkboxColumn) Then checkboxColumn.DataType = GetType(Boolean) End If End If ' Datepicker Spalte auf Date setzen If typeID = 3 And isVisible = True Then Dim datepickerColumn As DataColumn = clonedTable.Columns(columnTitle) If Not IsNothing(datepickerColumn) Then 'datepickerColumn.DataType = GetType(DateTime) End If End If Next ' Tabelle zurückspielen und zuweisen Try clonedTable.Load(DT_RESULT.CreateDataReader()) DT_RESULT = clonedTable ' Neues Dataset für Master- und Detail-Tabelle erstellen Dim ds As New DataSet() '### '### Dummy Code '### ' Detail Tabelle mit dummy Spalten erstellen Dim DT_DETAILS As New DataTable("DETAILS") DT_DETAILS.Columns.Add("docId", GetType(String)) DT_DETAILS.Columns.Add("Value", GetType(String)) ' Ein paar Rows hinzufügen, docId verweist auf Master-Tabelle DT_DETAILS.Rows.Add(220768, "test") DT_DETAILS.Rows.Add(220768, "haha") DT_DETAILS.Rows.Add(220777, "test1") DT_DETAILS.Rows.Add(220777, "test2") DT_DETAILS.Rows.Add(220777, "test3") DT_DETAILS.Rows.Add(220778, "test2") '### '### Dummy Code END '### ' Tabellen zum DataSet hinzufügen ds.Tables.Add(DT_RESULT) ds.Tables.Add(DT_DETAILS) ' Relation `docIdDetails` erstellen Dim keyColumn As DataColumn = ds.Tables(0).Columns("docId") Dim foreignColumn As DataColumn = ds.Tables(1).Columns("docId") Try ds.Relations.Add("docIdDetails", keyColumn, foreignColumn) Catch ex As Exception ClassLogger.Add(">> Could not set master-detail Relation DocSearch: " & ex.Message, False) End Try Dim gridControl As GridControl = gridView.GridControl ' Datasource auf Master-Tabelle setzen 'gridView.GridControl.DataSource = DT_RESULT gridControl.DataSource = ds.Tables(0) gridControl.ForceInitialize() ' Detail View anlegen und der Relation `docIdDetails` zuweisen Dim grvwDetail As New GridView(gridControl) grvwDetail.OptionsBehavior.Editable = False grvwDetail.OptionsView.ShowGroupPanel = False grvwDetail.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Style3D grvwDetail.OptionsView.EnableAppearanceEvenRow = True grvwDetail.Appearance.EvenRow.BackColor = Color.Aqua grvwDetail.Appearance.HeaderPanel.BackColor = Color.Aqua grvwDetail.Appearance.HeaderPanel.Options.UseBackColor = True gridControl.LevelTree.Nodes.Add("docIdDetails", grvwDetail) Catch ex As Exception ClassLogger.Add(">> Attention: Could not load converted datatable DocSearch: " & ex.Message, False) End Try gridView.Columns.Item("ICON").MaxWidth = 24 gridView.Columns.Item("ICON").MinWidth = 24 gridView.Columns.Item("FULLPATH").Visible = False gridView.Columns.Item("OBJECTTYPE").Visible = False gridView.Columns.Item("DocID").Visible = False Dim created, changed As String If USER_LANGUAGE <> "de-DE" Then changed = "Changed" created = "Created" Else changed = "Geändert" created = "Erstellt" End If Dim createdColumn = gridView.Columns(created) If Not IsNothing(createdColumn) Then createdColumn.DisplayFormat.FormatType = FormatType.DateTime createdColumn.DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss" End If Dim changedColumn = gridView.Columns(changed) If Not IsNothing(changedColumn) Then changedColumn.DisplayFormat.FormatType = FormatType.DateTime changedColumn.DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss" End If ' Alle Spalten aus ReadOnly setzen, danach werden alle passenden auf nicht ReadOnly gesetzt For Each column As GridColumn In gridView.Columns column.OptionsColumn.AllowEdit = False Next For Each row As DataRow In DT_WINDREAM_RESULTLIST.Rows Dim guid As Integer = row.Item("GUID") Dim width As Integer = row.Item("WIDTH") Dim typeID As Integer = row.Item("TYPE_ID") Dim isVisible As Boolean = row.Item("VISIBLE") Dim isEditable As Boolean If SearchType = "RECORD" Then isEditable = row.Item("EDITABLE") Else isEditable = False End If Dim columnTitle As String = row.Item("HEADER_CAPTION") ' Breite der Spalten setzen If Not IsNothing(width) And Not IsDBNull(width) Then Dim column = DirectCast(gridView.Columns.Item(row.Item("HEADER_CAPTION")), DevExpress.XtraGrid.Columns.GridColumn) If Not IsNothing(column) Then column.Width = width End If End If If typeID = 1 And isVisible And isEditable Then Dim textedit As New RepositoryItemTextEdit() Dim value As String = ClassDatabase.Execute_Scalar("SELECT VALUE FROM TBPMO_DOC_VALUES WHERE CONFIG_ID = " & guid) Dim col As GridColumn = gridView.Columns(columnTitle) gridView.GridControl.RepositoryItems.Add(textedit) 'Editor zuweisen If Not IsNothing(col) Then col.ColumnEdit = textedit col.OptionsColumn.AllowEdit = True col.AppearanceCell.BackColor = Color.LightCyan End If ' Handler zuweisen AddHandler textedit.Leave, _textValueChangedHandler 'ElseIf typeID = 1 And isVisible And isEditable = False Then ' Dim col As GridColumn = gridView.Columns(columnTitle) ' col.AppearanceCell.BackColor = Color.WhiteSmoke End If If typeID = 2 And isVisible Then Dim checkEdit As New RepositoryItemCheckEdit() checkEdit.ValueChecked = True checkEdit.ValueUnchecked = False Dim col As GridColumn = gridView.Columns(columnTitle) gridView.GridControl.RepositoryItems.Add(checkEdit) If Not IsNothing(col) Then col.ColumnEdit = checkEdit If isEditable Then col.OptionsColumn.AllowEdit = True col.AppearanceCell.BackColor = Color.LightCyan Else col.OptionsColumn.AllowEdit = False End If End If End If If typeID = 3 And isVisible And isEditable Then Dim dateedit As New RepositoryItemDateEdit() Dim col As GridColumn = gridView.Columns(columnTitle) gridView.GridControl.RepositoryItems.Add(dateedit) If Not IsNothing(col) Then col.ColumnEdit = dateedit col.OptionsColumn.AllowEdit = True col.AppearanceCell.BackColor = Color.LightGray col.DisplayFormat.FormatType = FormatType.DateTime col.DisplayFormat.FormatString = CURRENT_DATE_FORMAT '& " HH:MM:ss" End If AddHandler dateedit.EditValueChanged, _datepickerValueChangedHandler End If If typeID = 4 And isVisible And isEditable Then Dim dropdown As New RepositoryItemComboBox() ' Dropdown Items finden Dim matchingRows() As DataRow = DT_DOCRESULT_DROPDOWN_ITEMS.Select(String.Format("CONFIG_ID = {0}", guid), "SEQUENCE") ' Dropdown füllen For Each matchingRow As DataRow In matchingRows Dim item As New WindreamDocGridComboboxItem() item.ConfigID = matchingRow.Item("CONFIG_ID") item.Value = matchingRow.Item("VALUE") dropdown.Items.Add(item) Next ' Dropdown als Editor hinzufügen gridView.GridControl.RepositoryItems.Add(dropdown) Dim col As GridColumn = gridView.Columns(columnTitle) 'Editor zuweisen If Not IsNothing(col) Then col.OptionsColumn.AllowEdit = True col.ColumnEdit = dropdown col.AppearanceCell.BackColor = Color.LightCyan End If ' Handler zuweisen AddHandler dropdown.SelectedValueChanged, _dropdownValueChangedHandler 'ElseIf typeID = 4 And isVisible And isEditable = False Then ' Dim col As GridColumn = gridView.Columns(columnTitle) ' col.AppearanceCell.BackColor = Color.WhiteSmoke End If Next End Sub Public Class WindreamDocGridComboboxItem Implements IConvertible Public ConfigID As Integer Public Value As String Public Overrides Function ToString() As String Return Me.Value End Function Public Function ToString1(provider As IFormatProvider) As String Implements IConvertible.ToString Return Me.Value End Function Public Function GetTypeCode() As TypeCode Implements IConvertible.GetTypeCode Throw New NotImplementedException End Function Public Function ToBoolean(provider As IFormatProvider) As Boolean Implements IConvertible.ToBoolean Throw New NotImplementedException End Function Public Function ToByte(provider As IFormatProvider) As Byte Implements IConvertible.ToByte Throw New NotImplementedException End Function Public Function ToChar(provider As IFormatProvider) As Char Implements IConvertible.ToChar Throw New NotImplementedException End Function Public Function ToDateTime(provider As IFormatProvider) As Date Implements IConvertible.ToDateTime Throw New NotImplementedException End Function Public Function ToDecimal(provider As IFormatProvider) As Decimal Implements IConvertible.ToDecimal Throw New NotImplementedException End Function Public Function ToDouble(provider As IFormatProvider) As Double Implements IConvertible.ToDouble Throw New NotImplementedException End Function Public Function ToInt16(provider As IFormatProvider) As Short Implements IConvertible.ToInt16 Throw New NotImplementedException End Function Public Function ToInt32(provider As IFormatProvider) As Integer Implements IConvertible.ToInt32 Throw New NotImplementedException End Function Public Function ToInt64(provider As IFormatProvider) As Long Implements IConvertible.ToInt64 Throw New NotImplementedException End Function Public Function ToSByte(provider As IFormatProvider) As SByte Implements IConvertible.ToSByte Throw New NotImplementedException End Function Public Function ToSingle(provider As IFormatProvider) As Single Implements IConvertible.ToSingle Throw New NotImplementedException End Function Public Function ToType(conversionType As Type, provider As IFormatProvider) As Object Implements IConvertible.ToType Throw New NotImplementedException End Function Public Function ToUInt16(provider As IFormatProvider) As UShort Implements IConvertible.ToUInt16 Throw New NotImplementedException End Function Public Function ToUInt32(provider As IFormatProvider) As UInteger Implements IConvertible.ToUInt32 Throw New NotImplementedException End Function Public Function ToUInt64(provider As IFormatProvider) As ULong Implements IConvertible.ToUInt64 Throw New NotImplementedException End Function End Class End Class