一系列标签事件动作

时间:2013-04-27 19:25:16

标签: c# arrays variables

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

_arr[i].Click += (a, b) => {  
     z++;

     numarfinal = Convert.ToString(z);
     MessageBox.Show(Convert.ToString(numarfinal));
};

外部{}变量znumarfinal均未发生变化,但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]);
}

3 个答案:

答案 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) => {...}时,{}中的代码不会被调用,直到实际引发相应的事件(即单击相应的标签)。