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 (0-basiert)
      • Datentyp: [System.Int32]
      Default: -1 (ohne TabPages) / 0 (mit mindestens einer TabPage in der TabPages-Collection) 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

      Grundidee

      [System.Int32]

      DasDer Wert von TabControlSelectedIndex ist diedas Steuerungjeweilige Index vom TabPage, nichtwelches momentan aktiv ist. Die TabPages-Collection ist 0-basiert und der Inhalt.Standarwert ist 0. Wenn sich aber kein TabPage in der TabPage-Collection befindet, ist der Wert -1.


      Methoden TabControl

      Methoden

      Beispiel

      • TabControlMethode ( verwaltetParam Tabs
      )
      Beschreibung TabPageoder Erläuterung enthältwofür dendie eigentlichenMethode Inhaltist oder was sie macht

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

      TabControl erstellen

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

      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