rostock
Goto Top

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?

#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()

Content-ID: 3847587530

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

3803037559
3803037559 05.09.2022 aktualisiert um 17:39:20 Uhr
Goto Top
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.
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()
Cheers
certguy
rostock
rostock 06.09.2022 um 09:02:47 Uhr
Goto Top
Hallo certguy,

super, danke für den Tip.
Werde es auf mein Script übertragen und testen.
Ich melde mich wieder.

Gruß rostock
rostock
rostock 10.09.2022 um 07:16:31 Uhr
Goto Top
Hallo certguy,

ich habe mein Script jetzt nach deinen Angaben angepasst und deine Datatable genutzt. Das funktioniert auch super. Kannst du mir noch einen Beispiel geben wie ich die Datatable mit InsertAt etwas in die Table einfügen kann ohne es ans Ende der Table hinzuzufügen?

Gruß rostock
3803037559
Lösung 3803037559 10.09.2022 aktualisiert um 07:29:59 Uhr
Goto Top
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
$dr = $dt.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.