Удаление определенной строки в 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++;
}
Любая помощь будет принята с благодарностью!:)
Ответы
Ответ 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
)
Для меня это удивило, что строка была полностью свернута в строку независимо от индекса строки.