0

我目前正在尝试向标签数组添加特定操作,但变量仅保留在{}.

_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]);
}
4

3 回答 3

1

问题是您设置testlabel.Text了一次,而值numarfinal仍然为空。当单击其中一个标签并执行其事件处理程序时,值numarfinal会更改,但值testlabel.Text不会更改。

解决此问题的一种方法是简单地testlabel.Text在事件处理程序 lambda 中设置:

_arr[i].Click += (a, b) =>
{
    z++;
    numarfinal = Convert.ToString(z);
    testlabel.Text = numarfinal;
    MessageBox.Show(Convert.ToString(numarfinal));
};
于 2013-04-27T20:36:22.877 回答
0

标签的点击事件中的 z 值正在更改。如果您想查看 testlabel 中的更改,您应该在“点击事件”中更改其文本。如果您想在每次添加标签时更改 numarfinal,您应该将您的代码从点击事件中删除,如果您希望每次点击标签时都更改 numarfinal,那么您的代码应该是已经存在的。

于 2013-04-27T20:16:19.820 回答
0

单击 button1 将永远不会导致numarfinal = Convert.ToString(z);到达该行,因为您只是代表附加到那里。当您为委托分配 时,在实际引发相应事件(即单击相应标签)之前,不会调用(a, b) => {...}中的代码。{}

于 2013-04-27T20:33:11.253 回答