Skip to main content

ListBox

Namespace: System.Windows.Forms

Properties / 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) ColumnWidth 0
      Breite der Spalten bei MultiColumn (0 = automatisch) 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 Height (abhängig vom Layout)
      Höhe der ListBox HorizontalExtent 0
      Virtuelle Breite für horizontales Scrollen HorizontalScrollbar $false
      Zeigt horizontale Scrollbar an 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 Items (leer)
      Sammlung aller Listeneinträge Location (0,0)
      Position innerhalb des Containers MultiColumn $false
      Mehrspaltige Darstellung aktivieren Name ""
      Interner Name der ListBox ScrollAlwaysVisible $false
      Scrollbar immer anzeigen, auch wenn nicht nötig 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, MultiSimple, MultiExtended) Size (Width=120, Height=96)
      Größe der ListBox Sorted $false
      Sortiert Einträge automatisch alphabetisch 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 Width (abhängig vom Layout)
      Breite der 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.


      🧱 Grundlegendes Beispiel

       Image Image

      # 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

      Image Image

      Image Image

      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 → DoubleClick oder Enter
      • 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

      • 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:

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