LinkLabel单击事件在循环中被覆盖

本文关键字:覆盖 循环 单击 事件 LinkLabel | 更新日期: 2023-09-27 18:26:29

这里有一些示例代码,说明了我的问题。它添加了5个LinkLabel,每个都有一个Click事件处理程序。标签上的文本是1…5,点击时应该会显示相同的结果,但当我点击每个标签时,我会得到每个标签相同的消息:5。

这就像最后一个处理程序正在覆盖其他每个标签上的处理程序一样。我想我通过在循环的每次迭代中创建一个新的EventHandlerLinkLabel来避免这种情况。

我将每个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);
}

LinkLabel单击事件在循环中被覆盖

在我试图重现您用代码描述的问题时,链接标签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;
    }
}

您可能在使用的其他代码中有问题,但根据您所说的预期,您共享的代码运行良好。