foreach循环内的委托方法始终绑定到最后一个项目[复制](delegate method ins

2019-10-17 01:22发布

可能重复:
C#:使用foreach循环迭代变量在lambda表达式-为什么失败?

我有增加了一些按键自定义控制的方法。 我想每个按钮有一个事件处理程序,将弹出一个消息框,显示有关该按钮的细节。

我写了下面的代码,但一切,我将添加有关显示在最后一个按钮的详细信息按钮List<Pin> ...我如何添加单击事件hadnler与各自的每个按钮pin对象?

        public void Populate(List<Pin> pins)
    {
        _pins = pins;

        var count = _pins.Count;
        var location = new Point(5, 5);

        foreach (var pin in _pins)
        {
            var button = new Button();
            button.Text = pin.Name;
            button.Name = "buttonPin_" + pin.Name;
            button.Click += delegate
            {
                MessageBox.Show(pin.Name + Environment.NewLine + pin.Batch);
            };
            button.Size = new Size(30, 30);
            button.Location = location;
            location.X += 30;

            if (location.X > Width) location = new Point(5, location.Y + 35);

            Controls.Add(button);
        }
    }

Answer 1:

button.Tag = pin;
button.Click += MyHandler;

void MyHandler(object sender, EventArgs e)
{
    var pin = (Pin)sender.Tag;
}

或作为拉姆达:

button.Tag = pin;
button.Click += (s, e) =>
{
    var pin = (Pin)s.Tag;
};


文章来源: delegate method inside foreach loop always binds to last item [duplicate]