Удаление определенной строки в TableLayoutPanel - программирование
Подтвердить что ты не робот

Удаление определенной строки в TableLayoutPanel

У меня есть TableLayoutPanel, что я программно добавляю строки в. Пользователь в основном запускает Свойство, а затем отображается в таблице вместе с некоторыми элементами управления. Я думаю, что у меня есть общая проблема понимания, и я попытаюсь это объяснить.

Один из элементов управления в каждой строке - кнопка "удалить". Эта кнопка должна удалить строку, в которой она находится. Что я сделал, это добавить обработчик событий к кнопке и установить текущую строку.

deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);

Код обработчика:

private void buttonClickHandler(int rowCount)
{
    int count = rowCount - 1;
    for (int i = count; i < (count + 5); i++)
    {
        balanceTable.Controls.RemoveAt(count);
    }
    balanceTable.RowStyles.RemoveAt(count);
    balanceTable.RowCount--;

}

Я смотрел на него часами и играл. Но я не могу найти эффективное решение. Я также довольно новичок в С#

Здесь полная функция, которая создает новую строку:

private void addBalanceItems(ToolStripMenuItem item)
{
    int numberOfRows = balanceTable.RowCount;
    if (numberOfRows > 1)
    {
        balanceTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.AutoSize));

    }
    balanceTable.Height = numberOfRows * 45;
    Steigerungsrechner rechner = new Steigerungsrechner();
    string tag = item.Tag.ToString();

    //change that asap :(
    if (tag == "A") { rechner.column = 1; }
    if (tag == "B") { rechner.column = 2; }
    if (tag == "C") { rechner.column = 3; }
    if (tag == "D") { rechner.column = 4; }
    if (tag == "E") { rechner.column = 5; }
    if (tag == "F") { rechner.column = 6; }
    if (tag == "G") { rechner.column = 7; }
    if (tag == "H") { rechner.column = 8; }

    Label talentName = new Label();
    talentName.Text = item.Text;
    talentName.Height = standardHeight;
    talentName.TextAlign = ContentAlignment.MiddleLeft;
    talentName.AutoSize = true;
    Label cost = new Label();
    cost.TextChanged += (sender, e) => costChangeHandler(cost);
    cost.Height = standardHeight;
    cost.TextAlign = ContentAlignment.MiddleLeft;
    TextBox startValue = new TextBox();
    startValue.TextChanged += (sender, e) => startValueChangeHandler(rechner, startValue, cost);
    startValue.Height = standardHeight;
    startValue.TextAlign = HorizontalAlignment.Center;
    TextBox endValue = new TextBox();
    endValue.TextChanged += (sender, e) => endValueChangeHandler(rechner, endValue, cost);
    endValue.Height = standardHeight;
    endValue.TextAlign = HorizontalAlignment.Center;
    Button deleteTalent = new Button();
    deleteTalent.Text = "x";
    deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
    deleteTalent.Height = standardHeight;

    balanceTable.Controls.Add(talentName);
    balanceTable.Controls.Add(startValue);
    balanceTable.Controls.Add(endValue);
    balanceTable.Controls.Add(cost);
    balanceTable.Controls.Add(deleteTalent);
    balanceTable.Visible = true;
    balanceTable.RowCount++;
}

Любая помощь будет принята с благодарностью!:)

4b9b3361

Ответ 1

Да, удаление произвольной строки из TableLayoutPanel совсем не интуитивно. Они действительно испортили дизайн на этом.

Единственный способ удалить строки - установить свойство RowCount. Это одно достаточно странно; это свойство кажется, что он должен быть доступен только для чтения и код, который делает это выглядит неправильно для меня каждый раз, когда я его вижу.

Но помимо этого, следствием этого дизайна является то, что вы не можете удалять строки из середины. Сброс свойства RowCount приведет к тому, что строки будут удалены снизу.

Обходной путь немного громоздкий, с несколькими шагами, чтобы ошибиться:

  • Удалите элементы управления из строки, которую вы хотите удалить.
  • Если применимо, переместите эти элементы управления в другую строку.
  • Переместите все элементы управления в других строках, которые появляются после строки, которую вы хотите удалить до строки.
  • Наконец, удалите последнюю строку, уменьшив значение свойства RowCount.

Быстрый поиск в Google показывает, что у кого-то есть письменный и общий код, предназначенный для этого. Это в VB.NET, но это должно быть легко переведено в ваш родной диалект.

Я признаю, что мне известно, что я просто punt и установите RowHeight строки, которую я хочу "удалить", на 0. Таким образом, автоматизация делает работу для вас. Вероятно, вы все же хотите удалить элементы управления, которые он содержит.

Ответ 2

Вот статический класс, который может помочь вам удалить любую строку по его индексу:

using System.Windows.Forms;

public static class TableLayoutHelper
{
    public static void RemoveArbitraryRow(TableLayoutPanel panel, int rowIndex)
    {
        if (rowIndex >= panel.RowCount)
        {
            return;
        }

        // delete all controls of row that we want to delete
        for (int i = 0; i < panel.ColumnCount; i++)
        {
            var control = panel.GetControlFromPosition(i, rowIndex);
            panel.Controls.Remove(control);
        }

        // move up row controls that comes after row we want to remove
        for (int i = rowIndex + 1; i < panel.RowCount; i++)
        {
            for (int j = 0; j < panel.ColumnCount; j++)
            {
                var control = panel.GetControlFromPosition(j, i);
                if (control != null)
                {
                    panel.SetRow(control, i - 1);
                }
            }
        }

        var removeStyle = panel.RowCount - 1;

        if (panel.RowStyles.Count > removeStyle)
            panel.RowStyles.RemoveAt(removeStyle);

        panel.RowCount--;
    }
}

Стоит упомянуть одну вещь: элементы управления, которые мы получаем через panel.GetControlFromPosition(...) должны быть видимыми, иначе они будут возвращать null вместо невидимых элементов управления.

Ответ 3

Удаление полной таблицы -

tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.RowStyles.Clear();

Установите ваш заголовок в таблице снова -

            tableLayoutPanel.RowCount = 1;
            tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
            tableLayoutPanel.Controls.Add(new Label() { Text = "MONTH", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 0, tableLayoutPanel.RowCount - 1);
            tableLayoutPanel.Controls.Add(new Label() { Text = "YEAR", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 1, tableLayoutPanel.RowCount - 1);
            tableLayoutPanel.Controls.Add(new Label() { Text = "MEASURED WAFERS", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 2, tableLayoutPanel.RowCount - 1);

3 столбца - 1 строка

Может быть, кто-то может использовать мои коды, правильно работает...

Ответ 4

Сначала удалить существующие элементы управления rowCount

for(int i = 0; i < panel.ColumnCount; i++){
     Control Control = panel.GetControlFromPosition(i, rowCount);
     panel.Controls.Remove(Control);
  }

Затем удалите строку

panel.RowStyles.RemoveAt(rowCount-1);

Ответ 5

Вы не можете полностью удалить строку на tablelayoutpanel, но есть обходной путь:

  • Удалите все элементы управления в строке, проще, если вы знаете имена элементов управления, потому что вы можете вызвать метод dispose.
  • Задайте высоту строки, возможно, 2px, используя метод стиля строки (например, tablelayoutpanel1.Rowstyle(index).height=2)

Для меня это удивило, что строка была полностью свернута в строку независимо от индекса строки.