2013-04-27 29 views
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]); 
} 
+0

需要更多的代碼,其中的Z和numarfinal申報? – Fredou 2013-04-27 19:29:43

+0

所以你有全局變量'z'和'numarfinal',你在處理程序中改變它們,你可以看到改變,然後變量回滾到它們以前的值? – GSerg 2013-04-27 19:30:18

+0

在private private button1_Click(object sender,EventArgs e)中''z'是int類型,'numarfinal'是一個字符串。我之前提供的代碼也在同一個函數中。 – user2194683 2013-04-27 19:31:59

回答

0

Z值在標籤的點擊事件被改變。如果你想看到你的測試標籤上的變化,你應該改變它的文字「點擊事件」。如果您想在每次添加標籤時更改numarfinal,則應該將代碼置於單擊事件之外,並且如果每次單擊標籤時都需要進行numarfinal更改,則代碼應該已經存在。

0

單擊按鈕1將永遠不會導致行numarfinal = Convert.ToString(z);到達,因爲您只有附加委託那裏。當您爲代理分配(a, b) => {...}時,{}內的代碼在實際引發相應事件(即單擊相應標籤)之前不會被調用。

1

問題是你設置了testlabel.Text一次,而numarfinal的值仍然爲空。當單擊其中一個標籤並執行其事件處理程序時,numarfinal的值會更改,但testlabel.Text的值不是。要解決這個問題

一種方法是簡單地設置testlabel.Text在事件處理程序的λ:

_arr[i].Click += (a, b) => 
{ 
    z++; 
    numarfinal = Convert.ToString(z); 
    testlabel.Text = numarfinal; 
    MessageBox.Show(Convert.ToString(numarfinal)); 
};