我目前正在尝试向标签数组添加特定操作,但变量仅保留在{}
之间。
_arr[i].Click += (a, b) => {
z++;
numarfinal = Convert.ToString(z);
MessageBox.Show(Convert.ToString(numarfinal));
};
外部{}
变量z
和numarfinal
均未发生变化,但MessageBox.Show
报告其参数已发生变化。
这是整个功能:
Label[] _arr = new Label[20];
Label[] _dinamic = new Label[20];
private static Random _r = new Random();
string numarfinal ;
private void button1_Click(object sender, EventArgs e)
{
int z=0;
int limita = Convert.ToInt16(textBox1.Text);
limita = int.Parse(textBox1.Text);
if (limita > 20)
textBox1.Text = "Do sth";
int randomnumber = _r.Next(20);
for(int i=0;i<limita;i++)
{
do
{
randomnumber = _r.Next(20);
} while (randomnumber==0);
_arr[i] = new Label();
_arr[i].Click += (a, b) =>
{
z++;
numarfinal= Convert.ToString(z);
MessageBox.Show(Convert.ToString(numarfinal));
};
_arr[i ].Text = Convert.ToString(randomnumber);
_arr[i ].Size = new Size(50,50);
_arr[i ].Location = new Point(55*i,60);
testlabel.Text = Convert.ToString(numarfinal); // the label value remain nothing (numarfinal's initial value)
this.Controls.Add(_arr[i]);
}
答案 0 :(得分:1)
问题是您设置testlabel.Text
一次,而numarfinal
的值仍然为空。单击其中一个标签并执行其事件处理程序时,numarfinal
的值会更改,但testlabel.Text
的值不会更改。
解决这个问题的一种方法是在事件处理程序lambda中设置testlabel.Text
:
_arr[i].Click += (a, b) =>
{
z++;
numarfinal = Convert.ToString(z);
testlabel.Text = numarfinal;
MessageBox.Show(Convert.ToString(numarfinal));
};
答案 1 :(得分:0)
正在更改标签的点击事件中的z值。如果要查看测试标签中的更改,则应在“单击事件”中更改其文本。如果你想在每次添加标签时更改numarfinal,你应该将你的代码放在点击事件之外,如果你想要每次点击标签时都需要进行numarfinal更改,那么你的代码就应该已经存在了。
答案 2 :(得分:0)
点击button1永远不会导致到达行numarfinal = Convert.ToString(z);
,因为您只有附加代理。当您为委托分配(a, b) => {...}
时,{}
中的代码不会被调用,直到实际引发相应的事件(即单击相应的标签)。