Удаление определенной строки в TableLayoutPanel
у меня есть TableLayoutPanel, к которому я программно добавляю строки. Пользователь в основном выбирает свойство, которое затем отображается в таблице вместе с некоторыми элементами управления. Я думаю, что у меня есть общая проблема понимания здесь, и я попытаюсь объяснить это.
одним из элементов управления в каждой строке является кнопка "Удалить". Эта кнопка должна удалить строку, в которой она находится. То, что я сделал, это добавить eventhandler к кнопке и установить текущий счет строк.
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--;
}
Я смотрел на него часами и играл. Но я не могу найти работающего чистого решения. Я также довольно новичок в C#
вот функция, которая создает новую строку:
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++;
}
любая помощь была бы очень признательна! :)
5 ответов
да, удаление произвольной строки из TableLayoutPanel-это не все интуитивно понятный. Они действительно испортили дизайн этого.
единственный способ удалить строки-установить RowCount
собственность. Это само по себе достаточно странно; это свойство, конечно, кажется, что оно должно быть только для чтения и код, который делает это, выглядит неправильно для меня каждый раз, когда я его вижу.
но помимо этого, последствием этой конструкции является то, что вы не можете удалить строки с середины. Сброс RowCount
свойство просто приведет к тому, что строки будут обрезаны снизу.
обходной путь немного громоздкий, с несколькими шагами, чтобы ошибиться:
- удалить элементы из строки, которую вы хотите удалить
- если применимо, переместите эти элементы управления в другую строку.
- переместить все элементы в других строках, которые приходят после строку, которую вы хотите удалить строку.
- наконец, удалите последний строка путем уменьшения значения
RowCount
собственность.
быстрый поиск Google показывает, что кто-то письменный и общий код предназначенных для этого. Оно внутри VB.NET, но это должно быть перевода на ваш родной диалект.
Я признаю, что я был известен просто punt и установить RowHeight
из строки Я хочу "удалить" до 0. Таким образом, autosizing делает работу за вас. Вы, вероятно, все еще хотите удалить однако он содержит элементы управления.
код для удаления строки в заданной позиции приведен ниже. Одна вещь, чтобы упомянуть: элементы управления, которые мы получаем с помощью панели.GetControlFromPosition(...) должен быть видимым или иначе он будет возвращать null вместо невидимых элементов управления.
public void remove_row(TableLayoutPanel panel, int row_index_to_remove)
{
if (row_index_to_remove >= 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, row_index_to_remove);
panel.Controls.Remove(control);
}
// move up row controls that comes after row we want to remove
for (int i = row_index_to_remove + 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);
}
}
}
// remove last row
panel.RowStyles.RemoveAt(panel.RowCount - 1);
panel.RowCount--;
}
удалить существующие элементы rowCount
сначала
for(int i = 0; i < panel.ColumnCount; i++){
Control Control = panel.GetControlFromPosition(i, rowCount);
panel.Controls.Remove(Control);
}
затем удалить строку
panel.RowStyles.RemoveAt(rowCount-1);
удаление заполните таблицу -
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.RowStyles.Clear();
Set код заголовок таблицы снова -
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 Строка
возможно, кто-то может использовать мой codesnipped, работает хорошо...
вы не можете полностью удалить строку с tablelayoutpanel
но есть обходной путь:
- удалить все элементы управления в строке, проще, если вы знаете имена элементов управления причиной можно вызвать метод dispose.
- установите высоту строки в maybe
2px
использование метода стиля строки (например,tablelayoutpanel1.Rowstyle(index).height=2
)
для меня это сработало чудеса, строка была полностью свернута строка независимо от индекса строки.