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
Basically you have to:
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--;
}
In addition to Johann and emaillenin's answers you should change the following line
panel.SetRow(control, i - 1);
To this
if (control != null) panel.SetRow(control, i - 1);
Empty fields and also spanned controls will throw an error here if theres no check for null.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With