这里有一些表示我问题的示例代码。它添加了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);
}
答案 0 :(得分:1)
在我尝试重现您使用代码描述的问题时,链接标签 1 到 5 分别按照您想要的方式单击显示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;
}
}
您可能在使用的其他代码中遇到问题,但您分享的代码会根据您所说的内容正常工作。