簡體   English   中英

如何正確地將事件分配給 c# Winforms 中動態創建的按鈕?

[英]How to properly assign events to dynamically created buttons in c# Winforms?

我的意圖是在運行時創建按鈕並訂閱它們的點擊事件處理程序。 一旦點擊了動態創建的按鈕,點擊事件處理程序就會被取消訂閱,這樣點擊事件只會觸發一次。

在運行時,僅當我創建一個按鈕並立即單擊它時,所需的行為才有效。 如果我創建了多個按鈕,那么只有最后一個創建的按鈕會取消訂閱 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++;
    }
}

因為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();

或者將它們保存到專用集合中(如果流面板有其他按鈕)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM