Удалить динамически созданные элементы
"плюс" добавляет новую строку в TableLayoutPanel и элементы.
Как кнопкой "минус" удалить строку и все элементы строки, на которой она была нажата, включая сам минус.

- Пытался при создании элементов создавать ссылки (*) и передавать в dictionary (не дал winforms ссылку на Button-объект "не удается неявно преобразовать тип system.windows.forms.button в int")
int * address;
address = &but_new_plus;
- Пытался через название удалять ("не удается преобразовать из string в system.windows.forms.control")
main_layout.Controls.Remove("but_new_plus" + "2");
- Только остался может вариант при создании каждого объекта вызывать какую-нть функцию этого же объекта, забирать у нее объект sender и где-то его сохранять. И по этому sender`у как-то удалить
Ответы (1 шт):
Автор решения: Сергей Глазырин
→ Ссылка
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
int row_number = 0; //у нас одна строка и счетчик строки начинается с одного
Dictionary<int, Object[]> dict_of_objs = new Dictionary<int, Object[]>(); //int - ряд, objects элементы
public Form1()
{
InitializeComponent();
}
// Кнопка ПЛЮС создает новые две кнопки ПЛЮС, МИНУС и ТЕКСТБОКС и помещает в новую строку таблицы
private void plus_but_Click(object sender, EventArgs e)
{
row_number++;
//создаем кнопку плюс
Button new_plus_but = new Button();
new_plus_but.Text = "+";
new_plus_but.Click += new System.EventHandler(plus_but_Click);
//создаем кнопку минус
Button new_minus_but = new Button();
new_minus_but.Text = "-";
new_minus_but.Tag = row_number; //в тег поместили номер строки. При удалении мы его получим и узнаем
//какой это ряд
new_minus_but.Click += new System.EventHandler(minus_but_Click);
//создаем текстбокс
TextBox new_textbox = new TextBox();
this.textbox.Size = new System.Drawing.Size(40, 20);
//Добавляем новую строку в таблицу устанавливаем высоту ряда 45
table.RowStyles.Add(new RowStyle(SizeType.Absolute, 40));
table.Size = new System.Drawing.Size(150, table.Height + 50); //увеличиваем общую высоту таблицы
table.Controls.Add(new_minus_but, 1, row_number);
table.Controls.Add(new_plus_but, 0, row_number);
table.Controls.Add(new_textbox, 2, row_number);
// созданные кнопки и бокс помещаем в массив которые затем помещаем в словарь
Object[] massive_objs = new Object[3] { new_plus_but, new_minus_but, new_textbox };
dict_of_objs.Add(row_number, massive_objs);
}
private void minus_but_Click(object sender, EventArgs e)
{
Control clicked_minus_but = (Control)sender; // sender - это ссылка на нашу кнопку которую нажали
int minus_tag = (int)clicked_minus_but.Tag; //а это tag который нам говорит в какой строке наша кнопка
//этот tag приходится явно превращать в тип int
var dict_massive_objs = dict_of_objs[minus_tag]; //получаем массив объектов по номеру ряда из словаря
int row_numb = 0;
//перебираем массив и удаляем элементы
int i = 0;
foreach(Control obj in dict_massive_objs)
{
if (i == 0) row_numb = table.GetRow(obj);
if (i <= 2) //удаляем кнопки и бокс
{
table.Controls.Remove(obj);
obj.Dispose();
}
i++;
}
//у строк таблицы меняем высоту на 1, чтобы скрыть
table.RowStyles[minus_tag].SizeType = SizeType.Absolute;
table.RowStyles[minus_tag].Height = 1;
}
}
}