![](/img/trans.png)
[英]difference between LinkLabel.Click and LinkLabel.LinkClicked event?
[英]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);
}
在我試圖重現您與您的代碼描述的問題,鏈接標簽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;
}
}
您可能正在使用的其他代碼中有問題,但是根據您的期望,共享的代碼可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.