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 TabsTabPage→ 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
- Datentyp:
- Alignment
Position der Tabs (Top,Bottom,Left,Right)- Datentyp:
[System.Windows.Forms.TabAlignment] - Default:
Top
- Datentyp:
- Anchor
Alternative Layoutsteuerung
- Datentyp:
[System.Windows.Forms.AnchorStyles] - Default:
Top, Left
- Datentyp:
- Appearance
Darstellung der Tabs (Normal,Buttons,FlatButtons)
- Datentyp:
[System.Windows.Forms.TabAppearance] - Default:
Normal
- Datentyp:
- Dock
Layout innerhalb des Parent-Containers (meistFill)
- Datentyp:
[System.Windows.Forms.DockStyle] - Default:
None
- Datentyp:
- DrawMode
Zeichenmodus (Normal,OwnerDrawFixed)
- Datentyp:
[System.Windows.Forms.TabDrawMode] - Default:
Normal
- Datentyp:
- HotTrack
Hover-Effekt über Tabs
- Datentyp:
[System.Boolean] - Default:
$false
- Datentyp:
- ImageList
Ermöglicht Icons in Tabs
- Datentyp:
[System.Windows.Forms.ImageList] - Default:
$null
- Datentyp:
- ItemSize
Größe einzelner Tabs (nur relevant beiFixed)
- Datentyp:
[System.Drawing.Size] - Default:
(Width=0, Height=0)
- Datentyp:
- Multiline
Mehrere Reihen von Tabs erlauben
- Datentyp:
[System.Boolean] - Default:
$false
- Datentyp:
- Padding
Abstand innerhalb der Tab-Headers
- Datentyp:
[System.Windows.Forms.Padding] - Default:
(6, 3)
- Datentyp:
- RowCount
Anzahl der Tab-Reihen (relevant beiMultiline)
- Datentyp:
[System.Int32] - Default:
0(wird dynamisch berechnet)
- Datentyp:
- SelectedImageIndex
Index des Icons für den aktiven Tab
- Datentyp:
[System.Int32] - Default:
-1
- Datentyp:
- SelectedIndex – Index des aktuell aktiven Tabs
- SelectedTab
Referenz auf die aktuell aktiveTabPage
- Datentyp:
[System.Windows.Forms.TabPage] - Default:
$null
- Datentyp:
- ShowToolTips
Tooltips für Tabs aktivieren
- Datentyp:
[System.Boolean] - Default:
$false
- Datentyp:
- SizeMode
Größe der Tabs (Normal,Fixed)
- Datentyp:
[System.Windows.Forms.TabSizeMode] - Default:
Normal
- Datentyp:
- TabPages
Sammlung aller enthaltenenTabPage-Instanzen
- Datentyp:
[System.Windows.Forms.TabControl.TabPageCollection] - Default:
(leer)
- Datentyp:
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 dasTabPage$tabPage1zur Sammlung hinzuTabPages.AddRange(@($tabPage2, $tabPage3))– Fügt mehrereTabPage-Instanzen gleichzeitig als Array hinzuTabPages.Insert(0, $tabPage4)– Fügt dasTabPagean 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$truesetzen → 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:
Deselecting(TabControl)
→ bevor Tab A verlassen wird
→ kann abgebrochen werden ($_.Cancel = $true)Selecting(TabControl)
→ bevor Tab B aktiviert wird
→ kann ebenfalls abgebrochen werden
👉 Wenn hier keiner abbricht, geht’s weiter:
Deselected(TabControl)
→ Tab A wurde gerade deaktiviertSelectedIndexChanged(TabControl)
→ der Index hat sich geändertSelected(TabControl)
→ Tab B ist jetzt aktivLeave(TabPage A)
→ Fokus verlässt alten TabEnter(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 zurTabPages-Collection hinzugefügt - Events greifen nicht
→ falsches Event verwendet (Selectingvs.SelectedIndexChanged) - Layout wirkt falsch
→Dock/Anchornicht sauber gesetzt - Icons fehlen
→ImageListnicht 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