将事件设置为数组c#中的对象

时间:2018-05-02 03:08:36

标签: c#

(标题中的措辞可能很糟糕)

我有一系列标签,我想添加鼠标输入,并在这些标签上留下事件。

此标签以编程方式创建:

            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;};

都没有工作。

2 个答案:

答案 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;
}