【问题标题】:c# for-loop and Click Event Handlerc# for-loop 和 Click 事件处理程序
【发布时间】:2016-07-16 11:53:01
【问题描述】:

如何在每次迭代中使用一个单独的事件处理程序,而无需对函数进行硬编码?

for (int i = 0; i < 100; i++)
{
        //other code
        PictureBox listItem = new PictureBox();
        listItem.Click += new EventHandler((sender2, e2) => ListItemClicked(i));
        //other code     
}

private void ListItemClicked(int index)
{
    MessageBox.Show(index.ToString());
}

【问题讨论】:

  • 您已经在每次迭代中使用了一个处理程序,不是吗?你能解释一下吗?
  • 是的,我知道,但是 ListItemClicked() 函数只显示索引 100(最后一个索引),无论我单击哪个 listItem。

标签: c# picturebox eventhandler


【解决方案1】:

您需要将您的迭代器复制到一个局部变量中,以便委托正确捕获它:

for (int i = 0; i < 100; i++)
{
        var idx = i;
        //other code
        PictureBox listItem = new PictureBox();
        listItem.Click += new EventHandler((sender2, e2) => ListItemClicked(idx));
        //other code     
}

在您的原始代码中,委托说“返回变量的当前值”,即 100。不是:“创建时的值”。 阅读闭包以获得对此的深入解释。我会深入推荐 Jon Skeets C#。

在 c# 5.0 中,这已针对 foreach 循环进行了更改,而不是 for i; 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多