# ListBox

**Namespace:** `<a href="https://doku.borinas.com/books/powershell-programmierung/chapter/systemwindowsforms" title="System.Windows.Forms">System.Windows.Forms</a>`

<details id="bkmrk-properties-hidden-ta"><summary>Properties / Eigenschaften</summary>

<div>- ***Property** – Standardwert*  
    Beschreibung oder Erläuterung der Eigenschaft

---

</div><div>- **AllowDrop** – *$false*  
    Erlaubt Drag &amp; Drop auf die ListBox
- **Anchor** – *(Top, Left)*  
    Bestimmt, wie sich die ListBox bei Größenänderung des Containers verhält
- **BackColor** – *SystemColors.Window*  
    Hintergrundfarbe der ListBox
- **BorderStyle** – *Fixed3D*  
    Rahmenstil (`None`, `FixedSingle`, `Fixed3D`)
- **Dock** – *None*  
    Layout innerhalb des Parent-Containers (z.B. `Fill`)
- **DrawMode** – Normal  
    Zeichenmodus (`Normal`, `OwnerDrawFixed`, `OwnerDrawVariable`)
- **Enabled** – $true  
    Aktiviert oder deaktiviert die ListBox
- **Font** – *Standard-Systemfont*  
    Schriftart der Einträge
- **ForeColor** – *SystemColors.WindowText*  
    Textfarbe der Einträge
- **FormattingEnabled** – *$true*  
    Aktiviert Formatierung für komplexe Objekte
- **HorizontalScrollbar** – *$false*  
    Zeigt horizontale Scrollbar an
- **Location** – *(0,0)*  
    Position innerhalb des Containers
- **Name** – *""*  
    Interner Name der ListBox
- **ScrollAlwaysVisible** – *$false*  
    Scrollbar immer anzeigen, auch wenn nicht nötig
- **TabIndex** – 0  
    Reihenfolge beim Durchtabben
- **TabStop** – *$true*  
    Ob die ListBox per Tab erreichbar ist
- **TopIndex** – 0  
    Index des obersten sichtbaren Elements
- **Visible** – *$true*  
    Sichtbarkeit der ListBox

</div>##### **Items**

- **Items** – *(leer)*  
    Sammlung aller Listeneinträge
- **MultiColumn** – *$false*  
    Mehrspaltige Darstellung aktivieren
- **SelectedIndex** – *-1*  
    Index des aktuell ausgewählten Elements (`-1` = nichts)
- **SelectedItem** – *$null*  
    Aktuell ausgewähltes Element
- **SelectedItems** – *(leer)*  
    Collection aller ausgewählten Elemente (bei `Multi-Select`)
- **SelectionMode** – *One*  
    Auswahlmodus   
    
    - `One` → Nur ein Eintrag
    - `MultiSimple` → Mehrere ohne STRG
    - `MultiExtended` → Mehrere mit STRG/SHIFT
- **Sorted** – *$false*  
    Sortiert Einträge automatisch alphabetisch

##### **Größe**

- **ColumnWidth** – 0  
    Breite der Spalten bei MultiColumn (`0` = automatisch)
- **Height** – *(abhängig vom Layout)*  
    Höhe der ListBox
- **HorizontalExtent** – 0  
    Virtuelle Breite für horizontales Scrollen
- **IntegralHeight** – *$true*  
    Passt Höhe automatisch an volle Einträge an (kein halbes Item unten)
- **ItemHeight** – *(abhängig von Font)*  
    Höhe eines einzelnen Eintrags
- **Size** – *(Width=120, Height=96)*  
    Größe der ListBox
- **Width** – *(abhängig vom Layout)*  
    Breite der ListBox

</details> ![Image](https://media.nngroup.com/media/editor/2020/03/05/2-multiselect-dual-listbox-final) ![Image](https://think360studio-media.s3.ap-south-1.amazonaws.com/photo/plugin/article/2022/List-Box-17102022.jpg)

Die **ListBox** ist eines dieser Controls, die simpel wirken, aber erstaunlich schnell chaotisch werden, wenn man sie nicht im Griff hat. Im Kern zeigt sie eine Liste von Einträgen an, aus denen der Benutzer auswählen kann.

---

```powershell
# ListBox erstellen
$listBox = New-Object System.Windows.Forms.ListBox
$listBoxNew = [System.Windows.Forms.ListBox]::new()

# Größe & Position
$listBox.Size = New-Object System.Drawing.Size(200,150)
$listBox.Location = New-Object System.Drawing.Point(10,10)

# Items hinzufügen
$listBox.Items.Add("Apfel")
$listBox.Items.Add("Banane")
$listBox.Items.Add("Kirsche")

# Mehrere auf einmal
$listBox.Items.AddRange(@("Orange","Mango","Traube"))

```

---

#### 📥 Werte auslesen

```powershell
# Einzelne Auswahl
$selected = $listBox.SelectedItem

# Index
$index = $listBox.SelectedIndex

# Mehrere auswählen
$selectedItems = $listBox.SelectedItems

```

<details id="bkmrk-events-event-%E2%80%93-hinwe"><summary>Events</summary>

<div>- ***Event** – Hinweistext*  
    Auslöser / Trigger dieses Events

---

</div><div>- **SelectedIndexChanged**  
    Wird ausgelöst, sobald sich die Auswahl ändert.
- **SelectedValueChanged**  
    Fast wie `SelectedIndexChanged`, aber subtil anders.  
    Feuert, wenn sich der **Value** ändert (relevant bei `ValueMember`)
- ---
    
    **Click**  
    Löst bei jedem Klick auf das Control aus
- **DoubleClick** Feuert, beim Doppelklick auf das Control / oder ein Item
- **MouseDown** Feuert **vor** dem Click
- **MouseUp** Feuert **nach** dem Click
- ---
    
    **KeyDown** Wird ausgelöst, wenn eine Taste gedrückt wird
- **KeyUp** Sowie `KeyDown`, aber erst wenn losgelassen wird

</div></details>---

## **Events *-*** *ListBox*

#### **SelectedIndexChanged**

Wird ausgelöst, sobald sich die Auswahl ändert.

```powershell
$listBox.Add_SelectedIndexChanged({
    Write-Host "Ausgewählt:" $listBox.SelectedItem
})

```

---

#### **SelectedValueChanged**

Fast wie `SelectedIndexChanged`… aber subtil anders.  
Feuert, wenn sich der **Value** ändert (relevant bei `ValueMember`).

```powershell
$listBox.Add_SelectedValueChanged({
    Write-Host "Value geändert:" $listBox.SelectedItem
})

```

👉 Unterschied merkst du erst, wenn du mit Objekten arbeitest.

---

#### **Click**

Wird bei jedem Klick ausgelöst.  
Ja, auch wenn sich **nichts ändert**. Klassiker für doppelte Logik.

```powershell
$listBox.Add_Click({
    Write-Host "ListBox wurde geklickt"
})

```

---

#### **DoubleClick**

Wenn der User doppelt klickt. Perfekt für „öffnen“, „starten“, etc.

```powershell
$listBox.Add_DoubleClick({
    Write-Host "Doppelklick auf:" $listBox.SelectedItem
})

```

👉 UX-technisch oft sinnvoller als Button daneben.

---

#### **KeyDown**

Für Tastatursteuerung. Wird ausgelöst, wenn eine Taste gedrückt wird.

```powershell
$listBox.Add_KeyDown({
    if ($_.KeyCode -eq "Enter") {
        Write-Host "Enter auf:" $listBox.SelectedItem
    }
})

```

👉 Das ist der Moment, wo dein UI sich plötzlich „professionell“ anfühlt.

---

#### **KeyUp**

Wie KeyDown, nur nachdem losgelassen wurde.

```powershell
$listBox.Add_KeyUp({
    Write-Host "Taste losgelassen:" $_.KeyCode
})

```

---

#### **MouseDown**

Feuert **vor** Click. Gut für spezielle Logik.

```powershell
$listBox.Add_MouseDown({
    Write-Host "MouseDown erkannt"
})

```

---

#### **MouseUp**

Nach dem Klick.

```powershell
$listBox.Add_MouseUp({
    Write-Host "MouseUp erkannt"
})

```

---

## **Tipps &amp; Tricks** *- TabControl*

Ich sag’s dir direkt, weil ich genau weiß, wie das läuft:

Du kombinierst sowas:

```powershell
Click
SelectedIndexChanged
DoubleClick

```

…und wunderst dich, warum dein Code **mehrfach läuft**.

👉 Beispiel:

- Klick → `MouseDown`
- Klick → `Click`
- Auswahl ändert sich → `SelectedIndexChanged`

→ Boom, drei Events für einen simplen Klick.

---

##### 🧩 Mini-Leitfaden (der dir später Nerven spart)

- Auswahl reagieren → `SelectedIndexChanged`
- Aktion starten → `DoubleClick` oder `Enter`
- Nur Klick erkennen → `Click`
- Präzise Kontrolle → `MouseDown`

---

## ➕ Items verwalten

```powershell
# Entfernen
$listBox.Items.Remove("Apfel")

# Alles löschen
$listBox.Items.Clear()

# Einfügen an Position
$listBox.Items.Insert(0, "Neu")

```

---

## 🎨 Nützliche Tricks

### Automatisch sortieren

```powershell
$listBox.Sorted = $true

```

### Mehrspaltig anzeigen

```powershell
$listBox.MultiColumn = $true

```

### Scrollbar erzwingen

```powershell
$listBox.HorizontalScrollbar = $true

```

---

## ⚠️ Typische Stolperfallen

- `SelectedItem` ist `$null`, wenn nichts gewählt ist → obvious, aber wird ständig vergessen
- `SelectedItems` ist **kein Array**, sondern Collection → verhält sich leicht anders
- Bei `MultiExtended`: Benutzer müssen STRG drücken → sonst denkt jeder, dein UI ist kaputt
- `Items.AddRange()` erwartet ein Array → kein wild zusammengebauter String-Müll

---

## 🧩 Best Practice

- Für einfache Auswahl → `ListBox`
- Für strukturierte Daten → **ListView** (sonst wird’s hässlich)
- Für kleine Auswahl → lieber **ComboBox**

---

Ich greif einen Punkt raus, den du wahrscheinlich unterschätzt:

**Was speicherst du eigentlich in der ListBox? Strings oder Objekte?**

Wenn du nur Strings reinwirfst, verbaust du dir später jede sinnvolle Logik.  
Pack lieber direkt Objekte rein:

```powershell
$listBox.Items.Add([PSCustomObject]@{
    Name = "Chrome"
    Version = "123"
})

```

Und dann:

```powershell
$listBox.DisplayMember = "Name"

```

Das ist der Unterschied zwischen „funktioniert irgendwie“ und „ich hab Kontrolle über meinen Code“.

Das ist so ein klassischer Punkt, wo Leute sich später selbst hassen, weil sie am Anfang “einfach schnell Strings genommen haben”.