# ListView

Ein `ListView` ist ein Steuerelement zur Darstellung einer Sammlung von Elementen. Je nach Einstellung können die Elemente als große oder kleine Symbole, als einfache Liste oder als Tabelle mit mehreren Spalten dargestellt werden.

Im Gegensatz zu einer `ListBox` kann ein `ListView` zusätzliche Informationen zu jedem Eintrag darstellen und eignet sich dadurch besonders für Datei- und Datenübersichten.

---

## **Grundlagen**

Ein `ListView` besteht im Wesentlichen aus drei Komponenten:

- `ListView` → stellt die Liste dar
- `ListViewItem` → repräsentiert einen einzelnen Eintrag
- `ListViewSubItem` → enthält zusätzliche Spaltenwerte eines Eintrags

Beispielsweise kann eine Dateiliste so aufgebaut werden:

<table id="bkmrk-name-typ-gr%C3%B6%C3%9Fe-dokum"><thead><tr><th>Name</th><th>Typ</th><th>Größe</th></tr></thead><tbody><tr><td>`Dokument.txt`</td><td>Textdatei</td><td>12 KB</td></tr><tr><td>`Bild.png`</td><td>Bild</td><td>1,4 MB</td></tr><tr><td>`Programm.exe`</td><td>Anwendung</td><td>8 MB</td></tr></tbody></table>

Dabei entspricht jede Zeile einem `ListViewItem` und jede zusätzliche Spalte einem `ListViewSubItem`.

---

#### ListView erstellen

```powershell
# Klassisch
$listView = New-Object System.Windows.Forms.ListView

# .NET-Style
$listView = [System.Windows.Forms.ListView]::new()
```

---

#### ListView hinzufügen

Ein `ListView` wird wie jedes andere Control der `Controls`-Collection seines Parent-Containers hinzugefügt.

```powershell
$form.Controls.Add($listView)

# oder

$tabPage.Controls.Add($listView)
```

---

#### Einfache Einträge hinzufügen

Ein einzelner Eintrag kann direkt über die `Items`-Collection hinzugefügt werden.

```powershell
$listView.Items.Add("Dokument.txt")
$listView.Items.Add("Bild.png")
$listView.Items.Add("Programm.exe")

```

---

## **Eigenschaften**

<table id="bkmrk-eigenschaft-beschrei"><thead><tr><th>Eigenschaft</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`Activation`</td><td>Bestimmt, wie Listenelemente durch den Mauszeiger aktiviert werden.</td></tr><tr><td>`Alignment`</td><td>Bestimmt die Anordnung der Elemente bei Symbolansichten.</td></tr><tr><td>`AutoArrange`</td><td>Ordnet Elemente bei Symbolansichten automatisch an.</td></tr><tr><td>`BackColor`</td><td>Legt die Hintergrundfarbe fest.</td></tr><tr><td>`CheckBoxes`</td><td>Zeigt neben jedem Eintrag eine Checkbox an.</td></tr><tr><td>`Columns`</td><td>Enthält die Spalten des `ListView`.</td></tr><tr><td>`Dock`</td><td>Dockt das `ListView` am Parent-Container an.</td></tr><tr><td>`Enabled`</td><td>Legt fest, ob das `ListView` verwendet werden kann.</td></tr><tr><td>`Font`</td><td>Legt Schriftart, -größe und -stil fest.</td></tr><tr><td>`ForeColor`</td><td>Legt die Textfarbe fest.</td></tr><tr><td>`FullRowSelect`</td><td>Markiert bei `Details` die gesamte Zeile eines ausgewählten Eintrags.</td></tr><tr><td>`GridLines`</td><td>Zeigt bei `Details` Gitternetzlinien zwischen Zeilen und Spalten an.</td></tr><tr><td>`Groups`</td><td>Enthält die Gruppen des `ListView`.</td></tr><tr><td>`HeaderStyle`</td><td>Bestimmt die Darstellung der Spaltenüberschriften.</td></tr><tr><td>`HideSelection`</td><td>Legt fest, ob eine Auswahl beim Verlust des Fokus sichtbar bleibt.</td></tr><tr><td>`HoverSelection`</td><td>Wählt ein Element automatisch aus, wenn der Mauszeiger darüber bewegt wird.</td></tr><tr><td>`Items`</td><td>Enthält alle `ListViewItem` des `ListView`.</td></tr><tr><td>`LabelEdit`</td><td>Erlaubt das direkte Bearbeiten der Beschriftung eines Eintrags.</td></tr><tr><td>`LabelWrap`</td><td>Legt fest, ob Beschriftungen in Symbolansichten umgebrochen werden.</td></tr><tr><td>`LargeImageList`</td><td>Enthält die Bilder für die große Symbolansicht.</td></tr><tr><td>`Location`</td><td>Bestimmt die Position im Parent-Container.</td></tr><tr><td>`Margin`</td><td>Legt den äußeren Abstand fest.</td></tr><tr><td>`MultiSelect`</td><td>Legt fest, ob mehrere Einträge gleichzeitig ausgewählt werden können.</td></tr><tr><td>`OwnerDraw`</td><td>Legt fest, ob die Darstellung der ListView-Elemente vollständig oder teilweise selbst gezeichnet werden soll.</td></tr><tr><td>`Scrollable`</td><td>Aktiviert bzw. deaktiviert Scrollleisten.</td></tr><tr><td>`SelectedItems`</td><td>Enthält die aktuell ausgewählten Einträge.</td></tr><tr><td>`ShowGroups`</td><td>Legt fest, ob Gruppen angezeigt werden.</td></tr><tr><td>`ShowItemToolTips`</td><td>Aktiviert Tooltips für einzelne Einträge.</td></tr><tr><td>`Size`</td><td>Bestimmt Breite und Höhe.</td></tr><tr><td>`SmallImageList`</td><td>Enthält die Bilder für kleine Symbole.</td></tr><tr><td>`Sorting`</td><td>Bestimmt die automatische Sortierung der Einträge.</td></tr><tr><td>`StateImageList`</td><td>Enthält Statusbilder, beispielsweise für Checkbox-Zustände.</td></tr><tr><td>`TileSize`</td><td>Bestimmt die Größe von Elementen in der `Tile`-Ansicht.</td></tr><tr><td>`View`</td><td>Bestimmt die Darstellungsart des `ListView`.</td></tr><tr><td>`Visible`</td><td>Legt fest, ob das `ListView` sichtbar ist.</td></tr></tbody></table>

---

<details id="bkmrk-checkboxes-checkboxe"><summary>CheckBoxes</summary>

### CheckBoxes

**Typ** = `[System.Boolean]`

Der Wert von `CheckBoxes` legt fest, ob neben jedem Eintrag eine Checkbox angezeigt wird.

```powershell
$listView.CheckBoxes = $true

```

Der Zustand einer Checkbox wird über die Eigenschaft `Checked` des jeweiligen `ListViewItem` gesteuert.

```powershell
$listView.Items[0].Checked = $true

```

> 💡 **Hinweis** Die Checkbox gehört zum jeweiligen `ListViewItem` und wird nicht über eine separate Collection verwaltet.

</details><details id="bkmrk-columns-columns-typ-"><summary>Columns</summary>

### Columns

**Typ** = `[System.Windows.Forms.ListView.ColumnHeaderCollection]`

Die Eigenschaft `Columns` enthält die Spalten des `ListView`.

Spalten werden hauptsächlich in der `Details`-Ansicht verwendet.

```powershell
$listView.View = "Details"

$listView.Columns.Add("Name", 200)
$listView.Columns.Add("Typ", 100)
$listView.Columns.Add("Größe", 100)

```

Die zweite Angabe bestimmt dabei die Breite der Spalte in Pixeln.

> 💡 **Hinweis** Die Spaltenüberschriften werden nur sichtbar, wenn `View` auf `Details` gesetzt ist.

</details><details id="bkmrk-fullrowselect-fullro"><summary>FullRowSelect</summary>

### FullRowSelect

**Typ** = `[System.Boolean]`

Der Wert von `FullRowSelect` legt fest, ob bei einer Auswahl in der `Details`-Ansicht die gesamte Zeile markiert wird.

Standardmäßig ist diese Eigenschaft deaktiviert.

```powershell
$listView.FullRowSelect = $true

```

Ohne `FullRowSelect` wird bei der Auswahl hauptsächlich das erste Feld des Eintrags hervorgehoben.

> 💡 **Hinweis** Die Eigenschaft ist insbesondere bei tabellarischen Darstellungen sinnvoll, da dadurch deutlich erkennbar ist, welche komplette Zeile ausgewählt wurde.

</details><details id="bkmrk-gridlines-gridlines-"><summary>GridLines</summary>

### GridLines

**Typ** = `[System.Boolean]`

Der Wert von `GridLines` legt fest, ob zwischen den Zeilen und Spalten Gitternetzlinien angezeigt werden.

```powershell
$listView.GridLines = $true

```

Die Gitternetzlinien werden nur in der `Details`-Ansicht angezeigt.

</details><details id="bkmrk-groups-groups-typ-%3D-"><summary>Groups</summary>

### Groups

**Typ** = `[System.Windows.Forms.ListViewGroupCollection]`

Die Eigenschaft `Groups` enthält die Gruppen des `ListView`.

Eine Gruppe kann beispielsweise so erstellt werden:

```powershell
$group = [System.Windows.Forms.ListViewGroup]::new("Dokumente")

$listView.Groups.Add($group)

```

Ein `ListViewItem` kann anschließend einer Gruppe zugewiesen werden:

```powershell
$item = [System.Windows.Forms.ListViewItem]::new("Dokument.txt")
$item.Group = $group

$listView.Items.Add($item)

```

</details><details id="bkmrk-items-items-typ-%3D-%5Bs"><summary>Items</summary>

### Items

**Typ** = `[System.Windows.Forms.ListViewItemCollection]`

Die Eigenschaft `Items` enthält alle Einträge des `ListView`.

Über die Collection können neue Einträge hinzugefügt, vorhandene Einträge entfernt oder einzelne Einträge abgerufen werden.

```powershell
$listView.Items.Add("Dokument.txt")

```

Ein `ListViewItem` kann auch explizit erstellt werden:

```powershell
$item = [System.Windows.Forms.ListViewItem]::new("Dokument.txt")

$listView.Items.Add($item)

```

Die Collection enthält ausschließlich die Haupteinträge. Zusätzliche Spalten werden über die `SubItems` des jeweiligen `ListViewItem` verwaltet.

</details><details id="bkmrk-labeledit-labeledit-"><summary>LabelEdit</summary>

### LabelEdit

**Typ** = `[System.Boolean]`

Der Wert von `LabelEdit` legt fest, ob der Benutzer die Beschriftung eines `ListViewItem` direkt im `ListView` bearbeiten kann.

```powershell
$listView.LabelEdit = $true

```

Wird die Bearbeitung aktiviert, kann der Benutzer beispielsweise durch langsames Doppelklicken auf einen Eintrag dessen Text ändern.

Die Ereignisse `BeforeLabelEdit` und `AfterLabelEdit` ermöglichen es, die Bearbeitung zu kontrollieren.

</details><details id="bkmrk-largeimagelist-large"><summary>LargeImageList</summary>

### LargeImageList

**Typ** = `[System.Windows.Forms.ImageList]`

`LargeImageList` legt die `ImageList` für große Symbole fest.

Sie wird insbesondere bei der Darstellungsart `LargeIcon` verwendet.

```powershell
$listView.LargeImageList = $imageList
$listView.View = "LargeIcon"

```

</details><details id="bkmrk-multiselect-multisel"><summary>MultiSelect</summary>

### MultiSelect

**Typ** = `[System.Boolean]`

Der Wert von `MultiSelect` legt fest, ob mehrere Einträge gleichzeitig ausgewählt werden können.

Standardmäßig ist `MultiSelect` auf `True` gesetzt.

```powershell
$listView.MultiSelect = $false

```

Ist `MultiSelect` deaktiviert, kann immer nur ein `ListViewItem` ausgewählt werden.

</details><details id="bkmrk-ownerdraw-ownerdraw-"><summary>OwnerDraw</summary>

### OwnerDraw

**Typ** = `[System.Boolean]`

Der Wert von `OwnerDraw` legt fest, ob die Darstellung des `ListView` vom Entwickler selbst gezeichnet werden soll.

Standardmäßig besitzt diese Eigenschaft den Wert `False`, wodurch das `ListView` seine Elemente automatisch anhand der festgelegten Eigenschaften darstellt.

Wird `OwnerDraw` auf `True` gesetzt, können die einzelnen Bereiche des `ListView` über die entsprechenden Zeichen-Events individuell gezeichnet werden. Dazu gehören unter anderem `DrawColumnHeader`, `DrawItem` und `DrawSubItem`.

```powershell
$listView.OwnerDraw = $true
```

> 💡 **Hinweis**  
> Bei aktiviertem `OwnerDraw` müssen die entsprechenden `Draw...`-Events behandelt werden, wenn die Darstellung individuell angepasst werden soll. Andernfalls bleibt die Darstellung je nach verwendetem View und behandelten Events unvollständig.

</details><details id="bkmrk-selecteditems-select"><summary>SelectedItems</summary>

### SelectedItems

**Typ** = `[System.Windows.Forms.ListView.SelectedListViewItemCollection]`

Die Eigenschaft `SelectedItems` enthält alle aktuell ausgewählten `ListViewItem`.

```powershell
$listView.SelectedItems

```

Der erste ausgewählte Eintrag kann beispielsweise so abgerufen werden:

```powershell
$item = $listView.SelectedItems[0]

Write-Host $item.Text

```

Bei aktiviertem `MultiSelect` kann die Collection mehrere Einträge enthalten.

> ⚠️ **Hinweis** Vor dem Zugriff auf `[0]` sollte geprüft werden, ob überhaupt ein Eintrag ausgewählt wurde.

```powershell
if ($listView.SelectedItems.Count -gt 0) {
    $item = $listView.SelectedItems[0]
}

```

</details><details id="bkmrk-showgroups-showgroup"><summary>ShowGroups</summary>

### ShowGroups

**Typ** = `[System.Boolean]`

Der Wert von `ShowGroups` legt fest, ob die im `Groups`-Container definierten Gruppen angezeigt werden.

```powershell
$listView.ShowGroups = $true

```

Gruppen werden hauptsächlich verwendet, um größere Mengen von Einträgen logisch zu unterteilen.

</details><details id="bkmrk-smallimagelist-small"><summary>SmallImageList</summary>

### SmallImageList

**Typ** = `[System.Windows.Forms.ImageList]`

`SmallImageList` legt die `ImageList` fest, aus der das `ListView` kleine Symbole für seine Einträge bezieht.

```powershell
$listView.SmallImageList = $imageList

```

Welches Bild für einen bestimmten Eintrag verwendet wird, wird über `ImageIndex` oder `ImageKey` des `ListViewItem` festgelegt.

```powershell
$item.ImageKey = "document"

```

</details><details id="bkmrk-sorting-sorting-typ-"><summary>Sorting</summary>

### Sorting

**Typ** = `[System.Windows.Forms.SortOrder]`

Der Wert von `Sorting` bestimmt, ob und wie die Einträge automatisch sortiert werden.

Folgende Werte stehen zur Verfügung:

<table><thead><tr><th>Wert</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`None`</td><td>Keine automatische Sortierung</td></tr><tr><td>`Ascending`</td><td>Aufsteigende Sortierung</td></tr><tr><td>`Descending`</td><td>Absteigende Sortierung</td></tr></tbody></table>

```powershell
$listView.Sorting = "Ascending"

```

> 💡 **Hinweis** Die automatische Sortierung orientiert sich standardmäßig am Text des `ListViewItem`.

</details><details id="bkmrk-stateimagelist-state"><summary>StateImageList</summary>

### StateImageList

**Typ** = `[System.Windows.Forms.ImageList]`

`StateImageList` enthält Bilder, die den Status eines `ListViewItem` darstellen.

Sie kann beispielsweise verwendet werden, um unterschiedliche Zustände eines Eintrags visuell darzustellen.

```powershell
$listView.StateImageList = $stateImageList

```

Der verwendete Zustand wird über `StateImageIndex` des jeweiligen `ListViewItem` festgelegt.

</details><details id="bkmrk-view-view-typ-%3D-%5Bsys"><summary>View</summary>

### View

**Typ** = `[System.Windows.Forms.View]`

Der Wert von `View` bestimmt, wie die Elemente des `ListView` dargestellt werden.

Folgende Darstellungsarten stehen zur Verfügung:

<table><thead><tr><th>Wert</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`Details`</td><td>Tabellarische Darstellung mit Spalten</td></tr><tr><td>`LargeIcon`</td><td>Große Symbole mit Beschriftung</td></tr><tr><td>`SmallIcon`</td><td>Kleine Symbole mit Beschriftung</td></tr><tr><td>`List`</td><td>Einfache Liste mit kleinen Symbolen</td></tr><tr><td>`Tile`</td><td>Kachelansicht</td></tr></tbody></table>

Für eine tabellarische Darstellung muss `View` auf `Details` gesetzt werden.

```powershell
$listView.View = "Details"

```

Beispiel für eine einfache Dateiliste:

```powershell
$listView.View = "Details"

$listView.Columns.Add("Name", 200)
$listView.Columns.Add("Typ", 100)
$listView.Columns.Add("Größe", 100)

```

> 💡 **Hinweis** Eigenschaften wie `Columns`, `GridLines` und `FullRowSelect` sind insbesondere für die `Details`-Ansicht relevant.

</details>---

# ListViewItem

Ein `ListViewItem` repräsentiert einen einzelnen Eintrag innerhalb eines `ListView`.

Ein Eintrag besitzt mindestens einen sichtbaren Haupttext. Zusätzlich können weitere Werte über `SubItems` hinzugefügt werden.

### Eintrag mit mehreren Spalten

```powershell
$item = [System.Windows.Forms.ListViewItem]::new("Dokument.txt")

$item.SubItems.Add("Textdatei")
$item.SubItems.Add("12 KB")

$listView.Items.Add($item)

```

Bei folgendem `ListView`:

```powershell
$listView.View = "Details"

$listView.Columns.Add("Name", 200)
$listView.Columns.Add("Typ", 100)
$listView.Columns.Add("Größe", 100)

```

entsteht daraus:

<table id="bkmrk-name-typ-gr%C3%B6%C3%9Fe-dokum-1"><thead><tr><th>Name</th><th>Typ</th><th>Größe</th></tr></thead><tbody><tr><td>Dokument.txt</td><td>Textdatei</td><td>12 KB</td></tr></tbody></table>

Dabei gilt:

```text
ListViewItem
├── Text
├── SubItems[1]
├── SubItems[2]
└── ...

```

Das erste `SubItem` entspricht dabei dem Haupttext des `ListViewItem`.

---

## **Methoden**

## Übersicht

<table id="bkmrk-methode-beschreibung"><thead><tr><th>Methode</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`ArrangeIcons()`</td><td>Ordnet Symbole im `ListView` an.</td></tr><tr><td>`BeginUpdate()`</td><td>Verhindert während einer Änderung die Aktualisierung der Darstellung.</td></tr><tr><td>`Clear()`</td><td>Entfernt alle Einträge und Spalten.</td></tr><tr><td>`EndUpdate()`</td><td>Aktiviert nach `BeginUpdate()` wieder die Aktualisierung.</td></tr><tr><td>`EnsureVisible()`</td><td>Stellt sicher, dass ein bestimmter Eintrag sichtbar ist.</td></tr><tr><td>`FindItemWithText()`</td><td>Sucht nach einem Eintrag anhand seines Textes.</td></tr><tr><td>`GetItemAt()`</td><td>Ermittelt den Eintrag an einer bestimmten Position.</td></tr><tr><td>`HitTest()`</td><td>Ermittelt, welches Element sich an einer Mausposition befindet.</td></tr><tr><td>`Sort()`</td><td>Sortiert die Einträge.</td></tr></tbody></table>

---

<details id="bkmrk-beginupdate%28%29-beginu"><summary>BeginUpdate()</summary>

### BeginUpdate()

Die Methode `BeginUpdate()` verhindert, dass das `ListView` während umfangreicher Änderungen nach jeder einzelnen Änderung neu gezeichnet wird.

```powershell
$listView.BeginUpdate()

foreach ($file in $files) {
    $listView.Items.Add($file.Name)
}

$listView.EndUpdate()

```

Dies ist besonders bei vielen Einträgen sinnvoll.

> 💡 **Hinweis** `BeginUpdate()` sollte immer zusammen mit `EndUpdate()` verwendet werden. Andernfalls kann die Aktualisierung des Controls ausbleiben. Menschliche Softwareentwicklung hat also auch hier einen „vergessen, wieder einzuschalten“-Modus.

</details><details id="bkmrk-endupdate%28%29-endupdat"><summary>EndUpdate()</summary>

### EndUpdate()

Die Methode `EndUpdate()` beendet die mit `BeginUpdate()` begonnene Aktualisierungssperre.

```powershell
$listView.BeginUpdate()

$listView.Items.Clear()
$listView.Items.Add("Eintrag 1")
$listView.Items.Add("Eintrag 2")

$listView.EndUpdate()

```

Nach `EndUpdate()` wird das `ListView` wieder aktualisiert.

</details><details id="bkmrk-clear%28%29-clear%28%29-die-"><summary>Clear()</summary>

### Clear()

Die Methode `Clear()` entfernt alle Einträge und Spalten aus dem `ListView`.

```powershell
$listView.Clear()

```

> ⚠️ **Hinweis** `Clear()` entfernt nicht nur die `Items`, sondern auch die `Columns`. Soll ausschließlich der Inhalt entfernt werden, sollte stattdessen `Items.Clear()` verwendet werden.

```powershell
$listView.Items.Clear()

```

</details><details id="bkmrk-ensurevisible%28%29-ensu"><summary>EnsureVisible()</summary>

### EnsureVisible()

Die Methode `EnsureVisible()` sorgt dafür, dass ein bestimmter Eintrag im sichtbaren Bereich des `ListView` liegt.

```powershell
$listView.EnsureVisible(10)

```

Der angegebene Parameter ist der Index des Eintrags.

**Syntax**

```powershell
$listView.EnsureVisible(Index)

```

</details><details id="bkmrk-finditemwithtext%28%29-f"><summary>FindItemWithText()</summary>

### FindItemWithText()

Die Methode `FindItemWithText()` sucht nach einem `ListViewItem`, dessen Text mit dem angegebenen Suchtext übereinstimmt.

```powershell
$item = $listView.FindItemWithText("Dokument.txt")

```

Wird kein passender Eintrag gefunden, wird `$null` zurückgegeben.

```powershell
if ($item) {
    Write-Host "Eintrag gefunden: $($item.Text)"
}

```

</details><details id="bkmrk-getitemat%28%29-getitema"><summary>GetItemAt()</summary>

### GetItemAt()

Die Methode `GetItemAt()` ermittelt das `ListViewItem`, das sich an einer bestimmten Position befindet.

```powershell
$item = $listView.GetItemAt(50, 30)

```

Die Koordinaten beziehen sich auf das `ListView`.

Wird an der angegebenen Position kein Eintrag gefunden, wird `$null` zurückgegeben.

</details><details id="bkmrk-sort%28%29-sort%28%29-die-me"><summary>Sort()</summary>

### Sort()

Die Methode `Sort()` führt eine Sortierung der Einträge durch.

```powershell
$listView.Sort()

```

Die Sortierreihenfolge wird durch die Eigenschaft `Sorting` bestimmt.

```powershell
$listView.Sorting = "Ascending"
$listView.Sort()

```

</details>---

## **Events**

## Übersicht

<table id="bkmrk-event-beschreibung-a"><thead><tr><th>Event</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`AfterLabelEdit`</td><td>Wird ausgelöst, nachdem die Beschriftung eines Eintrags bearbeitet wurde.</td></tr><tr><td>`BeforeLabelEdit`</td><td>Wird ausgelöst, bevor die Beschriftung eines Eintrags bearbeitet wird.</td></tr><tr><td>`ColumnClick`</td><td>Wird ausgelöst, wenn auf eine Spaltenüberschrift geklickt wird.</td></tr><tr><td>`ItemActivate`</td><td>Wird ausgelöst, wenn ein Eintrag aktiviert wird.</td></tr><tr><td>`ItemCheck`</td><td>Wird ausgelöst, bevor sich der Checkbox-Zustand eines Eintrags ändert.</td></tr><tr><td>`ItemChecked`</td><td>Wird ausgelöst, nachdem sich der Checkbox-Zustand geändert hat.</td></tr><tr><td>`ItemDrag`</td><td>Wird ausgelöst, wenn ein Eintrag mit der Maus gezogen wird.</td></tr><tr><td>`ItemSelectionChanged`</td><td>Wird ausgelöst, wenn sich der Auswahlzustand eines Eintrags ändert.</td></tr><tr><td>`SelectedIndexChanged`</td><td>Wird ausgelöst, wenn sich die Auswahl im `ListView` ändert.</td></tr></tbody></table>

---

<details id="bkmrk-itemselectionchanged"><summary>ItemSelectionChanged</summary>

### ItemSelectionChanged

Das Event `ItemSelectionChanged` wird ausgelöst, wenn sich der Auswahlzustand eines `ListViewItem` verändert.

```powershell
$listView.Add_ItemSelectionChanged({
    param($sender, $e)

    Write-Host "Auswahl geändert: $($e.Item.Text)"
})

```

Über das Event-Argument `$e` kann unter anderem auf das betroffene `Item` zugegriffen werden.

```powershell
$e.Item

```

Der neue Auswahlzustand kann über `IsSelected` ermittelt werden.

```powershell
if ($e.IsSelected) {
    Write-Host "$($e.Item.Text) wurde ausgewählt."
}

```

</details><details id="bkmrk-selectedindexchanged"><summary>SelectedIndexChanged</summary>

### SelectedIndexChanged

Das Event `SelectedIndexChanged` wird ausgelöst, wenn sich die Auswahl des `ListView` verändert.

```powershell
$listView.Add_SelectedIndexChanged({
    param($sender, $e)

    Write-Host "Auswahl geändert."
})

```

Das Event eignet sich insbesondere, wenn nach einer Änderung der Auswahl mit den aktuell ausgewählten Elementen gearbeitet werden soll.

```powershell
$listView.Add_SelectedIndexChanged({
    if ($this.SelectedItems.Count -gt 0) {
        Write-Host $this.SelectedItems[0].Text
    }
})

```

> 💡 **Hinweis** Wenn das konkrete betroffene `ListViewItem` benötigt wird, ist `ItemSelectionChanged` meist geeigneter.

</details><details id="bkmrk-itemactivate-itemact"><summary>ItemActivate</summary>

### ItemActivate

Das Event `ItemActivate` wird ausgelöst, wenn ein `ListViewItem` aktiviert wird.

Je nach `Activation`-Einstellung kann dies beispielsweise durch einen einfachen oder doppelten Mausklick erfolgen.

```powershell
$listView.Add_ItemActivate({
    param($sender, $e)

    if ($this.SelectedItems.Count -gt 0) {
        Write-Host "Aktiviert: $($this.SelectedItems[0].Text)"
    }
})

```

</details><details id="bkmrk-itemchecked-itemchec"><summary>ItemChecked</summary>

### ItemChecked

Das Event `ItemChecked` wird ausgelöst, nachdem sich der Checkbox-Zustand eines `ListViewItem` geändert hat.

```powershell
$listView.Add_ItemChecked({
    param($sender, $e)

    if ($e.Item.Checked) {
        Write-Host "$($e.Item.Text) aktiviert"
    }
    else {
        Write-Host "$($e.Item.Text) deaktiviert"
    }
})

```

Im Gegensatz zu `ItemCheck` findet die Änderung zu diesem Zeitpunkt bereits statt.

</details><details id="bkmrk-itemcheck-itemcheck-"><summary>ItemCheck</summary>

### ItemCheck

Das Event `ItemCheck` wird ausgelöst, bevor sich der Checkbox-Zustand eines `ListViewItem` ändert.

```powershell
$listView.Add_ItemCheck({
    param($sender, $e)

    Write-Host "Checkbox wird geändert."
})

```

Das Event eignet sich insbesondere, wenn die Änderung geprüft oder verhindert werden soll.

Der geplante neue Zustand steht in `NewValue`.

```powershell
$listView.Add_ItemCheck({
    param($sender, $e)

    Write-Host "Neuer Zustand: $($e.NewValue)"
})

```

</details><details id="bkmrk-columnclick-columncl"><summary>ColumnClick</summary>

### ColumnClick

Das Event `ColumnClick` wird ausgelöst, wenn der Benutzer auf eine Spaltenüberschrift klickt.

```powershell
$listView.Add_ColumnClick({
    param($sender, $e)

    Write-Host "Spalte $($e.Column) wurde angeklickt."
})

```

`Column` enthält den Index der angeklickten Spalte.

Das Event eignet sich beispielsweise, um beim Klick auf eine Spaltenüberschrift die Sortierreihenfolge zu ändern.

</details><details id="bkmrk-beforelabeledit-befo"><summary>BeforeLabelEdit</summary>

### BeforeLabelEdit

Das Event `BeforeLabelEdit` wird ausgelöst, bevor die Beschriftung eines `ListViewItem` bearbeitet wird.

```powershell
$listView.Add_BeforeLabelEdit({
    param($sender, $e)

    Write-Host "Bearbeitung wird gestartet."
})

```

Die Bearbeitung kann über `CancelEdit` verhindert werden.

```powershell
$listView.Add_BeforeLabelEdit({
    param($sender, $e)

    $e.CancelEdit = $true
})

```

</details><details id="bkmrk-afterlabeledit-after"><summary>AfterLabelEdit</summary>

### AfterLabelEdit

Das Event `AfterLabelEdit` wird ausgelöst, nachdem die Beschriftung eines `ListViewItem` bearbeitet wurde.

```powershell
$listView.Add_AfterLabelEdit({
    param($sender, $e)

    Write-Host "Neuer Text: $($e.Label)"
})

```

Über `Label` kann der neu eingegebene Text abgerufen werden.

</details>---

# Beispiel

Das folgende Beispiel erstellt ein einfaches `ListView` zur Darstellung einer Dateiliste.

```powershell
$listView = [System.Windows.Forms.ListView]::new()

$listView.View = "Details"
$listView.FullRowSelect = $true
$listView.GridLines = $true
$listView.MultiSelect = $false
$listView.Dock = "Fill"

$listView.Columns.Add("Name", 250)
$listView.Columns.Add("Typ", 120)
$listView.Columns.Add("Größe", 100)

$item = [System.Windows.Forms.ListViewItem]::new("Dokument.txt")
$item.SubItems.Add("Textdatei")
$item.SubItems.Add("12 KB")

$listView.Items.Add($item)

$form.Controls.Add($listView)

```

Das Ergebnis entspricht konzeptionell:

```text
┌────────────────────────────────────────────────────────────┐
│ Name                    │ Typ         │ Größe              │
├─────────────────────────┼─────────────┼────────────────────┤
│ Dokument.txt            │ Textdatei   │ 12 KB              │
└─────────────────────────┴─────────────┴────────────────────┘

```

---

# Häufige Kombinationen

Für die praktische Verwendung sind einige Eigenschaftskombinationen besonders relevant:

### Tabellenansicht

```powershell
$listView.View = "Details"
$listView.FullRowSelect = $true
$listView.GridLines = $true

```

### Einzelauswahl

```powershell
$listView.MultiSelect = $false

```

### Checkbox-Liste

```powershell
$listView.CheckBoxes = $true
$listView.View = "Details"

```

### Liste mit Symbolen

```powershell
$listView.View = "SmallIcon"
$listView.SmallImageList = $imageList

```

### Große Symbolansicht

```powershell
$listView.View = "LargeIcon"
$listView.LargeImageList = $imageList

```

---

# Hinweise

- `ListView` ist besonders für strukturierte Listen und tabellarische Darstellungen geeignet.
- Für einfache Listen ohne zusätzliche Spalten ist `ListBox` meist einfacher.
- `Columns` werden hauptsächlich in der `Details`-Ansicht verwendet.
- Ein `ListViewItem` repräsentiert eine komplette Zeile.
- Zusätzliche Spalten eines Eintrags werden über `SubItems` definiert.
- `SelectedItems` enthält nur die aktuell ausgewählten Einträge.
- Bei großen Datenmengen sollte `BeginUpdate()` und `EndUpdate()` verwendet werden, um unnötige Neudarstellungen zu vermeiden.
- Für Bilder können `SmallImageList`, `LargeImageList` und `StateImageList` getrennt verwendet werden.
- `FullRowSelect` und `GridLines` haben ihre wesentliche Bedeutung in der `Details`-Ansicht.
- Mit `Groups` können Einträge zusätzlich logisch gruppiert werden.
- Über `LabelEdit` können Benutzer Einträge direkt im `ListView` umbenennen.

# Siehe auch

- `ListBox`
- `ImageList`
- `ListViewItem`
- `ListViewGroup`
- `ColumnHeader`
- `TableLayoutPanel`
- `FlowLayoutPanel`