ListBox
Namespace: System.Windows.Forms

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.
🧱 Grundlegendes Beispiel

# 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"))
⚙️ Eigenschaften
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
Items |
Enthält alle Einträge | leer |
SelectedItem |
Aktuell ausgewähltes Element | $null |
SelectedIndex |
Index des gewählten Elements | -1 |
SelectionMode |
Auswahlmodus | One |
Sorted |
Sortiert automatisch | False |
MultiColumn |
Mehrspaltige Darstellung | False |
HorizontalScrollbar |
Scrollbar aktivieren | False |
🎯 SelectionMode Optionen
Die ListBox kann mehr als nur „eins auswählen“ – auch wenn 80 % der Leute das nie checken.
| Modus | Verhalten |
|---|---|
One |
Nur ein Eintrag |
MultiSimple |
Mehrere ohne STRG |
MultiExtended |
Mehrere mit STRG/SHIFT |
$listBox.SelectionMode = "MultiExtended"
📥 Werte auslesen
# Einzelne Auswahl
$selected = $listBox.SelectedItem
# Index
$index = $listBox.SelectedIndex
# Mehrere auswählen
$selectedItems = $listBox.SelectedItems
🧠 Events


SelectedIndexChanged
Wird ausgelöst, sobald sich die Auswahl ändert.
$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).
$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.
$listBox.Add_Click({
Write-Host "ListBox wurde geklickt"
})
🖱️ DoubleClick
Wenn der User doppelt klickt. Perfekt für „öffnen“, „starten“, etc.
$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.
$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.
$listBox.Add_KeyUp({
Write-Host "Taste losgelassen:" $_.KeyCode
})
🎯 MouseDown
Feuert vor Click. Gut für spezielle Logik.
$listBox.Add_MouseDown({
Write-Host "MouseDown erkannt"
})
🎯 MouseUp
Nach dem Klick.
$listBox.Add_MouseUp({
Write-Host "MouseUp erkannt"
})
⚠️ Die Falle, in die du ziemlich sicher tappst
Ich sag’s dir direkt, weil ich genau weiß, wie das läuft:
Du kombinierst sowas:
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 →
DoubleClickoderEnter - Nur Klick erkennen →
Click - Präzise Kontrolle →
MouseDown
➕ Items verwalten
# 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
$listBox.Sorted = $true
Mehrspaltig anzeigen
$listBox.MultiColumn = $true
Scrollbar erzwingen
$listBox.HorizontalScrollbar = $true
⚠️ Typische Stolperfallen
-
SelectedItemist$null, wenn nichts gewählt ist → obvious, aber wird ständig vergessen -
SelectedItemsist 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:
$listBox.Items.Add([PSCustomObject]@{
Name = "Chrome"
Version = "123"
})
Und dann:
$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”.