簡體   English   中英

LinkLabel Click事件在循環內被覆蓋

[英]LinkLabel Click event being overwritten within loop

這是一些示例代碼,表示我的問題。 它添加了5個LinkLabel ,每個都有一個Click事件處理程序。 標簽上的文本為1 ... 5,當單擊時應顯示相同的結果,但是當我單擊每個標簽時,每個標簽都顯示相同的消息:5。

就像最后一個處理程序正在覆蓋其他每個標簽上的處理程序一樣。 我以為我通過在循環的每次迭代中創建新的EventHandler和新的LinkLabel避免了這種情況。

我將每個LinkLabel添加到FlowLayoutPanel

為什么會得到此結果,如何解決?

List<Test> objects = new List<Test>();
for (int i = 0; i < 5; i++)
{
    objects.Add(new Test(i + 1));
}

foreach (Test t in objects)
{
    LinkLabel label = new LinkLabel();
    label.AutoSize = true;
    label.Text = t.a + "";

    label.Click += new EventHandler((sender, args) =>
    {
        MessageBox.Show(t.a + "");
    });

    flowLayoutPanel1.Controls.Add(label);
}

在我試圖重現您與您的代碼描述的問題,鏈接標簽15時,點擊,就像你希望顯示1至5分別。

這是一個獨立的示例,它最少地基於您發布的代碼(恰好在其構建和運行所需的程度上)...並且可以按預期工作:

// FORNOW: Added Main method for PoC.
void Main()
{
    // FORNOW: Added necessary Form and FlowLayoutPanel locals.
    Form form1 = new Form();
    FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();

    List<Test> objects = new List<Test>();
    for (int i = 0; i < 5; i++)
    {
        objects.Add(new Test(i + 1));
    }

    foreach (Test t in objects)
    {
        LinkLabel label = new LinkLabel();
        label.AutoSize = true;
        label.Text = t.a + "";

        label.Click += new EventHandler((sender, args) =>
        {
            MessageBox.Show(t.a + "");
        });

        flowLayoutPanel1.Controls.Add(label);
    }

    // FORNOW: Added necessary control wiring and display call.
    form1.Controls.Add(flowLayoutPanel1);
    form1.Show();
}

// FORNOW: Added a Test class based on the OP's code.
public class Test
{
    public int a { get; set; }

    public Test(int a)
    {
        this.a = a;
    }
}

您可能正在使用的其他代碼中有問題,但是根據您的期望,共享的代碼可以正常工作。

暫無
暫無

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

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