# TableLayoutPanel

Ein `TableLayoutPanel` ist ein Layout-Container, der seine enthaltenen Controls in einem **Raster aus Zeilen und Spalten** anordnet.

Im Gegensatz zu einem normalen `Panel` werden Controls nicht über ihre `Location` positioniert, sondern einer bestimmten Zelle innerhalb des Rasters zugewiesen. Das `TableLayoutPanel` übernimmt anschließend automatisch die Positionierung und Größenanpassung aller enthaltenen Controls.

---

## **Grundlagen**

Ein `TableLayoutPanel` organisiert Controls in einem **Tabellenlayout**.

- `Panel` → freie Positionierung über `Location`
- `FlowLayoutPanel` → automatische Anordnung hintereinander
- `TableLayoutPanel` → Anordnung in Zeilen und Spalten

#### TableLayoutPanel erstellen

```powershell
# Klassisch
$table = New-Object System.Windows.Forms.TableLayoutPanel

# .NET-Style
$table = [System.Windows.Forms.TableLayoutPanel]::new()
```

#### Controls hinzufügen

```powershell
$table.Controls.Add($button)
```

oder direkt in eine bestimmte Zelle

```powershell
$table.Controls.Add($button, 1, 0) # Spalte 1, Zeile 0
```

#### Zeilen und Spalten festlegen

```powershell
$table.ColumnCount = 2
$table.RowCount    = 3

```

---

## **Eigenschaften**

<table id="bkmrk-eigenschaft-beschrei"><thead><tr><th>Eigenschaft</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`ColumnCount`</td><td>Anzahl der Spalten.</td></tr><tr><td>`RowCount`</td><td>Anzahl der Zeilen.</td></tr><tr><td>`ColumnStyles`</td><td>Definiert Breite jeder Spalte.</td></tr><tr><td>`RowStyles`</td><td>Definiert Höhe jeder Zeile.</td></tr><tr><td>`GrowStyle`</td><td>Legt fest, wie neue Zeilen oder Spalten entstehen.</td></tr><tr><td>`CellBorderStyle`</td><td>Zeichnet Rahmen zwischen den Zellen.</td></tr><tr><td>`Dock`</td><td>Dockt das Panel an den Parent an.</td></tr><tr><td>`Anchor`</td><td>Verankert das Panel am Parent.</td></tr><tr><td>`AutoSize`</td><td>Passt die Größe automatisch an.</td></tr><tr><td>`AutoScroll`</td><td>Aktiviert Scrollleisten.</td></tr><tr><td>`BackColor`</td><td>Hintergrundfarbe.</td></tr><tr><td>`Padding`</td><td>Innenabstand.</td></tr><tr><td>`Margin`</td><td>Außenabstand.</td></tr><tr><td>`Name`</td><td>Interner Name.</td></tr><tr><td>`Location`</td><td>Position des Panels.</td></tr><tr><td>`Size`</td><td>Größe des Panels.</td></tr><tr><td>`Visible`</td><td>Sichtbarkeit.</td></tr><tr><td>`Enabled`</td><td>Aktiviert bzw. deaktiviert das Panel.</td></tr></tbody></table>

<details id="bkmrk-autoscroll-autoscrol"><summary>AutoScroll</summary>

### **AutoScroll**

<table border="1" style="border-collapse: collapse; width: 35.1852%;"><colgroup><col style="width: 50.1683%;"></col><col style="width: 50.1683%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Boolean</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">False</span>`</td></tr></tbody></table>

Die Eigenschaft `AutoScroll` legt fest, ob das `TableLayoutPanel` automatisch Scrollleisten anzeigt, wenn der Inhalt größer ist als der sichtbare Bereich.

Ist `AutoScroll` auf `True` gesetzt, erscheinen horizontale und/oder vertikale Scrollleisten nur dann, wenn sie tatsächlich benötigt werden. Dadurch bleiben auch Controls erreichbar, die sich außerhalb des aktuell sichtbaren Bereichs befinden.

**Beispiel:**

```powershell
$table.AutoScroll = $true
```

Sind mehr Controls vorhanden, als im verfügbaren Bereich angezeigt werden können, fügt das `TableLayoutPanel` automatisch die erforderlichen Scrollleisten hinzu.

**Hinweis:**

- `AutoScroll` ist standardmäßig deaktiviert (`False`).
- Scrollleisten werden nur angezeigt, wenn der Inhalt die sichtbare Größe des `TableLayoutPanel` überschreitet.
- Besonders nützlich bei dynamischen Benutzeroberflächen, deren Anzahl an Controls zur Laufzeit variieren kann.

</details><details id="bkmrk-autosize-autosize-ty"><summary>AutoSize</summary>

### **AutoSize**

<table border="1" style="border-collapse: collapse; width: 35.1852%;"><colgroup><col style="width: 50.1683%;"></col><col style="width: 50.1683%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Boolean</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">False</span>`</td></tr></tbody></table>

Passt die Größe automatisch an den Inhalt an.

**Beispiel:**

```powershell
$table.AutoSize = $true
```

</details><details id="bkmrk-cellborderstyle-cell"><summary>CellBorderStyle</summary>

### **CellBorderStyle**

<table border="1" style="border-collapse: collapse; width: 71.7284%;"><colgroup><col style="width: 23.3209%;"></col><col style="width: 76.6824%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Windows.Forms.TableLayoutPanelCellBorderStyle</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">None</span>`</td></tr></tbody></table>

Legt fest, ob zwischen den Zellen Rahmen gezeichnet werden.

Mögliche Werte

- `None`
- `Single`
- `Inset`
- `Outset`
- `InsetDouble`
- `OutsetDouble`

**Beispiel:**

```powershell
$table.CellBorderStyle = "Single"
```

</details><details id="bkmrk-columncount-columnco"><summary>ColumnCount</summary>

### **ColumnCount**

<table border="1" style="border-collapse: collapse; width: 35.1852%;"><colgroup><col style="width: 50.1683%;"></col><col style="width: 50.1683%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Int32</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">0</span>`</td></tr></tbody></table>

Legt fest, aus wie vielen Spalten das Layout besteht.

**Beispiel:**

```powershell
$table.ColumnCount = 3
```

</details><details id="bkmrk-columnstyles-columns"><summary>ColumnStyles</summary>

### **ColumnStyles**

<table border="1" style="border-collapse: collapse; width: 68.8889%;"><colgroup><col style="width: 21.319%;"></col><col style="width: 78.681%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Windows.Forms.TableLayoutColumnStyleCollection</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">leere Sammlung</td></tr></tbody></table>

Bestimmt die Breite jeder einzelnen Spalte.

Es gibt drei verschiedene Größenarten:

<table><thead><tr><th>Größe</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`Absolute`</td><td>Feste Pixelgröße</td></tr><tr><td>`Percent`</td><td>Prozentuale Verteilung</td></tr><tr><td>`AutoSize`</td><td>Größe richtet sich nach dem Inhalt</td></tr></tbody></table>

**Beispiel:**

```powershell
$table.ColumnStyles.Add(
    [System.Windows.Forms.ColumnStyle]::new("Percent",50)
)

$table.ColumnStyles.Add(
    [System.Windows.Forms.ColumnStyle]::new("Percent",50)
)
```

</details><details id="bkmrk-dock-dock-typ-%3D-syst"><summary>Dock</summary>

### **Dock**

<table border="1" style="border-collapse: collapse; width: 46.5432%;"><colgroup><col style="width: 32.7586%;"></col><col style="width: 67.2414%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Windows.Forms.DockStyle</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">None</span>`</td></tr></tbody></table>

Legt fest, wie das TableLayoutPanel innerhalb seines Parent-Containers angedockt wird.

**Beispiel:**

```powershell
$table.Dock = "Fill"
```

Dies ist die häufigste Einstellung.

</details><details id="bkmrk-growstyle-growstyle-"><summary>GrowStyle</summary>

### **GrowStyle**

<table border="1" style="border-collapse: collapse; width: 70.4938%;"><colgroup><col style="width: 21.6287%;"></col><col style="width: 78.3713%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Windows.Forms.TableLayoutPanelGrowStyle</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">AddRows</span>`</td></tr></tbody></table>

Legt fest, wie das Panel reagiert, wenn mehr Controls hinzugefügt werden als Zellen vorhanden sind.

Mögliche Werte

- `AddRows`
- `AddColumns`
- `FixedSize`

**Beispiel:**

```powershell
$table.GrowStyle = "AddRows"
```

Bei `FixedSize` wird eine Ausnahme ausgelöst, wenn kein Platz mehr vorhanden ist.

</details><details id="bkmrk-rowcount-rowcount-ty"><summary>RowCount</summary>

### **RowCount**

<table border="1" style="border-collapse: collapse; width: 35.1852%;"><colgroup><col style="width: 50.1683%;"></col><col style="width: 50.1683%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Int32</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">`<span style="color: rgb(35, 111, 161);">0</span>`</td></tr></tbody></table>

Legt die Anzahl der Zeilen fest, die das `TableLayoutPanel` enthält.

Zusammen mit `ColumnCount` bestimmt diese Eigenschaft die Größe des Tabellenrasters. Jede Zeile kann anschließend über die Eigenschaft `RowStyles` individuell konfiguriert werden.

**Beispiel:**

```powershell
$table.RowCount = 3
```

Das `TableLayoutPanel` besitzt nun drei Zeilen.

**Hinweis:**

- `RowCount` legt lediglich die Anzahl der Zeilen fest. Die Höhe der einzelnen Zeilen wird über `RowStyles` bestimmt.
- Zusammen mit `ColumnCount` ergibt sich die Gesamtzahl der verfügbaren Zellen.
- Wird `GrowStyle` auf `AddRows` gesetzt, kann das `TableLayoutPanel` bei Bedarf automatisch weitere Zeilen hinzufügen.

</details><details id="bkmrk-rowstyles-rowstyles-"><summary>RowStyles</summary>

### **RowStyles**

<table border="1" style="border-collapse: collapse; width: 70.4938%;"><colgroup><col style="width: 21.6287%;"></col><col style="width: 78.3713%;"></col></colgroup><tbody><tr><td>**Typ**</td><td class="align-left">`<span style="color: rgb(132, 63, 161);">System.Windows.Forms.TableLayoutRowStyleCollection</span>`</td></tr><tr><td>**Standardwert**</td><td class="align-left">leere Sammlung</td></tr></tbody></table>

Bestimmt die Höhe jeder Zeile.

Auch hier stehen

- `Absolute`
- `Percent`
- `AutoSize`

zur Verfügung.

**Beispiel:**

```powershell
$table.RowStyles.Add(
    [System.Windows.Forms.RowStyle]::new("AutoSize")
)
```

</details>---

## **Methoden**

<table id="bkmrk-methode-beschreibung"><thead><tr><th>Methode</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`GetControlFromPosition()`</td><td>Liefert das Control einer bestimmten Zelle.</td></tr><tr><td>`GetPositionFromControl()`</td><td>Liefert die Position eines Controls.</td></tr><tr><td>`GetColumn()`</td><td>Liefert die Spalte eines Controls.</td></tr><tr><td>`GetRow()`</td><td>Liefert die Zeile eines Controls.</td></tr><tr><td>`SetColumn()`</td><td>Verschiebt ein Control in eine andere Spalte.</td></tr><tr><td>`SetRow()`</td><td>Verschiebt ein Control in eine andere Zeile.</td></tr><tr><td>`SetColumnSpan()`</td><td>Lässt ein Control mehrere Spalten belegen.</td></tr><tr><td>`SetRowSpan()`</td><td>Lässt ein Control mehrere Zeilen belegen.</td></tr></tbody></table>

<details id="bkmrk-getcontrolfrompositi"><summary>GetControlFromPosition()</summary>

### **GetControlFromPosition()**

```powershell
$table.GetControlFromPosition(1,0)

```

**Beschreibung:**

Liefert das Control zurück, das sich in der angegebenen Spalte und Zeile befindet.

**Rückgabe**

Rückgabetyp `System.Windows.Forms.Control`

</details><details id="bkmrk-getpositionfromcontr"><summary>GetPositionFromControl()</summary>

### **GetPositionFromControl()**

```powershell
$table.GetPositionFromControl($button)
```

**Beschreibung:**

Ermittelt die aktuelle Position eines Controls innerhalb des Rasters.

**Rückgabe:**

Rückgabetyp `System.Windows.Forms.TableLayoutPanelCellPosition`

</details><details id="bkmrk-setcolumn%28%29-setcolum"><summary>SetColumn()</summary>

### **SetColumn()**

```powershell
$table.SetColumn($button,2)
```

Verschiebt ein Control in eine andere Spalte.

</details><details id="bkmrk-setrow%28%29-setrow%28%29-%24t"><summary>SetRow()</summary>

### **SetRow()**

```powershell
$table.SetRow($button,1)
```

Verschiebt ein Control in eine andere Zeile.

</details><details id="bkmrk-setcolumnspan%28%29-setc"><summary>SetColumnSpan()</summary>

### **SetColumnSpan()**

```powershell
$table.SetColumnSpan($button,2)
```

Das Control erstreckt sich über mehrere Spalten.

</details><details id="bkmrk-setrowspan%28%29-setrows"><summary>SetRowSpan()</summary>

### **SetRowSpan()**

```powershell
$table.SetRowSpan($button,3)
```

Das Control erstreckt sich über mehrere Zeilen.

</details>### RowStyles

<details id="bkmrk-insert-insert-%24sizet"><summary>Insert</summary>

#### **Insert()**

```powershell
$sizeType = [System.Windows.Forms.SizeType]::Absolute

$rowStyle = [System.Windows.Forms.RowStyle]::new( $sizeType, 50 )

$table.RowStyles.Insert(0, $rowStyle )
```

Die Methode `Insert()` fügt an der angegebenen Position einen neuen `RowStyle` in die `RowStyles`-Sammlung ein.

Alle vorhandenen Einträge ab diesem Index werden dabei um eine Position nach hinten verschoben. Dadurch kann die Reihenfolge der Zeilenstile geändert oder zwischen bestehenden Zeilen ein neuer Stil eingefügt werden.

Die Methode verändert lediglich die `RowStyles`-Sammlung. Damit der neue Eintrag einer Zeile zugeordnet werden kann, sollte die Anzahl der Einträge in der Regel mit `RowCount` übereinstimmen.

<p class="callout warning">Die Methode `Insert()` erhöht **nicht** automatisch den Wert der Eigenschaft `RowCount`. Sie fügt lediglich einen neuen `RowStyle` in die `RowStyles`-Sammlung ein. Soll der eingefügte `RowStyle` einer zusätzlichen Zeile zugeordnet werden, muss `RowCount` entsprechend erhöht werden.</p>

**Rückgabe:**

Kein Rückgabewert.

Rückgabetyp `System.Void`

**Beispiel:**

```powershell
$table.RowCount = 3

$firstSizeType = [System.Windows.Forms.SizeType]::Absolute
$firstRowStyle = [System.Windows.Forms.RowStyle]::new( $firstSizeType, 40 )
$table.RowStyles.Add( $firstRowStyle )

$secondSizeType = [System.Windows.Forms.SizeType]::Percent
$secondRowStyle = [System.Windows.Forms.RowStyle]::new( $secondSizeType, 100 )
$table.RowStyles.Add( $secondRowStyle )

# Neuen RowStyle an Position 1 einfügen
$thirdSizeType = [System.Windows.Forms.SizeType]::Absolute
$thirdRowStyle = [System.Windows.Forms.RowStyle]::new( $thirdSizeType, 20 )
$table.RowStyles.Insert( 1, $thirdRowStyle )
```

Der neue `RowStyle` wird an Index `1` eingefügt. Der ursprünglich zweite Eintrag verschiebt sich automatisch an die nächste Position.

</details>---

## **Events**

<table id="bkmrk-event-beschreibung-l"><thead><tr><th>Event</th><th>Beschreibung</th></tr></thead><tbody><tr><td>`Layout`</td><td>Wird ausgelöst, wenn das Layout neu berechnet wird.</td></tr><tr><td>`ControlAdded`</td><td>Ein Control wurde hinzugefügt.</td></tr><tr><td>`ControlRemoved`</td><td>Ein Control wurde entfernt.</td></tr></tbody></table>

---

<details id="bkmrk-layout-layout-das-ev"><summary>Layout</summary>

### **Layout**

Das Event wird ausgelöst, wenn das TableLayoutPanel seine Controls neu anordnet.

Dies geschieht beispielsweise bei

- Größenänderungen
- Änderungen an `ColumnStyles`
- Änderungen an `RowStyles`
- Hinzufügen oder Entfernen von Controls

```powershell
$table.Add_Layout({
    Write-Host "Layout aktualisiert"
})

```

</details><details id="bkmrk-controladded-control"><summary>ControlAdded</summary>

### **ControlAdded**

```powershell
$table.Add_ControlAdded({
    param($sender,$e)

    Write-Host $e.Control.Name
})
```

Wird ausgelöst, sobald ein Control hinzugefügt wird.

</details><details id="bkmrk-controlremoved-contr"><summary>ControlRemoved</summary>

### **ControlRemoved**

```powershell
$table.Add_ControlRemoved({
    param($sender,$e)

    Write-Host $e.Control.Name
})
```

Wird ausgelöst, sobald ein Control entfernt wird.

</details>---

## **Tipps &amp; Tricks**

##### Controls direkt einer Zelle hinzufügen

```powershell
$table.Controls.Add($button,0,1)
```

Dadurch entfällt ein späterer Aufruf von `SetColumn()` und `SetRow()`.

---

##### Control über mehrere Spalten strecken

```powershell
$table.SetColumnSpan($textBox,2)
```

Dies wird häufig für Überschriften oder TextBoxen verwendet.

---

##### Gesamten verfügbaren Platz ausfüllen

```powershell
$table.Dock = "Fill"
```

Das `TableLayoutPanel` wächst und schrumpft automatisch mit seinem Parent-Container.

---

##### Gleichmäßige Spalten erzeugen

```powershell
$table.ColumnCount = 2

$table.ColumnStyles.Add(
    [System.Windows.Forms.ColumnStyle]::new("Percent",50)
)

$table.ColumnStyles.Add(
    [System.Windows.Forms.ColumnStyle]::new("Percent",50)
)
```

Beide Spalten belegen dadurch jeweils die Hälfte der verfügbaren Breite