Как правильно назначать события динамически создаваемым кнопкам в c # Winforms? - PullRequest
0 голосов
/ 31 октября 2019

Мое намерение состоит в том, чтобы создавать кнопки во время выполнения и подписывать обработчик событий щелчка. После того, как динамически созданная кнопка нажата, обработчик события click отменяется, так что событие click срабатывает только один раз.

Во время выполнения желаемое поведение работает, только если я создаю одну кнопку и сразу же нажимаю на нее. Если я создаю более одной кнопки, то только событие последней созданной кнопки отменяет подписку на событие click. Я что-то пропустил?

public partial class Form1 : Form
{
    Button b;
    int counter;

    public Form1()
    {
        InitializeComponent();
    }

    // create more buttons
    private void button1_Click(object sender, EventArgs e)
    {
        b = new Button();
        b.Size = new Size(50, 50);
        b.Click += b_Click; // dynamic button click event
        this.Controls["flowLayoutPanel"].Controls.Add(b);

    }

    // dynamic button click eventhandler
    void b_Click(object sender, EventArgs e)
    {
        b.Text = counter.ToString();
        b.Click -= b_Click;
        counter++;
    }
}

1 Ответ

2 голосов
/ 31 октября 2019

Поскольку элемент b будет ссылаться на последнюю созданную динамическую кнопку, поэтому нажатие любой кнопки удалит обработчик события щелчка для кнопки, на которую имеется ссылка в данный момент, в переменной b, которая будет создана в последний раз.

Использовать senderполучить доступ к экземпляру «текущей» кнопки и удалить обработчик событий щелчка только из «текущей» кнопки.

void b_Click(object sender, EventArgs e)
{
    var button = sender As Button;
    button.Text = counter.ToString();
    button.Click -= b_Click;
    counter++;
}

Не использовать закрытый член для динамической кнопки, но локальную переменную

private void button1_Click(object sender, EventArgs e)
{
    var button = new Button();
    button.Size = new Size(50, 50);
    button.Click += b_Click;
    this.Controls["flowLayoutPanel"].Controls.Add(button);
}

Если вам нужно где-то сослаться на коллекцию созданной кнопки, вы можете получить к ним доступ из элементов управления панели управления, где были добавлены кнопки

var dynamicButtons = . 
    this.Controls["flowLayoutPanel"].Controls.OfType<Button>().ToList();

Или сохранить их в выделенной коллекции (в случае, если на панели управления есть другие кнопки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...