Is there a way to remove all controls from a row in TableLayoutPanel?

Lenin Raj Rajasekaran picture Lenin Raj Rajasekaran · Jun 1, 2011 · Viewed 14k times · Source

I generate controls for a TableLayoutPanel dynamically. I have a delete button in each row. When I click that, that row has to be removed.

    Dim removeBtn As New Button
    AddHandler removeBtn.Click, AddressOf DeleteRow
    tlp.Controls.Add(removeBtn, 5, rowCount)

I have not shown the code to add text boxes which are similar to above. I can get the row number of the clicked button. Using this, how to remove all controls from this row.

Private Sub DeleteRow(ByVal sender As System.Object, ByVal e As System.EventArgs)
   Dim currentRow As Integer = CType(CType(sender, Button).Parent, TableLayoutPanel).GetRow(CType(sender, Button))
   'Using this currentRow, how to delete this Row
End Sub

Answer

Johann Blais picture Johann Blais · Jun 1, 2011

Basically you have to:

  • Get the list of controls from that row and delete them from the TLP
  • Remove the corresponding row style from the TLP
  • Set the new row index for every control in every row after the deleted one
  • Decrement the RowCount

Here is the VB.NET code to do the same.

Public Sub RemoveRow(ByRef panel As TableLayoutPanel, ByRef rowIndex As Integer)

    panel.RowStyles.RemoveAt(rowIndex)
    Dim columnIndex As Integer
    For columnIndex = 0 To panel.ColumnCount - 1
        Dim Control As Control = panel.GetControlFromPosition(columnIndex, rowIndex)
        panel.Controls.Remove(Control)
    Next
    Dim i As Integer
    For i = rowIndex + 1 To panel.RowCount - 1
        columnIndex = 0
        For columnIndex = 0 To panel.ColumnCount - 1
            Dim control As Control = panel.GetControlFromPosition(columnIndex, i)
            panel.SetRow(control, i - 1)
        Next
    Next
    panel.RowCount -= 1
End Sub

Here is a C# extension method that will do this for you.

public static void RemoveRow(this TableLayoutPanel panel, int rowIndex)
{
    panel.RowStyles.RemoveAt(rowIndex);

    for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++)
    {
        var control = panel.GetControlFromPosition(columnIndex, rowIndex);
        panel.Controls.Remove(control);
    }

    for (int i = rowIndex + 1; i < panel.RowCount; i++)
    {
        for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++)
        {
            var control = panel.GetControlFromPosition(columnIndex, i);
            panel.SetRow(control, i - 1);
        }
    }

    panel.RowCount--;
}