Вы должны войти, чтобы создавать сообщения и темы.

Удалить элементы на Panel

Добрый день.

Есть задание: Написать программу, которая при щелчке мыши на элементе управления Panel добавляет в него кнопки Button, а при щелчке на форме в нее добавляются поля ввода TextBox. Предусмотреть возможность вывода количества кнопок и текстовых полей. При щелчке правой кнопкой мыши удалить элементы на Panel.

Помогите реализовать "При щелчке правой кнопкой мыши удалить элементы на Panel."

Спойлер

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Random rnd = new Random();
        int b_k = 0;
        int b_t = 0;
        private void panel1_Click(object sender, EventArgs e)
        {
            Button b = new Button();
            b.Parent = panel1;
            b.BackColor = Color.White;
            b.Location = new Point(Convert.ToInt32(rnd.Next(0, 320)), Convert.ToInt32(rnd.Next(0, 220)));
            label3.Text = "кнопок = " + ++b_k;
           
           //хотел сделать удаление Button для начало, но ничего не вышло
            if (e.Button == MouseButtons.Right)
                foreach (Control c in Controls)
                {
                    if (c is Button) this.Controls.Remove(c);
                }
        }
        //
        private void Form1_Click(object sender, EventArgs e)
        {
            TextBox t = new TextBox();
            t.Parent = panel1;
            t.BackColor = Color.Green;
            t.Location = new Point(Convert.ToInt32(rnd.Next(0, 320)), Convert.ToInt32(rnd.Next(0, 220)));
            label2.Text = "тексовых полей = " + ++b_t;
        }

 

Привет!
Вместо события СкопированоClick для панели используйте событие СкопированоMouseClick

Спойлер

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        // Сначала писал через foreach, но почему то удаляло не все элементы
        //foreach(Control control in panel1.Controls)
        //{
        //    panel1.Controls.Remove(control);
        //}

        // Вот так работает, удаляет все элементы
        panel1.Controls.OfType<Control>().ToList().ForEach(control => panel1.Controls.Remove(control));

        label2.Text = $"тексовых полей = {b_t = 0}";
        label3.Text = $"кнопок = {b_k = 0}";
    }
    else
    {
        Button b = new Button();
        b.Parent = panel1;
        b.BackColor = Color.White;
        b.Location = new Point(Convert.ToInt32(rnd.Next(0, 320)), Convert.ToInt32(rnd.Next(0, 220)));
        label3.Text = "кнопок = " + ++b_k;
    }
}

Лайкнул Molod
Molod

Ошибка CS1061 "EventArgs" не содержит определения "Button", и не удалось найти доступный метод расширения "Button", принимающий тип "EventArgs" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Скриншот.


Комментарий модератора:
Публикуйте прямые ссылки на картинки

Добрый вечер 🖐
Дело в том, что Ты объявляешь кнопку только в Скопированоelse. А нужно перед Скопированоif.

Molod, у Вас в методе Скопированоpanel1_MouseClick второй аргумент СкопированоEventArgs. Если вы устанавливали событие в окне свойств, то он должен быть СкопированоMouseEventArgs, как в том коде, что Я кидал.

Или, как вариант, замените Скопированоif (e.Button == MouseButtons.Right) на Скопированоif (((MouseEventArgs)e).Button == MouseButtons.Right)

Сергей, в данном случаи, СкопированоButton это свойство объекта Скопированоe класса СкопированоMouseEventArgs.

Лайкнул Molod
Molod

Привет, Вася 🖐
Спасибо за внимательность 👍

Вася,
Спасибо)