C# 用于循环的单触式添加按钮

C# 用于循环的单触式添加按钮,c#,xamarin.ios,xamarin,C#,Xamarin.ios,Xamarin,我使用以下代码在for循环中添加UIButtons: for (int i=0; i <12; i++) { button = new UIButton(new RectangleF(xBase + i * 25,100 + i,25,25)); button.SetBackgroundImage(UIImage.FromBundle ("Images/b.png"),UIControlState.Normal); button.TouchUpInside += (

我使用以下代码在for循环中添加UIButtons:

for (int i=0; i <12; i++) {
    button = new UIButton(new RectangleF(xBase + i * 25,100 + i,25,25));
    button.SetBackgroundImage(UIImage.FromBundle ("Images/b.png"),UIControlState.Normal);
    button.TouchUpInside += (s, e) => { 
        UIAlertView alert = new UIAlertView("",i.ToString(),null,"",null);
        alert.Show();
    };
    this.Add (button);
}
for(inti=0;i{
UIAlertView alert=new UIAlertView(“,i.ToString(),null,”,null);
alert.Show();
};
这个。添加(按钮);
}
问题是,我在单击按钮时得到的值是最后添加的按钮的值


如何解决这个问题?

这可能是因为C#中闭包中变量的性质。尝试将循环变量绑定到循环中的局部变量。您可能会找到一些相关信息

这可能是因为C#中闭包中变量的性质。尝试将循环变量绑定到loo中的局部变量p、 您可能会发现一些相关信息

您正在关闭循环变量。而C#中的循环变量是在循环之外定义的

您可以像这样修复代码

for (int i=0; i <12; i++) {
    button = new UIButton(new RectangleF(xBase + i * 25,100 + i,25,25));
    button.SetBackgroundImage(UIImage.FromBundle ("Images/b.png"),UIControlState.Normal);
    button.TouchUpInside += (s, e) => { 
        var j = i;
        UIAlertView alert = new UIAlertView("",j.ToString(),null,"",null);
        alert.Show();
    };
this.Add (button);
for(inti=0;i{
var j=i;
UIAlertView alert=new UIAlertView(“,j.ToString(),null,”,null);
alert.Show();
};
这个。添加(按钮);
}


希望您是在
for
循环中完成这项工作的,而不是在
foreach
,因为in
C#5
,但我不知道这项更改是否已经在mono 3.0.X系列中实现。

您正在关闭循环变量。而C#中的循环变量是在循环之外定义的

您可以像这样修复代码

for (int i=0; i <12; i++) {
    button = new UIButton(new RectangleF(xBase + i * 25,100 + i,25,25));
    button.SetBackgroundImage(UIImage.FromBundle ("Images/b.png"),UIControlState.Normal);
    button.TouchUpInside += (s, e) => { 
        var j = i;
        UIAlertView alert = new UIAlertView("",j.ToString(),null,"",null);
        alert.Show();
    };
this.Add (button);
for(inti=0;i{
var j=i;
UIAlertView alert=new UIAlertView(“,j.ToString(),null,”,null);
alert.Show();
};
这个。添加(按钮);
}

希望您是在
for
循环中完成这项工作的,而不是像在
C#5
中那样在
foreach
循环中完成的,但是我不知道mono 3.0.X系列中是否实现了这项更改