From 8078e41ed4107d67c3281730589e67a75212acfb Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 31 Jul 2025 14:41:02 +0200 Subject: [PATCH] add TableLayoutPanel extension methods for add/remove rows --- .../Extensions/TableLayoutPanelExtensions.cs | 66 +++++++++++++++++++ Pilz.UI.WinForms/Pilz.UI.WinForms.csproj | 2 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 Pilz.UI.WinForms/Extensions/TableLayoutPanelExtensions.cs diff --git a/Pilz.UI.WinForms/Extensions/TableLayoutPanelExtensions.cs b/Pilz.UI.WinForms/Extensions/TableLayoutPanelExtensions.cs new file mode 100644 index 0000000..ee02d69 --- /dev/null +++ b/Pilz.UI.WinForms/Extensions/TableLayoutPanelExtensions.cs @@ -0,0 +1,66 @@ +namespace Pilz.UI.WinForms.Extensions; + +public static class TableLayoutPanelExtensions +{ + public static void InsertRows(this TableLayoutPanel panel, int row, int amount) + { + if (row < 0 || row > panel.RowCount) + throw new ArgumentOutOfRangeException(nameof(row)); + + if (amount <= 0) + return; + + panel.SuspendLayout(); + panel.RowCount += amount; + + for (int i = 0; i < amount; i++) + panel.RowStyles.Insert(row, new RowStyle(SizeType.AutoSize)); + + foreach (var control in panel.Controls.Cast().OrderByDescending(panel.GetRow)) + { + var currentRow = panel.GetRow(control); + + if (currentRow >= row) + panel.SetRow(control, currentRow + amount); + } + + panel.ResumeLayout(); + } + + public static void RemoveRows(this TableLayoutPanel panel, int row, int amount) + { + if (row < 0 || row >= panel.RowCount) + throw new ArgumentOutOfRangeException(nameof(row)); + + if (amount <= 0 || row + amount > panel.RowCount) + throw new ArgumentOutOfRangeException(nameof(amount)); + + panel.SuspendLayout(); + + foreach (var control in panel.Controls.Cast().ToList()) + { + int r = panel.GetRow(control); + if (r >= row && r < row + amount) + { + panel.Controls.Remove(control); + control.Dispose(); + } + } + + foreach (var control in panel.Controls.Cast()) + { + int r = panel.GetRow(control); + if (r >= row + amount) + panel.SetRow(control, r - amount); + } + + for (int i = 0; i < amount; i++) + { + if (panel.RowStyles.Count > row) + panel.RowStyles.RemoveAt(row); + } + + panel.RowCount -= amount; + panel.ResumeLayout(); + } +} diff --git a/Pilz.UI.WinForms/Pilz.UI.WinForms.csproj b/Pilz.UI.WinForms/Pilz.UI.WinForms.csproj index 53f3acc..be061b9 100644 --- a/Pilz.UI.WinForms/Pilz.UI.WinForms.csproj +++ b/Pilz.UI.WinForms/Pilz.UI.WinForms.csproj @@ -10,7 +10,7 @@ annotations - 2.6.1 + 2.6.2