Skip to main content

TabControl

Ein TabControl ist ein Container, der mehrere TabPage-Instanzen verwaltet und zwischen ihnen umschaltet.
Es stellt die Tabs (Reiter) dar und bestimmt, welche TabPage aktuell sichtbar ist.


Grundidee

Das TabControl ist die Steuerung, nicht der Inhalt.

  • TabControl → verwaltet Tabs
  • TabPage → enthält den eigentlichen Inhalt
TabControl erstellen
# Klassisch
$tabControl = New-Object System.Windows.Forms.TabControl

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

Eigenschaften TabControl

Eigenschaften

Beispiel

  • Eigenschaft
    Beschreibung oder Erläuterung der Eigenschaft
    • Datentyp: [Variabletyp]
    • Default: Defaultwert

  • Alignment
    Position der Tabs (Top, Bottom, Left, Right)
    • Datentyp: [System.Windows.Forms.TabAlignment]
    • Default: Top
  • Anchor
    Alternative Layoutsteuerung
    • Datentyp: [System.Windows.Forms.AnchorStyles]
    • Default: Top, Left
  • Appearance
    Darstellung der Tabs (Normal, Buttons, FlatButtons)
    • Datentyp: [System.Windows.Forms.TabAppearance]
    • Default: Normal
  • Dock
    Layout innerhalb des Parent-Containers (meist Fill)
    • Datentyp: [System.Windows.Forms.DockStyle]
    • Default: None
  • DrawMode
    Zeichenmodus (Normal, OwnerDrawFixed)
    • Datentyp: [System.Windows.Forms.TabDrawMode]
    • Default: Normal
  • HotTrack
    Hover-Effekt über Tabs
    • Datentyp: [System.Boolean]
    • Default: $false
  • ImageList
    Ermöglicht Icons in Tabs
    • Datentyp: [System.Windows.Forms.ImageList]
    • Default: $null
  • ItemSize
    Größe einzelner Tabs (nur relevant bei Fixed)
    • Datentyp: [System.Drawing.Size]
    • Default: (Width=0, Height=0)
  • Multiline
    Mehrere Reihen von Tabs erlauben
    • Datentyp: [System.Boolean]
    • Default: $false
  • Padding
    Abstand innerhalb der Tab-Headers
    • Datentyp: [System.Windows.Forms.Padding]
    • Default: (6, 3)
  • RowCount
    Anzahl der Tab-Reihen (relevant bei Multiline)
    • Datentyp: [System.Int32]
    • Default: 0 (wird dynamisch berechnet)
  • SelectedImageIndex
    Index des Icons für den aktiven Tab
    • Datentyp: [System.Int32]
    • Default: -1
  • SelectedIndex – Index des aktuell aktiven Tabs
  • SelectedTab
    Referenz auf die aktuell aktive TabPage
  • ShowToolTips
    Tooltips für Tabs aktivieren
    • Datentyp: [System.Boolean]
    • Default: $false
  • SizeMode
    Größe der Tabs (Normal, Fixed)
    • Datentyp: [System.Windows.Forms.TabSizeMode]
    • Default: Normal
  • TabPages
    Sammlung aller enthaltenen TabPage-Instanzen
    • Datentyp: [System.Windows.Forms.TabControl.TabPageCollection]
    • Default: (leer)

SelectedIndex [System.Int32]

Der Wert von SelectedIndex ist das jeweilige Index vom TabPage, welches momentan aktiv ist. Die TabPages-Collection ist 0-basiert und der Standarwert ist 0. Wenn sich aber kein TabPage in der TabPage-Collection befindet, ist der Wert -1.


Methoden TabControl

Methoden

Beispiel

  • Methode ( Param )
    Beschreibung oder Erläuterung wofür die Methode ist oder was sie macht

    GetTabRect ( TabPageIndex )
    Gibt die Position und Größe vom TabPage-Reiter zurück

Tab hinzufügen

Ein TabPage wird nicht direkt zum TabControl hinzugefügt, sondern zur enthaltenen Sammlung $tabControl.TabPages.
Die Sammlung TabPages stellt mehrere Methoden zum Hinzufügen von TabPage-Instanzen bereit:

  • TabPages.Add($tabPage1) – Fügt das TabPage $tabPage1 zur Sammlung hinzu
  • TabPages.AddRange(@($tabPage2, $tabPage3)) – Fügt mehrere TabPage-Instanzen gleichzeitig als Array hinzu
  • TabPages.Insert(0, $tabPage4) – Fügt das TabPage an der gewünschten Position innerhalb der Sammlung ein
$tabControl.TabPages.Add($tabPage1)

$tabControl.TabPages.AddRange(@(
    $tabPage2,
    $tabPage3
))

$tabControl.TabPages.Insert(0, $tabPage4)

# Technisch möglich, aber nicht empfohlen
$tabControl.Controls.Add($tabPage4)
$tabControl.Controls.AddRange(@(
    $tabPage5,
    $tabPage6
))

Über Add() kann zusätzlich direkt ein neues TabPage erstellt werden:

# Erstellt ein neues TabPage
$tabControl.TabPages.Add("TabText")

# Erstellt ein neues TabPage mit Name + Text
$tabControl.TabPages.Add("TabName", "TabText")

Tab entfernen

Ein TabPage kann aus dem TabControl mit der Referenz zum TabPage und Remove() oder über den Index mit RemoveAt() entfernt werden.

$tabControl.TabPages.Remove($tabPage1) # mit Referenz
$tabControl.TabPages.RemoveAt(0) # mit Index

Mit Clear() werden alle TabPage-Instanzen entfernt.

# Alle entfernen
$tabControl.TabPages.Clear()

Tab-Auswahl

Mit dem jeweiligen Index vom TabPage, kann in TabPages direkt auf das TabPage zugegriffen werden.

# Zugriff auf einzelnes TabPage
$tabControl.TabPages[0]

# Aktiven Tab setzen
$tabControl.SelectedIndex = 0
$tabControl.SelectedTab = $tabPage1


Events TabControl

Events

Beispiel

  • Event
    Erläuterung wann Event ausgelöst wird

  • Selecting
    Vor dem Wechsel zum TabPage
  • Selected
    Nach dem Wechsel zum TabPage
  • SelectedIndexChanged
    Ausgewählter TabPage hat sich geändert

  • Deselecting
    Vor dem Verlassen vom TabPage
  • Deselected
    Nach dem Verlassen vom TabPage
  • Click
    Mausklick auf das TabControl

  • ControlAdded
    Dem TabControl wurde ein TabPage hinzugefügt
  • ControlRemoved
    Vom TabControl wurde ein TabPage entfernt
$tabControl.Add_*
  param($sender, $e)
  • $sender → Das TabControl selbst (=$this)
  • $e (EventArgs) → Argumente Tab (TabPage) entsprechend

Tabwechsel

Selecting

Vor dem Wechsel zu einem Tab (TabPage) → kann noch abgebrochen werden

  • $e.TabPage → der Tab, zu dem gewechselt werden soll
  • $e.TabPageIndex → Index davon
  • $e.Cancel → kannst du auf $true setzen → Wechsel wird verhindert

Selected

Nach dem Wechsel zu einem Tab (TabPage)

  • $e.TabPage → der Tab, zu dem gewechselt wurde
  • $e.TabPageIndex → Index davon
$tabControl.Add_Selecting({
    param($sender, $e)

    # Ziel-Tab
    $nextTab = $e.TabPage

    if ($nextTab.Name -eq "PackageTab") {
        Write-Host "Wechsel verhindert!"

        # 🚨 DAS ist der Trick:
        $e.Cancel = $true
    }
})

SelectedIndexChanged

Wird ausgelöst, nachdem sich der ausgewählte Tab geändert hat

  • ❌ Kein $e.TabPage
  • $sender.SelectedTab → aktuell aktiver Tab
  • $sender.SelectedIndex → Index des aktiven Tabs
$sender, $e

$sender

  • $sender.SelectedTab → aktuell aktiver Tab (TabPage)
  • $sender.SelectedIndex → Index davon
  • $sender.TabPages → alle Tabs (Collection)
  • $sender.TabCount → Anzahl Tabs
  • $sender.Name → Name vom Control
  • $sender.Enabled → ob aktiv
  • $sender.Visible → sichtbar oder nicht

$e

  • einfach nur ein Standard-EventArgs-Objekt
  • ohne nützliche Zusatzinfos
$tabControl.Add_SelectedIndexChanged({
    param($sender, $e)

    # Aktueller Tab
    $currentTab = $sender.SelectedTab

    Write-Host "Aktiver Tab: $($currentTab.Name)"
})

Deselecting

Vor dem Verlassen eines Tabs (TabPage) → kann noch abgebrochen werden

$tabControl.Add_Deselecting({
    param($sender, $e)

    # Aktueller Tab (der verlassen wird)
    $currentTab = $e.TabPage

    # Beispiel: Verhindere Verlassen wenn noch Auswahl vorhanden
    if ($currentTab.Name -eq "PackageTab" -and $checkedListBox.CheckedItems.Count -gt 0) {
        Write-Host "Du hast noch Auswahl!"

        $e.Cancel = $true
    }
})

$e (EventArgs)
$e.TabPage → der Tab, der verlassen wird
$e.Cancel$true = Wechsel wird verhindert

Deselected

Nach dem Verlassen eines Tabs → ideal zum Zurücksetzen von UI

$tabControl.Add_Deselected({
    param($sender, $e)

    # Verlassener Tab
    $oldTab = $e.TabPage

    if ($oldTab.Name -eq "PackageTab") {

        # CheckedListBox zurücksetzen
        for ($i = 0; $i -lt $checkedListBox.Items.Count; $i++) {
            $checkedListBox.SetItemChecked($i, $false)
        }

        # ListBox zurücksetzen
        $listBox.ClearSelected()
    }
})

$e (EventArgs)
$e.TabPage → der Tab, der verlassen wurde

🔍 Konkreter Ablauf beim Tabwechsel

Wenn du von Tab A → Tab B wechselst:

  1. Deselecting (TabControl)
    → bevor Tab A verlassen wird
    kann abgebrochen werden ($_.Cancel = $true)
  2. Selecting (TabControl)
    → bevor Tab B aktiviert wird
    kann ebenfalls abgebrochen werden

👉 Wenn hier keiner abbricht, geht’s weiter:

  1. Deselected (TabControl)
    → Tab A wurde gerade deaktiviert
  2. SelectedIndexChanged (TabControl)
    → der Index hat sich geändert
  3. Selected (TabControl)
    → Tab B ist jetzt aktiv
  4. Leave (TabPage A)
    → Fokus verlässt alten Tab
  5. Enter (TabPage B)
    → Fokus betritt neuen Tab

Click

Klick auf das Control (selten relevant)


ControlAdded / ControlRemoved

Wenn TabPages hinzugefügt oder entfernt werden


Tipps & Tricks - TabControl


Typische Stolperfallen

  • Tab wird nicht angezeigt
    → nicht zur TabPages-Collection hinzugefügt
  • Events greifen nicht
    → falsches Event verwendet (Selecting vs. SelectedIndexChanged)
  • Layout wirkt falsch
    Dock / Anchor nicht sauber gesetzt
  • Icons fehlen
    ImageList nicht gesetzt oder falscher Index

Mentales Modell

Das TabControl ist ein Container mit Umschalter-Logik.

Es zeigt genau eine TabPage gleichzeitig
und verwaltet nur, welche sichtbar ist.


Wann sinnvoll?

  • Strukturierung komplexer Inhalte
  • Einstellungen / Optionen
  • Platz sparen

Wann vermeiden?

  • Häufiges Hin- und Herspringen notwendig
  • Linearer Workflow
  • Stark voneinander abhängige Inhalte