Member 13462842 Ответов: 2

Как динамически удалить кнопку в форме


public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button b = new Button();
            b.Text = "button2";
            
            Controls.Add(b);
            b.Click += Hello;
            
        }

      

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


как удалить button2 после отображения "Hello World"?

Что я уже пробовал:

b.Dispose();


сначала он не отображает кнопку.

Спасибо!

2 Ответов

Рейтинг:
9

lukeer

Нет необходимости искать кнопку, так как она уже известна в своем собственном обработчике щелчков:

private void Hello(object sender, EventArgs e)
{
    MessageBox.Show("hello World");
    
    Button thisButton = sender as Button;
    if(thisButton != null)
    {
        thisButton.Click -= Hello;
        Controls.Remove(thisButton);
    }
}
Отказ от ответственности: код не тестировался ни в коем случае, никакой конкретной цели, вы все это знаете.


Рейтинг:
17

OriginalGriff

Чтобы удалить его, вы должны сначала удалить его из коллекции элементов управления!
Это сложно с вашим существующим кодом, потому что если это не единственная кнопка в вашей форме (а это не так), вам будет трудно определить, какую кнопку Удалить!

Попробовать это:

public Form1()
{
    InitializeComponent();
}
private List<Button> buttons = new List<Button>();
private void button1_Click(object sender, EventArgs e)
{
    Button b = new Button();
    b.Text = "button2";
    
    Controls.Add(b);
    buttons.Add(b);
    b.Click += Hello;
    
}

private void RemoveButtons()
{
    foreach (Button b in buttons)
    {
        Controls.Remove(b);
        b.Click -= Hello;
    }
    buttons.Clear();
}

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


Member 13462842

почему он работает и без
1. b.нажмите-=Привет
2. пуговицы.Четкий();
нужны ли они?

OriginalGriff

Да.
Первый удаляет обработчик событий, так что сборщик мусора может утилизировать элемент управления, если это необходимо. Строго говоря, вам это не нужно для небольших тестовых приложений, но это хорошая идея использовать хорошие практики даже для небольших проектов - так вы не забудете и не попадетесь с большими!
Второй удаляет кнопки из списка, так что если вы снова вызовете метод RemoveButtons, вы не будете пытаться удалить кнопки, с которыми уже имели дело.