Удалить динамически созданные элементы

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

  1. Пытался при создании элементов создавать ссылки (*) и передавать в dictionary (не дал winforms ссылку на Button-объект "не удается неявно преобразовать тип system.windows.forms.button в int")

int * address;

address = &but_new_plus;

  1. Пытался через название удалять ("не удается преобразовать из string в system.windows.forms.control")

main_layout.Controls.Remove("but_new_plus" + "2");

  1. Только остался может вариант при создании каждого объекта вызывать какую-нть функцию этого же объекта, забирать у нее объект 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;
        }
    }
}
→ Ссылка