Есть ли способ удалить все элементы управления из строки в TableLayoutPanel?
я генерирую элементы управления для tablelayoutpanel динамически. У меня есть кнопка "удалить" в каждой строке. Когда я нажимаю на это, эта строка должна быть удалена.
Dim removeBtn As New Button
AddHandler removeBtn.Click, AddressOf DeleteRow
tlp.Controls.Add(removeBtn, 5, rowCount)
Я не показал код для добавления текстовых полей, которые похожи на выше. Я могу получить номер строки нажатой кнопки. Используя это, как удалить все элементы из этой строки.
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
3 ответов
в основном вы должны:
- получить список элементов управления из этой строки и удалить их из TLP
- удалите соответствующий стиль строки из TLP
- установите новый индекс строки для каждого элемента управления в каждой строке после удаленного
- уменьшить количество строк
вот VB.NET код, чтобы сделать то же самое.
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
вот метод расширения C#, который сделает это за вас.
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--;
}
в дополнение к ответам Иоганна и эмайленина вы должны изменить следующую строку
panel.SetRow(control, i - 1);
этой
if (control != null) panel.SetRow(control, i - 1);
пустые поля, а также охватываемые элементы управления выдадут ошибку здесь, если нет проверки на null.
Почему это много тяжелой работы... Использовать tableLayoutpanel1.Контроли.Clear ()
это очистит содержимое панели таблицы