Powershell Charting
Hallo zusammen,
ist es möglich ein Chart in Powershell bei einem Event mit neuen Daten zu versorgen z.B. bei Knopfdruck.
Mit einem DatagridView habe ich es hinbekommen über .Refresh dies funktioniert aber leider nicht mit dem Chart, vielleicht hat jemand ein Codebeispiel wie sowas funktioniert.
Alterativ auch für eine Picturebox, weil ich kann mir auch ein Bild erstellen lassen und dies dann einfach austauschen anstatt des Charts.
Danke für eure Ideen.
ist es möglich ein Chart in Powershell bei einem Event mit neuen Daten zu versorgen z.B. bei Knopfdruck.
Mit einem DatagridView habe ich es hinbekommen über .Refresh dies funktioniert aber leider nicht mit dem Chart, vielleicht hat jemand ein Codebeispiel wie sowas funktioniert.
Alterativ auch für eine Picturebox, weil ich kann mir auch ein Bild erstellen lassen und dies dann einfach austauschen anstatt des Charts.
Danke für eure Ideen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 320970
Url: https://administrator.de/contentid/320970
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
2 Kommentare
Neuester Kommentar
Servus MaximusPrime,
ich würde den Chart an eine Datenquelle binden (z.B. eine Datatable) und dann für Änderungen die Datenquelle updaten und dann im Chart einfach eine Aktualisierung der Quelle triggern.
Damit du eine Datenquelle wie eine Datatable an dein Chart binden kannst musst du in deinen Serien die Member (Spalten) der Datenquelle definieren.
Für ein Update des Charts reicht dann nach der Änderunge der Datenquelle ein $chart.DataBind().
Hier ein Beispiel:
Das Beispiel zeigt einen simplen Balkenchart der jede Sekunde durch einen Timer mit Zufallswerten gefüllt wird.
Noch als Tipp zur Entwicklung mit Windows-Forms wenn du nicht weiter kommst. Nutze Visual-Studio zur Entwicklung, dort kannst du diese Dinge viel besser evaluieren. Das umsetzen in Powershell ist dann kein nur noch Formsache, da die Objekte die selben Methoden und Eigenschaften besitzen (da beide die selben .NET Objekte nutzen)
Grüße Uwe
ich würde den Chart an eine Datenquelle binden (z.B. eine Datatable) und dann für Änderungen die Datenquelle updaten und dann im Chart einfach eine Aktualisierung der Quelle triggern.
Damit du eine Datenquelle wie eine Datatable an dein Chart binden kannst musst du in deinen Serien die Member (Spalten) der Datenquelle definieren.
Für ein Update des Charts reicht dann nach der Änderunge der Datenquelle ein $chart.DataBind().
Hier ein Beispiel:
Das Beispiel zeigt einen simplen Balkenchart der jede Sekunde durch einen Timer mit Zufallswerten gefüllt wird.
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms.DataVisualization") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$chart = New-Object System.Windows.Forms.DataVisualization.Charting.Chart
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
$dt = New-Object System.Data.DataTable
$timer = New-Object System.Windows.Forms.Timer
#endregion Generated Form Objects
#----------------------------------------------
# Event Script Blocks
#----------------------------------------------
$handler_form1_Load=
{
#Datatable mit Daten füllen
$dt.Columns.AddRange(@("Wochentag","Temperatur"))
$dt.Rows.Add(@('Montag',10))
$dt.Rows.Add(@('Dienstag',20))
$dt.Rows.Add(@('Mittwoch',30))
# Datenquelle des Charts auf die Datatable setzen
$chart.DataSource = $dt
# Datatable an Chart binden
$chart.DataBind()
# Timer zur Änderung der Daten in der Datatable starten
$timer.Start()
}
$timer_tick = {
# Zufällige Werte in der Datatable setzen
$dt.Rows.Temperatur = (Get-Random -Minimum 0 -Maximum 100)
$dt.Rows[1].Temperatur = (Get-Random -Minimum 0 -Maximum 100)
$dt.Rows[2].Temperatur = (Get-Random -Minimum 0 -Maximum 100)
# Chart aktualisieren
$chart.DataBind()
}
$handler_form1_closing = {
$timer.Stop()
$timer.dispose()
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 272
$System_Drawing_Size.Width = 292
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"
$form1.Text = "Chart-Demo"
$form1.add_Load($handler_form1_Load)
$form1.add_Closing($handler_form1_closing)
$chart.Dock = 5
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 0
$System_Drawing_Point.Y = 0
$chart.Location = $System_Drawing_Point
$chart.Name = "panel1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 272
$System_Drawing_Size.Width = 400
$chart.Size = $System_Drawing_Size
$chart.TabIndex = 0
$chart.ChartAreas.Add((new-object System.Windows.Forms.DataVisualization.Charting.ChartArea))
$chart.Legends.Add((new-object System.Windows.Forms.DataVisualization.Charting.Legend))
$chart.Series.Add("Temperatur") | out-null
$chart.Series['Temperatur'].XValueType = [System.Windows.Forms.DataVisualization.Charting.ChartValueType]::String
$chart.Series['Temperatur'].XValueMember = "Wochentag"
$chart.Series['Temperatur'].YValueMembers = "Temperatur"
$form1.Controls.Add($chart)
$timer.Interval = 1000
$timer.add_Tick($timer_tick)
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
GenerateForm
Grüße Uwe