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-Key: 3847587530

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

Printed on: May 1, 2024 at 01:05 o'clock

Mitglied: 3803037559
3803037559 Sep 05, 2022 updated at 15:39:20 (UTC)
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
Member: rostock
rostock Sep 06, 2022 at 07:02:47 (UTC)
Goto Top
Hallo certguy,

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

Gruß rostock
Member: rostock
rostock Sep 10, 2022 at 05:16:31 (UTC)
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
Mitglied: 3803037559
Solution 3803037559 Sep 10, 2022 updated at 05:29:59 (UTC)
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.