Powershell ListView DataGrid in WPF
Hallo,
ich habe in einer xaml Datei ein ListView Element erstellt. Die xaml Datei wird durch das PowerShell Skript eingebunden und stellt damit das Frontend bereit. In dem ListView gibt es drei Spalten (Vorname, Nachname, Login). Mein aktuelles Problem besteht darin die ListView mit Daten zu füllen, die ich aus TextBoxen auslese.
In der xaml Datei ist die ListView wie folg eingebunden:
Im Powershell Skript wird das Element wie folgt eingebunden:
Ich versuche nun diese ListView zu füllen. Aber außer das mit eine neue Zeile angelegt wird, passiert nichts (Zeile wird ohne Spalteninhalt angelegt). Zum hinzufügen von Inhalt nutze ich folgedes.
Selbst wenn ich das Hinzufügen Zeile mit statischen Werten versuche, wird zwar die Zeile angelegt, aber ohne Inhalt. Woran scheiter ich?
Gruß
derhoeppi
ich habe in einer xaml Datei ein ListView Element erstellt. Die xaml Datei wird durch das PowerShell Skript eingebunden und stellt damit das Frontend bereit. In dem ListView gibt es drei Spalten (Vorname, Nachname, Login). Mein aktuelles Problem besteht darin die ListView mit Daten zu füllen, die ich aus TextBoxen auslese.
In der xaml Datei ist die ListView wie folg eingebunden:
<ListView x:Name="LV_User" HorizontalAlignment="Left" Height="195.723" Margin="10,10,0,0" VerticalAlignment="Top" Width="253.566" Grid.ColumnSpan="2">
<ListView.View>
<GridView>
<GridViewColumn Header="Vorname"/>
<GridViewColumn Header="Nachname"/>
<GridViewColumn Header="Login"/>
</GridView>
</ListView.View>
Im Powershell Skript wird das Element wie folgt eingebunden:
$LV_User = $Form.FindName('LV_User')
Ich versuche nun diese ListView zu füllen. Aber außer das mit eine neue Zeile angelegt wird, passiert nichts (Zeile wird ohne Spalteninhalt angelegt). Zum hinzufügen von Inhalt nutze ich folgedes.
$LV_User.Items.Add($Vorname).SubItems.AddRange(@($Nachname,$Login))
Selbst wenn ich das Hinzufügen Zeile mit statischen Werten versuche, wird zwar die Zeile angelegt, aber ohne Inhalt. Woran scheiter ich?
Gruß
derhoeppi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 284370
Url: https://administrator.de/forum/powershell-listview-datagrid-in-wpf-284370.html
Ausgedruckt am: 21.05.2025 um 14:05 Uhr
7 Kommentare
Neuester Kommentar
Hallo derhoeppi,
Ist eigentlich ähnlich zu meinem Beispiel mit dem DataGrid in meinem letzten Posting ...(DataSource erstellen und der ItemSource des ListView zuordnen)
p.s. es hilft ungemein das vorher mit VisualStudio in VB.Net oder C# zu coden und erst dann auf Powershell zu übertragen, denn in VisualStudio ist das Debugging wesentlich einfacher.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Ist eigentlich ähnlich zu meinem Beispiel mit dem DataGrid in meinem letzten Posting ...(DataSource erstellen und der ItemSource des ListView zuordnen)
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="ListView Demo" WindowStartupLocation = "CenterScreen" ResizeMode="NoResize" ShowInTaskbar = "True" Width="448" Height="262">
<Grid Name="Grid1">
<ListView x:Name="LV_User" HorizontalAlignment="Left" Height="199" Margin="10,10,10,10" VerticalAlignment="Top" Width="253" ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="Vorname" DisplayMemberBinding="{Binding }" />
<GridViewColumn Header="Nachname" DisplayMemberBinding="{Binding [1]}"/>
<GridViewColumn Header="Loginname" DisplayMemberBinding="{Binding [2]}" />
</GridView>
</ListView.View>
</ListView>
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,12,0,0" Name="txtVorname" VerticalAlignment="Top" Width="120" Text="Max" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,41,0,0" Name="txtNachname" VerticalAlignment="Top" Width="120" Text="Mustermann" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,70,0,0" Name="txtLoginname" VerticalAlignment="Top" Width="120" Text="maxmustermann" />
<Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="322,99,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />
</Grid>
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFC1C1C1" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Window.Background>
</Window>
"@
# Markup laden
$window=[Windows.Markup.XamlReader]::Parse($xaml)
$dt = new-Object System.Data.DataTable
[void]$dt.Columns.Add("Vorname")
[void]$dt.Columns.Add("Nachname")
[void]$dt.Columns.Add("Loginname")
$lv = $window.FindName('LV_User')
$btn = $window.FindName('Button1')
$txtVorname = $window.FindName('txtVorname')
$txtNachname = $window.FindName('txtNachname')
$txtLoginname = $window.FindName('txtLoginname')
$lv.ItemsSource = $dt.DefaultView
$btn.add_Click({
$dt.Rows.Add(@($txtVorname.Text,$txtNachname.Text,$txtLoginname.Text))
})
$async = $window.Dispatcher.InvokeAsync({$window.ShowDialog() | Out-Null})
$async.Wait() | Out-Null
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
ich finde zwar keinen Unterschied zu meinen gestrigen Versuchen, aber es funktioniert nun.
Genau hinschauen Nun bin ich damit beschäftigt die Daten von dort auszulesen
Kein Problem. Die Elemente die du bei SelectedItems übergeben bekommst sind vom Typ DataRowView und bei diesen lassen sich die Spalten als Index abfragen:$LVUser_SelectedItems | %{
$vorname = $_
$nachname = $_[1]
# usw.
}
Wie ich geschrieben habe, mach es erst in VisualStudio dort hast du alle Debugging-Möglichkeiten und die Intellisense die dir die verfügbaren Eigenschaften und Klassen anzeigt. Damit ist das ein Kinderspiel., und du musst nicht immer Google quälen, gleichzeitig lernt man viel mehr ... das umsetzen in Powershell ist dann nur noch Makulatur.
Grüße Uwe
Hmm, du verstehst leider das Konzept hinter dem Verknüpfen zwischen der Data-Source (also der Data-Table) welche die Daten für das ListView-Element bereitstellt noch nicht. Du kannst bei dieser Methode nicht direkt die Elemente des ListView-Controls ändern sondern musst die verknüpfte Datenquelle also die erstellte DataTable ($dt) ändern !
Mit dieser Datenquelle $dt.Rows hast du auch gleichzeitig ein Array über das du für deinen Export iterieren kannst...
Einfach mal die Doku zum Datatable Objekt studieren ... Powershell == .NET also fast 1:1 umsetzbar.
Du hättest besser erst mit Windows-Forms angefangen, WPF ist eine Stufe höher und für den Anfänger nicht ganz so simpel umzusetzen, wie Windows Forms.
Beispiel mit "Remove"-Button.
Grüße Uwe
Mit dieser Datenquelle $dt.Rows hast du auch gleichzeitig ein Array über das du für deinen Export iterieren kannst...
Einfach mal die Doku zum Datatable Objekt studieren ... Powershell == .NET also fast 1:1 umsetzbar.
Du hättest besser erst mit Windows-Forms angefangen, WPF ist eine Stufe höher und für den Anfänger nicht ganz so simpel umzusetzen, wie Windows Forms.
Beispiel mit "Remove"-Button.
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="ListView Demo" WindowStartupLocation = "CenterScreen" ResizeMode="NoResize" ShowInTaskbar = "True" Width="448" Height="262">
<Grid Name="Grid1">
<ListView x:Name="LV_User" HorizontalAlignment="Left" Height="199" Margin="10,10,10,10" VerticalAlignment="Top" Width="253" ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="Vorname" DisplayMemberBinding="{Binding }" />
<GridViewColumn Header="Nachname" DisplayMemberBinding="{Binding [1]}"/>
<GridViewColumn Header="Loginname" DisplayMemberBinding="{Binding [2]}" />
</GridView>
</ListView.View>
</ListView>
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,12,0,0" Name="txtVorname" VerticalAlignment="Top" Width="120" Text="Max" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,41,0,0" Name="txtNachname" VerticalAlignment="Top" Width="120" Text="Mustermann" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="277,70,0,0" Name="txtLoginname" VerticalAlignment="Top" Width="120" Text="maxmustermann" />
<Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="322,99,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />
<Button Content="Remove" Height="23" HorizontalAlignment="Left" Margin="322,130,0,0" Name="Button2" VerticalAlignment="Top" Width="75" />
</Grid>
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFC1C1C1" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Window.Background>
</Window>
"@
# Markup laden
$window=[Windows.Markup.XamlReader]::Parse($xaml)
$dt = new-Object System.Data.DataTable
[void]$dt.Columns.Add("Vorname")
[void]$dt.Columns.Add("Nachname")
[void]$dt.Columns.Add("Loginname")
$lv = $window.FindName('LV_User')
$btnAdd = $window.FindName('Button1')
$btnRemove = $window.FindName('Button2')
$txtVorname = $window.FindName('txtVorname')
$txtNachname = $window.FindName('txtNachname')
$txtLoginname = $window.FindName('txtLoginname')
$lv.ItemsSource = $dt.DefaultView
$btnAdd.add_Click({
$dt.Rows.Add(@($txtVorname.Text,$txtNachname.Text,$txtLoginname.Text))
})
$btnRemove.add_Click({
if ($lv.SelectedIndex -ne -1){
$dt.Rows.RemoveAt($lv.SelectedIndex)
}
})
$async = $window.Dispatcher.InvokeAsync({$window.ShowDialog() | Out-Null})
$async.Wait() | Out-Null
Kannst du so machen:
$obj ist dann dein PSObject ...
Grüße Uwe
p.s. dein Schnippsel ist nicht ganz richtig ... In dem Fall ist es in der Schleife nicht $_ sondern $i
$obj = @()
$dt.Rows | %{
$cols = $_.ItemArray
$obj += New-Object PSObject -Property @{"Vorname"=$cols;"Nachname"=$cols[1];"LoginName"=$cols[2]}
}
Grüße Uwe
p.s. dein Schnippsel ist nicht ganz richtig ... In dem Fall ist es in der Schleife nicht $_ sondern $i
foreach ($i in $dt){
$vorname = $_
$nachname = $_[1]
$login = $_[2]
$vorname = $_
$nachname = $_[1]
$login = $_[2]