Есть ли способ удалить все элементы управления из строки в TableLayoutPanel? - PullRequest
8 голосов
/ 01 июня 2011

Я генерирую элементы управления для 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 ]

20 голосов
/ 01 июня 2011

В основном вам необходимо:

  • Получить список элементов управления из этой строки и удалить их из TLP
  • Удалить соответствующий стиль строки из TLP
  • Установите новый индекс строки для каждого элемента управления в каждой строке после удаленной
  • Уменьшите RowCount

Вот код VB.NET, который делает то же самое.1014 *

Вот метод расширения 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--;
}
3 голосов
/ 11 августа 2011

В дополнение к ответам Иоганна и emaillenin вы должны изменить следующую строку

    panel.SetRow(control, i - 1);

К этому

    if (control != null) panel.SetRow(control, i - 1);

Пустые поля, а также составные элементы управления вызовут здесь ошибку, если нет проверки на ноль.

0 голосов
/ 12 февраля 2013

Зачем столько тяжелой работы ... использование tableLayoutpanel1.Controls.Clear ()

Это очистит содержимое панели таблицы

...