Удалить элементы на Panel
Цитата: Molod от 11.11.2020, 18:26Добрый день.
Есть задание: Написать программу, которая при щелчке мыши на элементе управления Panel добавляет в него кнопки Button, а при щелчке на форме в нее добавляются поля ввода TextBox. Предусмотреть возможность вывода количества кнопок и текстовых полей. При щелчке правой кнопкой мыши удалить элементы на Panel.
Помогите реализовать "При щелчке правой кнопкой мыши удалить элементы на Panel."
[spoiler]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; }[/spoiler]
Добрый день.
Есть задание: Написать программу, которая при щелчке мыши на элементе управления 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;
}
Цитата: Вася от 11.11.2020, 21:28Привет!
Вместо событияClickдля панели используйте событиеMouseClick
[spoiler]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; } }[/spoiler]
Привет!
Вместо события Скопировано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 от 12.11.2020, 22:33Ошибка CS1061 "EventArgs" не содержит определения "Button", и не удалось найти доступный метод расширения "Button", принимающий тип "EventArgs" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Скриншот.
[MNotice]Публикуйте прямые ссылки на картинки[/MNotice]
Ошибка CS1061 "EventArgs" не содержит определения "Button", и не удалось найти доступный метод расширения "Button", принимающий тип "EventArgs" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Скриншот.
Комментарий модератора:
Публикуйте прямые ссылки на картинки
Цитата: Сергей от 12.11.2020, 22:48Добрый вечер 🖐
Дело в том, что Ты объявляешь кнопку только вelse. А нужно передif.
Добрый вечер 🖐
Дело в том, что Ты объявляешь кнопку только в Скопированоelse. А нужно перед Скопированоif.
Цитата: Вася от 13.11.2020, 00:28Molod, у Вас в методе
panel1_MouseClickвторой аргументEventArgs. Если вы устанавливали событие в окне свойств, то он должен бытьMouseEventArgs, как в том коде, что Я кидал.Или, как вариант, замените
if (e.Button == MouseButtons.Right)наif (((MouseEventArgs)e).Button == MouseButtons.Right)Сергей, в данном случаи,
Buttonэто свойство объектаeклассаMouseEventArgs.
Molod, у Вас в методе Скопированоpanel1_MouseClick второй аргумент СкопированоEventArgs. Если вы устанавливали событие в окне свойств, то он должен быть СкопированоMouseEventArgs, как в том коде, что Я кидал.
Или, как вариант, замените Скопированоif (e.Button == MouseButtons.Right) на Скопированоif (((MouseEventArgs)e).Button == MouseButtons.Right)
Сергей, в данном случаи, СкопированоButton это свойство объекта Скопированоe класса СкопированоMouseEventArgs.
Цитата: Сергей от 13.11.2020, 00:28Привет, Вася 🖐
Спасибо за внимательность 👍
Привет, Вася 🖐
Спасибо за внимательность 👍