ZPS769 Ответов: 5

Как удалить кнопку во время выполнения ?


Посмотрите на этот пример, мы создаем кнопку myNewButton во время выполнения, нажав кнопку MyExistingButton .
Как мы можем удалить myNewButton, нажав другую кнопку после того, как мы создали?

private void MyExistingButton_Click(object sender, EventArgs e)
    {
    Button myNewButton = new Button();
    myNewButton.Text = "ClickMe";
    myNewButton.Location = new Point((Width - myNewButton.Width) / 2, (Height - myNewButton.Height) / 2);
    myNewButton.Click += new EventHandler(myNewButton_Click);
    Controls.Add(myNewButton);
    }
void myNewButton_Click(object sender, EventArgs e)
    {
    MessageBox.Show("Hello World!");
    }

5 Ответов

Рейтинг:
36

DaveyM69

контроль.ControlCollection (свойство Controls) также имеет метод Remove, который вы можете использовать.
Дрессировка[^]


Sergey Alexandrovich Kryukov

Это лучше, моя 5,
--СА

Рейтинг:
36

JF2015

Просто чтобы удалить его из списка элементов управления, фактически не разрушая объект button:

Button myNewButton = new Button();
private void MyExistingButton_Click(object sender, EventArgs e)
{
  myNewButton.Text = "ClickMe";
  myNewButton.Location = new Point((Width - myNewButton.Width) / 2, (Height - myNewButton.Height) / 2);
  myNewButton.Click += new EventHandler(myNewButton_Click);
  Controls.Add(myNewButton);
}

void myNewButton_Click(object sender, EventArgs e)
{
  MessageBox.Show("Hello World!");
}

private void MyExistingButton2_Click(object sender, EventArgs e)
{
  if(Controls.Contains(myNewButton))
    Controls.Remove(myNewButton);
}


ZPS769

Не совсем так, но после того, как я увидел эти 3 ответа, я понял решение .
спасибо всем вам

Sergey Alexandrovich Kryukov

Вы тоже предполагаете, что родительский элемент управления-это форма или элемент управления, объявляющий методы, которые вы публикуете здесь.
Даже если это и так, то только из-за неряшливости компоновки. Обычно такие элементы управления размещаются на одних и тех же панелях и т. д. Достаточно просто указать на API.

Кроме того, обратите внимание на Соглашения об именах: такие имена, как "myNewButton_Click", берутся из кода, автоматически сгенерированного дизайнером. Это не означает, что они должны использоваться: даже если они генерируются Microsoft, такое имя нарушает Соглашения об именовании Microsoft, всегда должно быть переименовано. Но мой лучший совет-никогда не генерировать обработчики событий автоматически, это не ускоряет разработку (но является источником многих путаниц), самый простой и поддерживаемый способ-использовать анонимные делегаты (начиная с C# V. 2).

(Я не голосовал.)
--СА

Espen Harlinn

Хороший ответ :)

Abhinav S

Хороший ответ. 5.

Рейтинг:
2

Member 12772963

Если вы хотите удалить все элементы управления просто используйте

Controls.Clear()


Рейтинг:
17

Manas Bhardwaj

Давайте сделаем это шаг за шагом:
1.) вместо того чтобы объявлять myNewButton локальной переменной, сделайте ее глобальной переменной. (Я бы предпочел создать класс, который будет хранить мои динамические элементы управления)
2.) Теперь в каком-то другом событии (что бы это ни было) вы можете удалить/удалить его из элементов управления[^].

if(Controls.Contains(myNewButton ))
{
  Controls.Remove(myNewButton );
}


Sergey Alexandrovich Kryukov

Манас, достаточно было бы просто срезать код.
Вы играете с глобальной/локальной переменной или классом для хранения элементов управления-все напрасно: это все равно не настоящее приложение; и все переменные кнопки объявлены в форме и видны в точке вызова; странно, что вы не позаботились о родителе: код выглядит так, как будто вы вызываете родительский метод. Почему? вы не должны предполагать, что родитель-это форма.
--СА

Рейтинг:
1

ZPS769

public Form1()
        {
            InitializeComponent();
            
        }
        Button myNewButton;

        private void MyExistingButton_Click(object sender, EventArgs e)
        {
            if (!(this.Controls.Contains(myNewButton)))
            {
                myNewButton = new Button();
                myNewButton.Text = "ClickMe";
                myNewButton.Location = new Point((Width - myNewButton.Width) / 2, (Height - myNewButton.Height) / 2);
                myNewButton.Click += new EventHandler(myNewButton_Click);
                Controls.Add(myNewButton);
            }
        }
        void myNewButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello World!");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.Controls.Contains(myNewButton))
            {
                this.Controls.Remove(myNewButton);
            }
        }


Sergey Alexandrovich Kryukov

Ты понял.
--СА