Chart-Integration

This commit is contained in:
2023-04-05 10:42:52 +02:00
parent 41338b596e
commit 72a831619f
6 changed files with 389 additions and 18 deletions

View File

@@ -1,5 +1,4 @@
Imports System.Runtime.CompilerServices
Imports System.Text.RegularExpressions
Imports System.Text.RegularExpressions
Imports DevExpress.Utils
Imports DevExpress.XtraEditors.Controls
Imports DevExpress.XtraEditors.Repository
@@ -11,6 +10,7 @@ Imports DevExpress.XtraTab
Imports DevExpress.XtraTreeList
Imports DevExpress.XtraTreeList.Columns
Imports DevExpress.XtraTreeList.Nodes
Imports DevExpress.XtraCharts
Imports DigitalData.Controls.DocumentViewer
Imports DigitalData.GUIs.Common
Imports DigitalData.GUIs.Monitor.Constants
@@ -20,6 +20,8 @@ Imports DigitalData.Modules.Language
Imports DigitalData.Modules.Language.Utils
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Patterns
Imports DevExpress.XtraEditors
Public Class frmMonitor
Private ReadOnly InvisibleColumnMarkers As New List(Of String) From {"[HTML]", "[SQL]", "[FILENAME]"}
@@ -57,6 +59,8 @@ Public Class frmMonitor
Private GridControlResults As GridControl
Private GridViewResults As GridView
Private ChartViewResultContainer As SplitContainerControl
Private InvisibleMarkedColumns As New List(Of GridColumn)
Private VisibleMarkedColumns As New List(Of GridColumn)
Private ActiveSearch As Search = Nothing
@@ -123,6 +127,8 @@ Public Class frmMonitor
InitGrid()
InitTreeList()
'InitChartView()
InitChartContainer()
Dim oGrids As GridView() = New List(Of GridView) From {GridView1, GridView2, GridView3, GridView4}.ToArray
GridBuilder.SetDefaults(oGrids)
@@ -154,7 +160,6 @@ Public Class frmMonitor
End Sub
Next
For Each oViewer As DocumentViewer In FileResultViewers
oViewer.Init(LogConfig, oLicense)
Next
@@ -164,7 +169,6 @@ Public Class frmMonitor
SetResultCount(0)
SetVersion()
Catch ex As Exception
FormHelper.ShowErrorMessage(ex, "frmStart_Load")
End Try
@@ -210,16 +214,23 @@ Public Class frmMonitor
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)
Dim oSQL As String
Dim oTable As DataTable
If oSearch.SQLCommand.Length > 0 Then
oSQL = Patterns.ReplaceControlValues(oSearch.SQLCommand, oControls)
oTable = Await Database.GetDatatableAsync(oSQL)
End If
Dim oStartTime = Now
If oSearch.ReturnType = Constants.ReturnTypeEnum.TreeView Then
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
If oSearch.ReturnType = ReturnTypeEnum.TreeView Then
' Baum
SetResultVisbility(ReturnTypeEnum.TreeView)
TreeListResults.Visible = True
TreeListResults.Dock = DockStyle.Fill
If oTable Is Nothing Then
Return False
End If
TreeListResults.DataSource = oTable
@@ -258,12 +269,70 @@ Public Class frmMonitor
SetResultCount(TreeListResults.AllNodesCount)
TreeListResults.Focus()
Else
GridControlResults.Visible = True
GridControlResults.Dock = DockStyle.Fill
ElseIf oSearch.ReturnType = Constants.ReturnTypeEnum.ChartView Then
' Charts
SetResultVisbility(ReturnTypeEnum.ChartView)
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
' Oberer SplitContainer
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
' Unterer SplitContainer
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Both
splitContainer1.PanelVisibility = SplitPanelVisibility.Both
splitContainer2.PanelVisibility = SplitPanelVisibility.Both
Dim chartArray(4) As ChartControl
' TopLeft
chartArray(0) = CType(splitContainer1.Panel1.Controls(0), ChartControl)
' TopRight
chartArray(1) = CType(splitContainer1.Panel2.Controls(0), ChartControl)
' BottomLeft
chartArray(2) = CType(splitContainer2.Panel1.Controls(0), ChartControl)
' BottomRight
chartArray(3) = CType(splitContainer2.Panel2.Controls(0), ChartControl)
For i As Integer = 0 To 3
chartArray(i).Titles.Clear()
chartArray(i).Series.Clear()
Next
ResizeCharContainer()
Dim oChartParameters As List(Of ChartParameter)
oChartParameters = SearchLoader.ChartParameters.Where(Function(p) p.SearchId = oSearch.Id And p.ChartType <> ChartTypeEnum.Undefined).ToList()
For Each oChartParameterSet In oChartParameters
Dim ChartViewResults As ChartControl
Select Case oChartParameterSet.ChartPos
Case ChartPosEnum.TopLeft
ChartViewResults = chartArray(0)
Case ChartPosEnum.TopRight
ChartViewResults = chartArray(1)
Case ChartPosEnum.BottomLeft
ChartViewResults = chartArray(2)
Case ChartPosEnum.BottomRight
ChartViewResults = chartArray(3)
Case Else
ChartViewResults = chartArray(0)
End Select
SetChartTitle(ChartViewResults, oChartParameterSet.Title)
Dim oSerie As Series = Await GetChartSerie(oChartParameterSet, oControls)
ChartViewResults.Series.Add(oSerie)
Next
SetPanelVisibility(chartArray)
ChartViewResultContainer.Focus()
Else
' Tabelle
SetResultVisbility(ReturnTypeEnum.Table)
If oTable Is Nothing Then
Return False
End If
GridControlResults.DataSource = oTable
GridViewResults.PopulateColumns()
@@ -343,6 +412,133 @@ Public Class frmMonitor
SplashScreenManager1.CloseWaitForm()
End Try
End Function
Private Async Function GetChartSerie(pChartParameters As ChartParameter, pControls As List(Of Control)) As Threading.Tasks.Task(Of Series)
Dim oSerie As Series
Select Case pChartParameters.ChartType
Case ChartTypeEnum.Bar
oSerie = New Series(pChartParameters.Title, ViewType.Bar)
Case ChartTypeEnum.Line
oSerie = New Series(pChartParameters.Title, ViewType.Line)
Case ChartTypeEnum.Area
oSerie = New Series(pChartParameters.Title, ViewType.Area)
Case ChartTypeEnum.Pie
oSerie = New Series(pChartParameters.Title, ViewType.Pie)
oSerie.Label.TextPattern = "{V}"
oSerie.LegendTextPattern = "{A}"
Case Else
Return Nothing
End Select
Dim oSQL As String = Patterns.ReplaceControlValues(pChartParameters.SQLCommand, pControls)
Dim oTable As DataTable = Await Database.GetDatatableAsync(oSQL)
Dim xAxisTitle As String = pChartParameters.Argument
Dim yAxisTitle As String = pChartParameters.Value
For Each oRow In oTable.Rows
Dim value1 As String = oRow.Item(xAxisTitle)
Dim value2 As String = oRow.Item(yAxisTitle)
oSerie.Points.Add(New SeriesPoint(value1, value2))
Next
oSerie.ArgumentScaleType = ScaleType.Qualitative
Return oSerie
End Function
Private Sub SetChartTitle(pChartView As ChartControl, pTitle As String)
' Wenn bereits ein Titel vorhanden ist, wird kein neuer ergänzt
' relevant bei mehrere Charts in einem ChartControl
If pChartView.Titles.Count = 0 Then
Dim oTitle As ChartTitle = New ChartTitle()
oTitle.Text = pTitle
pChartView.Titles.Add(oTitle)
End If
End Sub
Private Sub SetPanelVisibility(chartArray() As ChartControl)
If chartArray.Length < 4 Then
Exit Sub
End If
Dim showTop As Boolean = True
Dim showBottom As Boolean = True
If chartArray(0).Titles.Count = 0 And chartArray(1).Titles.Count = 0 Then
showTop = False
End If
If chartArray(2).Titles.Count = 0 And chartArray(3).Titles.Count = 0 Then
showBottom = False
End If
If showBottom = False Then
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showTop = False Then
ChartViewResultContainer.PanelVisibility = SplitPanelVisibility.Panel2
End If
If showTop = True Then
Dim showLeft As Boolean = chartArray(0).Titles.Count > 0
Dim showRight As Boolean = chartArray(1).Titles.Count > 0
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
If showRight = False Then
splitContainer1.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showLeft = False Then
splitContainer1.PanelVisibility = SplitPanelVisibility.Panel2
End If
End If
If showBottom = True Then
Dim showLeft As Boolean = chartArray(2).Titles.Count > 0
Dim showRight As Boolean = chartArray(3).Titles.Count > 0
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
If showRight = False Then
splitContainer2.PanelVisibility = SplitPanelVisibility.Panel1
ElseIf showLeft = False Then
splitContainer2.PanelVisibility = SplitPanelVisibility.Panel2
End If
End If
End Sub
Private Sub SetResultVisbility(pSearchMode As ReturnTypeEnum)
Select Case pSearchMode
Case ReturnTypeEnum.TreeView
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
TreeListResults.Visible = True
TreeListResults.Dock = DockStyle.Fill
ChartViewResultContainer.Visible = False
ChartViewResultContainer.Dock = DockStyle.None
Case ReturnTypeEnum.ChartView
GridControlResults.Visible = False
GridControlResults.Dock = DockStyle.None
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
ChartViewResultContainer.Visible = True
ChartViewResultContainer.Dock = DockStyle.Fill
Case ReturnTypeEnum.Table
GridControlResults.Visible = True
GridControlResults.Dock = DockStyle.Fill
TreeListResults.Visible = False
TreeListResults.Dock = DockStyle.None
ChartViewResultContainer.Visible = False
ChartViewResultContainer.Dock = DockStyle.None
End Select
End Sub
''' <summary>
''' Linklogik für Hyperlink-Spalten
''' </summary>
@@ -391,7 +587,7 @@ Public Class frmMonitor
Private Sub SetColumnsToDisAllowEditInGridViewResults()
For Each oColumn As GridColumn In GridViewResults.Columns
If Not TypeOf oColumn.ColumnEdit Is RepositoryItemHyperLinkEdit Then
If TypeOf oColumn.ColumnEdit IsNot RepositoryItemHyperLinkEdit Then
' Verbietet Spaltenweise die Bearbeitung
oColumn.OptionsColumn.AllowEdit = False
End If
@@ -419,6 +615,7 @@ Public Class frmMonitor
Private Sub LoadSearches()
Try
SearchLoader.LoadSearchParameters()
SearchLoader.LoadChartParameters()
SearchLoader.LoadSearches()
cmbSearches.Properties.Items.Clear()
@@ -999,6 +1196,23 @@ Public Class frmMonitor
SplitContainerSQL.Panel1.Controls.Add(TreeListResults)
End Sub
Private Sub InitChartContainer()
ChartViewResultContainer = GridLoader.InitChartViewResultContainer()
SplitContainerSQL.Panel1.Controls.Add(ChartViewResultContainer)
End Sub
Private Sub ResizeCharContainer()
If ChartViewResultContainer.Visible = True Then
Dim splitContainer1 As SplitContainerControl = CType(ChartViewResultContainer.Panel1.Controls(0), SplitContainerControl)
Dim splitContainer2 As SplitContainerControl = CType(ChartViewResultContainer.Panel2.Controls(0), SplitContainerControl)
ChartViewResultContainer.SplitterPosition = ChartViewResultContainer.Height / 2
splitContainer1.SplitterPosition = splitContainer1.Width / 2
splitContainer2.SplitterPosition = splitContainer2.Width / 2
End If
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
@@ -1014,5 +1228,6 @@ Public Class frmMonitor
FormHelper.ShowErrorMessage(ex, "Log Verzeichnis öffnen")
End Try
End Sub
End Class