maximusprime
Goto Top

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.

Content-Key: 320970

Url: https://administrator.de/contentid/320970

Printed on: April 25, 2024 at 07:04 o'clock

Member: colinardo
Solution colinardo Nov 14, 2016 updated at 21:11:15 (UTC)
Goto Top
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.
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
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) face-smile

Grüße Uwe
Member: MaximusPrime
MaximusPrime Nov 15, 2016 at 09:04:40 (UTC)
Goto Top
Hallo Uwe,

Danke funktioniert einwandfrei!

Danke für deine Hilfe hast mir meinen Tag gerettet face-smile

Gruß Max