ListBox

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.

Image Image


Grundlagen

ListBox erstellen

# Klassisch
$listBox = New-Object System.Windows.Forms.ListBox

# .NET-Style
$listBox = [System.Windows.Forms.ListBox]::new()

Item hinzufügen

$listBox.Items.Add("Apfel")
$listBox.Items.Add("Banane")
$listBox.Items.Add("Kirsche")

Mehrere Items hinzufügen

$listBox.Items.AddRange(@("Orange","Mango","Traube"))

Die Methode `AddRange` nimmt nur ein Objekt, dass eine List ist entgegen, deshalb die Schreibweise `@("Orange", "Mango", "Traube")`, welches die Items als ein Array darstellt


Werte auslesen

# Einzelne Auswahl
$selected = $listBox.SelectedItem

# Index
$index = $listBox.SelectedIndex

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

Eigenschaften

Eigenschaften
  • Property – Standardwert
    Beschreibung oder Erläuterung der Eigenschaft

  • AllowDrop – $false
    Erlaubt Drag & 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
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

Events

Events
  • Event – Hinweistext
    Auslöser / Trigger dieses Events

  • 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

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"
})

Tipps & Tricks - TabControl

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:

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


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



➕ 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


🧩 Best Practice


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”.


Revision #11
Created 2026-03-31 12:41:05 UTC by John-Andreas Borinas
Updated 2026-08-23 19:25:50 UTC by John-Andreas Borinas