Вот метод расширения, который позволит вам удалить любую строку из TableLayoutPanel
по индексу:
Imports System.Runtime.CompilerServices
Public Module TableLayoutPanelExtensions
<Extension>
Public Sub RemoveRowAt(source As TableLayoutPanel, index As Integer)
If index >= source.RowCount Then
Throw New ArgumentOutOfRangeException(NameOf(index),
index,
"The row index must be less than the number of rows in the TableLayoutPanel control.")
End If
'Remove the controls in the specified row.
For columnIndex = 0 To source.ColumnCount - 1
Dim child = source.GetControlFromPosition(columnIndex, index)
If child IsNot Nothing Then
child.Dispose()
End If
Next
'Move controls below the specified row up.
For rowIndex = index + 1 To source.RowCount - 1
For columnIndex = 0 To source.ColumnCount - 1
Dim child = source.GetControlFromPosition(columnIndex, rowIndex)
If child IsNot Nothing Then
source.SetCellPosition(child, New TableLayoutPanelCellPosition(columnIndex, rowIndex - 1))
End If
Next
Next
'Remove the last row.
source.RowCount -= 1
End Sub
End Module
Я проверил это на 3 столбцах на 4 строки TableLayoutPanel
, содержащих Label
в каждой ячейке дважды выполнялся следующий код:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TableLayoutPanel1.RemoveRowAt(1)
End Sub
Результат был таким, как ожидалось, т.е. каждый раз удалял строку сверху вниз. Возможно, вам придется немного поиграться, в зависимости от того, что вы хотите, чтобы высота строк. Высота строк была установлена равной процентной доле, поэтому оставшиеся строки росли пропорционально, чтобы заполнить пространство. Если вы хотите что-то другое, вы можете добавить код соответственно. Обратите внимание, что вы можете создать практически идентичный метод удаления столбцов.