繁体   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