Powershell WPF Datagrid
Hallo,
ich baue gerade an einen Powershell WPF und versuche dort im DataGrid einzelne Zellen zu ändern, stelle mich aber zu doof an da etwas vernünftiges auf die Beine zu stellen. Es soll über das Script so sein das ich entweder über dem Button "edit" bzw. im Script selber die Werte ändern kann.
Könnt ihr mir da vielleicht helfen?
ich baue gerade an einen Powershell WPF und versuche dort im DataGrid einzelne Zellen zu ändern, stelle mich aber zu doof an da etwas vernünftiges auf die Beine zu stellen. Es soll über das Script so sein das ich entweder über dem Button "edit" bzw. im Script selber die Werte ändern kann.
Könnt ihr mir da vielleicht helfen?
#XAML Code kann zwischen @" und "@ ersetzt werden:
[xml]$XAML = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window"
Title="Status Installation"
WindowStartupLocation = "CenterScreen"
ResizeMode="NoResize" ShowInTaskbar = "True" Height="450" Width="835.506">
<Grid>
<Button Name="Close" Content="Schließen" HorizontalAlignment="Left" Height="30" Margin="651,379,0,0" VerticalAlignment="Top" Width="149"/>
<Button Name="edit" Content="edit" HorizontalAlignment="Left" Height="30" Margin="351,379,0,0" VerticalAlignment="Top" Width="149"/>
<DataGrid Name="GridServer" HorizontalAlignment="Left" Height="88" Margin="558,229,0,0" VerticalAlignment="Top" Width="220" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding IP}" Width="*" />
<DataGridTextColumn Header="Name" Binding="{Binding Status}" Width="*" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
"@ #-replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace '^<Win.*', '<Window' #-replace wird benötigt, wenn XAML aus Visual Studio kopiert wird.
#XAML laden
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
try{$Form=[Windows.Markup.XamlReader]::Load( (New-Object System.Xml.XmlNodeReader $XAML) )}
catch{Write-Host "Windows.Markup.XamlReader konnte nicht geladen werden. Mögliche Ursache: ungültige Syntax oder fehlendes .net"}
#===========================================================================
# Store Form Objects In PowerShell
#===========================================================================
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}
Function Get-FormVariables{
if ($global:ReadmeDisplay -ne $true){Write-host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow;$global:ReadmeDisplay=$true}
write-host "Found the following interactable elements from our form" -ForegroundColor Cyan
#get-variable WPF*
}
$WPFGridServer.AddChild([pscustomobject]@{IP="192.168.0.20"
Status="OK"
})
$WPFGridServer.AddChild([pscustomobject]@{IP="192.168.0.10"
Status="OK"
})
$Window = $Form.FindName("Window")
#$Form.FindName("label1").Content="0 %"
$Window.FindName("Close").add_click({
$Window.Close()
})
$timer = new-object System.Windows.Threading.DispatcherTimer
$timer.Interval = [TimeSpan]"0:0:2.00"
$timer.Add_Tick.Invoke({
#alle 2 Sekunden
})
$timer.Start()
$Window.FindName("edit").add_click({
# edit
})
#Fenster anzeigen:
$Form.ShowDialog()
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3847587530
Url: https://administrator.de/contentid/3847587530
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
4 Kommentare
Neuester Kommentar
Moin.
WPF arbeitet Datenquellenorientierter als Windows Forms nimm also gleich z.B. eine DataTable als Datenquelle und füttere damit die ItemsSource Property des DataGrid, dann brauchst du nur die Datatable ändern und das DataGrid hat immer die aktuellen Daten. Oder man bindet das DataGrid per DataBinding an ein Datenobject bzw. erstellt erst eine benutzerdefinierte Klassen aus der man Objekte erzeugt und an das Datagrid füttert.
Cheers
certguy
WPF arbeitet Datenquellenorientierter als Windows Forms nimm also gleich z.B. eine DataTable als Datenquelle und füttere damit die ItemsSource Property des DataGrid, dann brauchst du nur die Datatable ändern und das DataGrid hat immer die aktuellen Daten. Oder man bindet das DataGrid per DataBinding an ein Datenobject bzw. erstellt erst eine benutzerdefinierte Klassen aus der man Objekte erzeugt und an das Datagrid füttert.
Add-Type -AssemblyName Presentationframework
[string]$xaml = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Window" Title="DataGrid" WindowStartupLocation = "CenterScreen" ResizeMode="NoResize" SizeToContent = "WidthAndHeight" ShowInTaskbar = "True" Background = "lightgray">
<DataGrid x:Name="GridServer" HorizontalAlignment="Left" Height="195.723" Margin="10,10,10,10" VerticalAlignment="Top" Width="253.566" Grid.ColumnSpan="2" AutoGenerateColumns="True"></DataGrid>
</Window>
"@
$window=[Windows.Markup.XamlReader]::Parse($xaml)
$dgv = $window.FindName('GridServer')
$dt = new-Object System.Data.DataTable
[void]$dt.Columns.Add("Vorname")
[void]$dt.Columns.Add("Nachname")
[void]$dt.Rows.Add(@("Max","Muster"))
$dgv.ItemsSource = $dt.DefaultView
[void]($window.Dispatcher.InvokeAsync({$window.ShowDialog()})).Wait()
certguy
Wie gesagt füge die Daten in der Datatable ein, das Datagrid ist nur noch zur Darstellung, die Daten verwaltest du in der Datatable, du musst einfach nur mal in die Doku des Datatable Objects schauen da findest du die entsprechende Methode InsertAt mit einem DatRow Objekt als ersten und dem Index als zweiten Parameter... Wo ist also das Problem??
Ein DataRow Objekt erzeugst du mit NewRow
Im DataRow Objekt setzt du dann noch den Inhalt deiner Spalten und am Ende fügst du sie mit InsertAt am gewünschten Index ein, feddisch.
Ein DataRow Objekt erzeugst du mit NewRow
$dr = $dt.NewRow()