Imports System.ComponentModel Imports DevExpress.Utils Imports DevExpress.XtraEditors Imports DevExpress.XtraEditors.Controls Imports DevExpress.XtraEditors.Repository Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraRichEdit Imports DevExpress.XtraTab Imports DevExpress.XtraTreeList Imports DevExpress.XtraTreeList.Columns Imports DevExpress.XtraTreeList.Nodes Imports DigitalData.Controls.DocumentViewer Imports DigitalData.Controls.SQLConfig Imports DigitalData.GUIs.Common Imports DigitalData.GUIs.Monitor.Constants Imports DigitalData.Modules.Config Imports DigitalData.Modules.Database Imports DigitalData.Modules.Language Imports DigitalData.Modules.Language.Utils Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Patterns Public Class frmMonitor Private ReadOnly ColumnMarkers As New List(Of String) From {"[HTML]", "[SQL]", "[FILENAME]"} Private ReadOnly SQLColumns As New List(Of String) From {"SELECT1", "SELECT2", "SELECT3", "SELECT4"} Private ReadOnly DocViewColumns As New List(Of String) From {"DOCVIEW1", "DOCVIEW2"} Private ReadOnly HtmlViewColumns As New List(Of String) From {"HTML1", "HTML2"} Private ReadOnly DataColumns As List(Of String) = SQLColumns. Concat(DocViewColumns). Concat(HtmlViewColumns). ToList Private ReadOnly DisplayColumns As New List(Of String) From {"COLUMN1", "COLUMN2", "COLUMN3", "ADDED_WHEN", "STATE", "ICON"} Private SQLResultGrids As List(Of GridControl) Private SQLResultTabs As List(Of XtraTabPage) Private SQLResultGridIndex As Integer = 0 Private ActiveSQLResultGrid As GridControl Private FileResultViewers As List(Of DocumentViewer) Private FileResultTabs As List(Of XtraTabPage) Private FileResultViewerIndex As Integer = 0 Private HtmlResultViewers As List(Of RichEditControl) Private HtmlResultTabs As List(Of XtraTabPage) Private TreeListResults As TreeList Private GridControlResults As GridControl Private GridViewResults As GridView Private MarkedColumns As New List(Of GridColumn) Private ActiveSearch As Search = Nothing Private GridBuilder As GridBuilder Private ControlHelper As Common.ControlHelper Private SearchLoader As SearchLoader Private ParamLoader As ParameterLoader Private LogConfig As LogConfig Private Logger As Logger Private ConfigManager As ConfigManager(Of Config) Private Database As MSSQLServer Private FormHelper As FormHelper Private Patterns As Patterns2 Private Workspace As Common.DocumentResultList.Workspace(Of Config) Private Validator As Validator Private GridLoader As GridLoader Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load Try LogConfig = New LogConfig(LogConfig.PathType.AppData, Nothing, Nothing, "Digital Data", "Monitor") Logger = LogConfig.GetLogger() ConfigManager = New ConfigManager(Of Config)(LogConfig, Application.UserAppDataPath, Application.CommonAppDataPath, Application.StartupPath) ConfigManager.Config.Debug = LogConfig.Debug Patterns = New Patterns2(LogConfig) FormHelper = New FormHelper(LogConfig, Me) ControlHelper = New Common.ControlHelper(LogConfig) Workspace = New DocumentResultList.Workspace(Of Config)(LogConfig, ConfigManager, WorkspaceManager1) If ConfigManager.Config.ConnectionString = String.Empty Then Dim oSQLConfig As New frmSQLConfig(LogConfig) If oSQLConfig.ShowDialog() = DialogResult.OK Then ConfigManager.Config.ConnectionString = oSQLConfig.ConnectionString ConfigManager.Save() Application.Restart() Else FormHelper.ShowErrorMessage(New ApplicationException("No Database configured. Application will close!"), "Form Load") Application.Exit() End If End If Dim oConnectionString = MSSQLServer.DecryptConnectionString(ConfigManager.Config.ConnectionString) Database = New MSSQLServer(LogConfig, oConnectionString) SearchLoader = New SearchLoader(LogConfig, ConfigManager.Config, Database) ParamLoader = New ParameterLoader(LogConfig, Database, LayoutControl1) GridBuilder = New GridBuilder() Validator = New Validator(LogConfig, LayoutControl1, AdornerUIManager2, ControlHelper) GridLoader = New GridLoader(LogConfig, SvgImageCollection1) InitGrid() InitTreeList() Dim oGrids As GridView() = New List(Of GridView) From {GridView1, GridView2, GridView3, GridView4}.ToArray GridBuilder.SetDefaults(oGrids) GridBuilder.SetClipboardHandler(oGrids) GridBuilder.SetReadOnlyOptions(oGrids) SQLResultGrids = New List(Of GridControl) From {GridControl1, GridControl2, GridControl3, GridControl4} SQLResultTabs = New List(Of XtraTabPage) From {XtraTabPageSQL1, XtraTabPageSQL2, XtraTabPageSQL3, XtraTabPageSQL4} FileResultViewers = New List(Of DocumentViewer) From {DocumentViewer1, DocumentViewer2} FileResultTabs = New List(Of XtraTabPage) From {XtraTabPageFile1, XtraTabPageFile2} HtmlResultViewers = New List(Of RichEditControl) From {RichEditControl1, RichEditControl2} HtmlResultTabs = New List(Of XtraTabPage) From {XtraTabPageHtml1, XtraTabPageHtml2} LoadSearches() Dim oLicense = LoadGDPicture() For Each oGrid In SQLResultGrids AddHandler oGrid.Enter, Sub() ActiveSQLResultGrid = oGrid btnExportDetails.Enabled = True End Sub AddHandler oGrid.Leave, Sub() ActiveSQLResultGrid = Nothing btnExportDetails.Enabled = False End Sub Next For Each oViewer As DocumentViewer In FileResultViewers oViewer.Init(LogConfig, oLicense) Next SplitContainerSQL.Collapsed = True SplitContainerFileHTML.Collapsed = True SetResultCount(0) Catch ex As Exception FormHelper.ShowErrorMessage(ex, "frmStart_Load") End Try End Sub Private Function LoadGDPicture() As String Dim oSQL = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE'" Return Database.GetScalarValue(oSQL) End Function Private Async Sub buttonSearch_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles buttonSearch.ItemClick Await LoadData() End Sub Private Async Function LoadData() As Threading.Tasks.Task(Of Boolean) Try SplashScreenManager1.ShowWaitForm() TreeListResults.DataSource = Nothing GridControlResults.DataSource = Nothing If cmbSearches.EditValue Is Nothing Then Return False End If Dim oSearch As Search = cmbSearches.EditValue MarkedColumns.Clear() HideAllTabs() Dim oMissingParams = Validator.Validate(oSearch) If oMissingParams = True Then Return False End If Dim oControls As List(Of Control) = LayoutControl1.Controls.Cast(Of Control).ToList() Dim oSQL = Patterns.ReplaceControlValues(oSearch.SQLCommand, oControls) Dim oTable As DataTable = Await Database.GetDatatableAsync(oSQL) If oSearch.ReturnType = Constants.ReturnTypeEnum.TreeView Then GridControlResults.Visible = False GridControlResults.Dock = DockStyle.None TreeListResults.Visible = True TreeListResults.Dock = DockStyle.Fill TreeListResults.DataSource = oTable Dim oMaxLength = 0 For Each oRow As DataRow In oTable.Rows Dim oProcess = oRow.Item("COLUMN1") Dim oLength = oProcess.ToString.Length If oLength > oMaxLength Then oMaxLength = oLength End If Next GridLoader.InitTreeListColumns(TreeListResults, oMaxLength) ' Show all columns in DisplayColumns List For Each oColumn In TreeListResults.Columns oColumn.Visible = DisplayColumns.Contains(oColumn.FieldName) If oColumn.FieldName = "ADDED_WHEN" Then oColumn.Format.FormatType = FormatType.DateTime oColumn.Format.FormatString = "dd.MM.yyyy HH:MM:ss" End If Next Dim oStateColumn As TreeListColumn = TreeListResults.Columns.Item("STATE") For Each oNode As TreeListNode In TreeListResults.Nodes ExpandNodes(oNode, Function(n) Dim oObjectValue = n.GetValue(oStateColumn) Dim oValue As String = NotNull(oObjectValue.ToString, String.Empty) Return oValue IsNot Nothing AndAlso (oValue = State.STATE_WARNING Or oValue = State.STATE_FAILURE) End Function) Next SetResultCount(TreeListResults.AllNodesCount) TreeListResults.Focus() Else GridControlResults.Visible = True GridControlResults.Dock = DockStyle.Fill TreeListResults.Visible = False TreeListResults.Dock = DockStyle.None GridControlResults.DataSource = oTable GridViewResults.PopulateColumns() GridBuilder.SetDateTimeColumns(GridViewResults) For Each oColumn As GridColumn In GridViewResults.Columns If oColumn.ColumnType = GetType(Integer) Then oColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center End If Next MarkedColumns = GridViewResults.Columns.AsEnumerable. Where(Function(column) Dim oCaption = column.FieldName.ToUpper.Trim Return ColumnMarkers.Any(Function(marker) oCaption.EndsWith(marker)) End Function).ToList() For Each oColumn In MarkedColumns oColumn.VisibleIndex = -1 Next SetResultCount(GridViewResults.RowCount) GridControlResults.Focus() End If GridViewResults.FocusInvalidRow() GridViewResults.BestFitColumns() Workspace.LoadWorkspace(oSearch.Id.ToString) btnExportMain.Enabled = True Return True Catch ex As Exception FormHelper.ShowErrorMessage(ex, "LoadData") Return False Finally SplashScreenManager1.CloseWaitForm() End Try End Function Private Sub LoadSearches() Try SearchLoader.LoadSearchParameters() SearchLoader.LoadSearches() cmbSearches.Properties.Items.Clear() cmbSearches.Properties.Items.AddRange(SearchLoader.Searches) If cmbSearches.EditValue IsNot Nothing Then Dim oOldSearch As Search = DirectCast(cmbSearches.EditValue, Search) Dim oNewSearch As Search = SearchLoader.Searches.Where(Function(search) search.Id = oOldSearch.Id).SingleOrDefault() If oNewSearch IsNot Nothing Then cmbSearches.EditValue = oNewSearch End If End If Catch ex As Exception FormHelper.ShowErrorMessage(ex, "LoadSearches") End Try End Sub Private Sub cmbSearches_SelectedValueChanged(sender As Object, e As EventArgs) Handles cmbSearches.SelectedValueChanged DisposeTreeList() InitTreeList() DisposeGrid() InitGrid() SplitContainerSQL.Collapsed = True SplitContainerFileHTML.Collapsed = True btnExportMain.Enabled = False btnExportDetails.Enabled = False SetResultCount(0) LoadSearch() HideAllTabs() End Sub Private Sub LoadSearch() Try If TypeOf cmbSearches.SelectedItem IsNot Search Then Exit Sub End If Dim oSearch As Search = CType(cmbSearches.SelectedItem, Search) ActiveSearch = oSearch AdornerUIManager2.Hide() AdornerUIManager2.Elements.Clear() Root.Clear(disposeItemAndControls:=False) LayoutControl1.Clear(True, True) TreeListResults.DataSource = Nothing GridControlResults.DataSource = Nothing If oSearch.Parameters.Count = 0 Then lbParams.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never Else lbParams.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always End If ParamLoader.LoadParameters(oSearch) Catch ex As Exception Logger.Error(ex) End Try End Sub Private Function GetParameterItems(pParam As SearchParameter) As Object Select Case pParam.ItemType Case Constants.ItemTypeEnum.List Return pParam.ItemString.Split(";"c).ToList() Case Constants.ItemTypeEnum.SQL Dim oSQL = pParam.ItemString Dim oTable = Database.GetDatatable(oSQL) Return oTable End Select End Function Private Sub TreeListResults_FocusedNodeChanged(sender As Object, e As DevExpress.XtraTreeList.FocusedNodeChangedEventArgs) If e.Node Is Nothing Then Exit Sub End If Try Dim oValues As Dictionary(Of String, String) = GetValuesFromNode(e.Node, DataColumns) Dim oSQLCommands = oValues. Where(Function(v) v.Key.StartsWith("SELECT")). Where(Function(v) v.Value IsNot Nothing). ToDictionary(Function(v) v.Key, Function(v) v.Value) Dim oFilePaths = oValues. Where(Function(v) v.Key.StartsWith("DOCVIEW")). Where(Function(v) v.Value IsNot Nothing). ToDictionary(Function(v) v.Key, Function(v) v.Value) Dim oHtmlDocuments = oValues. Where(Function(v) v.Key.StartsWith("HTML")). Where(Function(v) v.Value IsNot Nothing). ToDictionary(Function(v) v.Key, Function(v) v.Value) Dim oAllTabs = SQLResultTabs. Concat(FileResultTabs). Concat(HtmlResultTabs) For Each oTabPage In oAllTabs oTabPage.PageVisible = False Next SplitContainerSQL.Collapsed = True SplitContainerFileHTML.Collapsed = True For Each oSQLCommand As KeyValuePair(Of String, String) In oSQLCommands Try Dim oExtracted = ExtractTitle(oSQLCommand.Value) Dim oCommand = oExtracted.Item1 Dim oTitle = oExtracted.Item2 Dim oTable As DataTable = Database.GetDatatable(oCommand) If oTable Is Nothing Then Continue For End If Dim oGridIndex = Integer.Parse(oSQLCommand.Key.Last()) - 1 Dim oGridControl As GridControl = SQLResultGrids.Item(oGridIndex) If oGridIndex = 0 Then ActiveSQLResultGrid = oGridControl End If FillResultGrid(oGridControl, oTable, oTitle) Catch ex As Exception Logger.Error(ex) Continue For End Try Next For Each oFile As KeyValuePair(Of String, String) In oFilePaths Try Dim oExtracted = ExtractTitle(oFile.Value) Dim oPath = oExtracted.Item1 Dim oTitle = oExtracted.Item2 If oPath Is Nothing Then Continue For End If If Not IO.File.Exists(oPath) Then Continue For End If Dim oViewerIndex = Integer.Parse(oFile.Key.Last()) - 1 Dim oViewer As DocumentViewer = FileResultViewers.Item(oViewerIndex) FillResultViewer(oViewer, oPath, oTitle) Catch ex As Exception Logger.Error(ex) Continue For End Try Next For Each oFile As KeyValuePair(Of String, String) In oHtmlDocuments Try Dim oExtracted = ExtractTitle(oFile.Value) Dim oHtml = oExtracted.Item1 Dim oTitle = oExtracted.Item2 If oHtml Is Nothing Then Continue For End If Dim oViewerIndex = Integer.Parse(oFile.Key.Last()) - 1 Dim oViewer As RichEditControl = HtmlResultViewers.Item(oViewerIndex) FillResultHtmlViewer(oViewer, oHtml, oTitle) Catch ex As Exception Logger.Error(ex) Continue For End Try Next Catch ex As Exception FormHelper.ShowErrorMessage(ex, "TreeListResults_FocusedNodeChanged") End Try End Sub Private Function ExtractTitle(Value As String) As Tuple(Of String, String) If Value.Contains("|"c) Then Dim oSplit = Value.Split("|"c).ToList Dim oValue = oSplit.First() Dim oTitle = oSplit.Item(1) Return New Tuple(Of String, String)(oValue, oTitle) End If Return New Tuple(Of String, String)(Value, Nothing) End Function Private Sub ExpandNodes(RootNode As TreeListNode, Condition As Predicate(Of TreeListNode)) For Each oNode As TreeListNode In RootNode.Nodes ExpandNodes(oNode, Condition) If Condition(oNode) = True Then oNode.Expand() ExpandParentNode(oNode) End If Next End Sub Private Sub ExpandParentNode(ChildNode As TreeListNode) If ChildNode.ParentNode IsNot Nothing Then ChildNode.ParentNode.Expand() ExpandParentNode(ChildNode.ParentNode) End If End Sub Private Sub FillResultHtmlViewer(RichEditControl As RichEditControl, Html As String, Title As String) RichEditControl.HtmlText = Html Dim oTabPage = DirectCast(RichEditControl.Parent, XtraTabPage) oTabPage.PageVisible = True oTabPage.Text = NotNull(Title, oTabPage.Text) XtraTabControlFileHTML.SelectedTabPage = oTabPage End Sub Private Sub FillResultViewer(DocumentViewer As DocumentViewer, Path As String, Title As String) DocumentViewer.LoadFile(Path) Dim oTabPage = DirectCast(DocumentViewer.Parent, XtraTabPage) oTabPage.PageVisible = True oTabPage.Text = NotNull(Title, oTabPage.Text) XtraTabControlFileHTML.SelectedTabPage = oTabPage End Sub Private Sub FillResultGrid(GridControl As GridControl, Table As DataTable, Title As String) GridControl.DataSource = Table Dim oTabPage = DirectCast(GridControl.Parent, XtraTabPage) oTabPage.PageVisible = True oTabPage.Text = NotNull(Title, oTabPage.Text) XtraTabControlSQL.SelectedTabPage = oTabPage End Sub Private Function GetValuesFromNode(Node As TreeListNode, ColumnNames As List(Of String)) As Dictionary(Of String, String) Dim oValues As New Dictionary(Of String, String) For Each oColumnName In ColumnNames Dim oValue = MaybeGetValueForColumn(Node, oColumnName) oValues.Add(oColumnName, oValue) Next Return oValues End Function Private Function MaybeGetValueForColumn(Node As TreeListNode, FieldName As String) As String Dim oColumn = TreeListResults.Columns.Item(FieldName) If oColumn Is Nothing Then Return Nothing End If Dim oValue = Node.GetValue(oColumn)?.ToString If oValue Is String.Empty Then Return Nothing Else Return oValue End If End Function Private Sub TreeListResults_CustomDrawNodeCell(sender As Object, e As DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs) Dim oColumn = TreeListResults.Columns.Item("STATE") Dim oState = NotNull(e.Node.GetValue(oColumn), Nothing) If oState Is Nothing Then Exit Sub End If Dim oColor As Color = Nothing Select Case oState.ToString Case State.STATE_SUCCESS oColor = Color.LightGreen Case State.STATE_FAILURE oColor = Color.LightCoral Case State.STATE_WARNING oColor = Color.Yellow Case State.STATE_WAITING oColor = Color.LightSkyBlue End Select e.Appearance.BackColor = oColor e.Appearance.Options.UseBackColor = True e.Handled = False End Sub Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick Dim oSQLConfig As New frmSQLConfig(LogConfig) With { .ConnectionString = ConfigManager.Config.ConnectionString } If oSQLConfig.ShowDialog() = DialogResult.OK Then ConfigManager.Config.ConnectionString = oSQLConfig.ConnectionString ConfigManager.Save() Database = New MSSQLServer(LogConfig, oSQLConfig.ConnectionString) LoadSearches() End If End Sub Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnExportDetails.ItemClick If ActiveSQLResultGrid Is Nothing Then Exit Sub End If XtraSaveFileDialog1.Filter = "Excel Files (*.xlsx)|*.xlsx" XtraSaveFileDialog1.FileName = $"{ActiveSearch.Title}_Detail.xlsx" If XtraSaveFileDialog1.ShowDialog() = DialogResult.OK Then ActiveSQLResultGrid.ExportToXlsx(XtraSaveFileDialog1.FileName) End If End Sub Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnExportMain.ItemClick If ActiveSearch Is Nothing Then Exit Sub End If XtraSaveFileDialog1.Filter = "Excel Files (*.xlsx)|*.xlsx" XtraSaveFileDialog1.FileName = $"{ActiveSearch.Title}.xlsx" If XtraSaveFileDialog1.ShowDialog() = DialogResult.OK Then If ActiveSearch.ReturnType = ReturnTypeEnum.TreeView Then TreeListResults.ExportToXlsx(XtraSaveFileDialog1.FileName) Else GridControlResults.ExportToXlsx(XtraSaveFileDialog1.FileName) End If End If End Sub Private Async Sub frmMonitor_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp If e.KeyCode = Keys.F5 Then Debug.Write("Debug.Write") Console.WriteLine("Console.WriteLine") Debug.Print("Debug.Print") Await LoadData() End If End Sub Private Sub TreeListResults_MouseClick(sender As Object, e As MouseEventArgs) Dim oInfo As TreeListHitInfo = TreeListResults.CalcHitInfo(New Point(e.X, e.Y)) If oInfo.InRowCell Then Dim oNode = oInfo.Node Dim oValues As Dictionary(Of String, String) = GetValuesFromNode(oNode, DataColumns) Console.WriteLine() Dim oShouldToggleSQL = False Dim oShouldToggleFile = False For Each oValue As KeyValuePair(Of String, String) In oValues If oValue.Key.Contains("SELECT") AndAlso oValue.Value IsNot Nothing Then oShouldToggleSQL = True Exit For End If Next For Each oValue As KeyValuePair(Of String, String) In oValues If oValue.Key.Contains("DOCVIEW") AndAlso oValue.Value IsNot Nothing Then oShouldToggleFile = True Exit For End If If oValue.Key.Contains("HTML") AndAlso oValue.Value IsNot Nothing Then oShouldToggleFile = True Exit For End If Next If oShouldToggleSQL Then SplitContainerSQL.Collapsed = Not SplitContainerSQL.Collapsed End If If oShouldToggleFile Then SplitContainerFileHTML.Collapsed = Not SplitContainerFileHTML.Collapsed End If End If End Sub Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnReloadSearches.ItemClick Try LoadSearches() TreeListResults.DataSource = Nothing GridControlResults.DataSource = Nothing Catch ex As Exception FormHelper.ShowErrorMessage(ex, "Suchen neu laden") End Try End Sub Private Sub GridViewResults_FocusedRowChanged(sender As Object, e As Views.Base.FocusedRowChangedEventArgs) If GridViewResults.FocusedRowHandle < 0 Then Exit Sub End If HideAllTabs() ActiveSQLResultGrid = Nothing Try Dim oRow As DataRow = GridViewResults.GetDataRow(GridViewResults.FocusedRowHandle) Dim oHtmlResultViewerIndex As Integer = 0 Dim oGridResultIndex As Integer = 0 Dim oViewerResultIndex As Integer = 0 For Each oColumn As GridColumn In MarkedColumns Dim oValue = oRow.ItemEx(oColumn.FieldName, String.Empty) If oValue.Length > 0 Then If oColumn.FieldName.EndsWith("[HTML]") Then Dim oViewer As RichEditControl = HtmlResultViewers.Item(oHtmlResultViewerIndex) Dim oTitle = oColumn.FieldName.Replace("[HTML]", "").Trim() oHtmlResultViewerIndex += 1 FillResultHtmlViewer(oViewer, oValue, oTitle) SplitContainerFileHTML.Collapsed = False ElseIf oColumn.FieldName.EndsWith("[SQL]") Then Dim oTable As DataTable = Database.GetDatatable(oValue) If oTable Is Nothing Then Continue For End If Dim oTitle = oColumn.FieldName.Replace("[SQL]", "").Trim() Dim oGridControl As GridControl = SQLResultGrids.Item(oGridResultIndex) If oGridResultIndex = 0 Then ActiveSQLResultGrid = oGridControl End If oGridResultIndex += 1 FillResultGrid(oGridControl, oTable, oTitle) SplitContainerSQL.Collapsed = False ElseIf oColumn.FieldName.EndsWith("[FILENAME]") Then If oValue Is Nothing Then Continue For End If If Not IO.File.Exists(oValue) Then Continue For End If Dim oViewer As DocumentViewer = FileResultViewers.Item(oViewerResultIndex) Dim oTitle = oColumn.FieldName.Replace("[FILENAME]", "").Trim() oViewerResultIndex += 1 FillResultViewer(oViewer, oValue, oTitle) SplitContainerFileHTML.Collapsed = False End If End If Next If ActiveSQLResultGrid Is Nothing Then btnExportDetails.Enabled = False Else btnExportDetails.Enabled = True End If Catch ex As Exception Logger.Error(ex) End Try End Sub Private Sub GridViewResults_ColumnFilterChanged(sender As Object, e As EventArgs) Dim oView As GridView = sender SetResultCount(oView.DataRowCount) End Sub Private Sub HideAllTabs() Dim oAllTabs = SQLResultTabs. Concat(FileResultTabs). Concat(HtmlResultTabs) For Each oTabPage In oAllTabs oTabPage.PageVisible = False Next SplitContainerSQL.Collapsed = True SplitContainerFileHTML.Collapsed = True End Sub Private Async Sub btnResetLayout_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnResetLayout.ItemClick If ActiveSearch IsNot Nothing Then Workspace.ResetWorkspace(ActiveSearch.Id.ToString) DisposeTreeList() InitTreeList() DisposeGrid() InitGrid() HideAllTabs() Await LoadData() SetResultCount(0) End If End Sub Private Sub DisposeGrid() GridViewResults.Dispose() GridViewResults = Nothing GridControlResults.Dispose() GridControlResults = Nothing End Sub Private Sub SetResultCount(pResults As Integer) lbResultCount.Caption = String.Format(lbResultCount.Tag, pResults) End Sub Private Sub InitGrid() GridControlResults = GridLoader.InitGrid() GridViewResults = DirectCast(GridControlResults.DefaultView, GridView) AddHandler GridViewResults.FocusedRowChanged, AddressOf GridViewResults_FocusedRowChanged AddHandler GridViewResults.ColumnFilterChanged, AddressOf GridViewResults_ColumnFilterChanged SplitContainerSQL.Panel1.Controls.Add(GridControlResults) End Sub Private Sub DisposeTreeList() TreeListResults.Dispose() TreeListResults = Nothing End Sub Private Sub InitTreeList() TreeListResults = GridLoader.InitTreeList() AddHandler TreeListResults.FocusedNodeChanged, AddressOf TreeListResults_FocusedNodeChanged AddHandler TreeListResults.MouseClick, AddressOf TreeListResults_MouseClick AddHandler TreeListResults.CustomDrawNodeCell, AddressOf TreeListResults_CustomDrawNodeCell SplitContainerSQL.Panel1.Controls.Add(TreeListResults) End Sub Private Sub BarButtonItem2_ItemClick_1(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick If ActiveSearch Is Nothing Then Exit Sub End If Workspace.SaveWorkspace(ActiveSearch.Id.ToString) End Sub End Class