(标题中的措辞可能很糟糕)
我有一系列标签,我想添加鼠标输入,并在这些标签上留下事件。
此标签以编程方式创建:
Label [] lblData = new Label[255];
int calcLoc = 0;
for (int i = 0; i <= 200; i++)
{
calcLoc = 25 * i;
lblData[i] = new Label();
lblData[i].Location = new Point(10, calcLoc);
lblData[i].Text = "Test " + i;
InfoPanel.Controls.Add(lblData[i]);
}
我尝试过的事情: 在循环中设置事件(显然无法正常工作)
lblData[i].MouseEnter += (sender, e) => {lblData[i].BackColor = Color.LightBlue;};
在循环之前设置事件(认为这可能有机会)
lblData[].MouseEnter += (sender, e) => {lblData[].BackColor = Color.LightBlue;};
都没有工作。
答案 0 :(得分:3)
这个怎么样?
Label[] lblData = new Label[255];
int calcLoc = 0;
for (int i = 0; i <= 200; i++)
{
calcLoc = 25 * i;
Label label = new Label();
label.Location = new Point(10, calcLoc);
label.Text = "Test " + i;
label.MouseEnter += (sender, e) =>
{
label.BackColor = Color.LightBlue;
};
InfoPanel.Controls.Add(label);
lblData[i] = label;
}
甚至这个:
Label[] lblData =
Enumerable
.Range(0, 201)
.Select(i =>
{
var calcLoc = 25 * i;
Label label = new Label();
label.Location = new Point(10, calcLoc);
label.Text = "Test " + i;
label.MouseEnter += (sender, e) =>
{
label.BackColor = Color.LightBlue;
};
InfoPanel.Controls.Add(label);
return label;
})
.ToArray();
答案 1 :(得分:2)
您可以使用单个方法和sender
参数。这是最小变化的代码。您可以使用独立的静态方法代替所有事件,只需检查sender
。
lblData[i].MouseEnter += (sender, e) => {((Label)sender).BackColor = Color.LightBlue;};
更安全,版本稍微快一点,所有Label
个实例都可以在下面订阅。
静态方法更适合性能,原因我不会进入,您可以避免使用闭包,这可以确保事件是由Label
触发的。
private static void label_MouseEnter(object sender, EventArgs e)
{
var label = sender as Label;
if (label == null)
return;
label.BackColor = Color.LightBlue;
}