2014-10-31 42 views
0

我有WinForm,那裏我有很多控件,並且在某些時刻我需要更改其中一些屬性..所以,我創建了控件數組並確定哪些應該在我的課堂上改變不通過控制數組更改字段的屬性

controls = new Control[] {loadFromFile_btn, logout_btn, postBtn, waitFrom_tb, waitTo_tb, messageTB, recurs_check}; 
ChangeStatus.activStatus(controls); 

然後ChangeStatus修改所有這些元素都在數組

public static void activStatus(Control[] controlObj) 
    { 
     for (int i = 0; i < controlObj.Count() - 1; i++) 
     { 
      controlObj[i].BeginInvoke((Action)delegate 
      { 
       if (controlObj[i] is TextBox || controlObj[i] is CheckBox || controlObj[i] is Panel) 
        controlObj[i].Enabled = true; 
       else 
       { 
        controlObj[i].BackColor = Color.DarkGray; 
        controlObj[i].Enabled = true; 
       } 
      }); 
     } 
    } 

但我有一個問題...變化僅適用於數組中的最後一個元素。幫我請..

回答

3

這是因爲closure。嘗試存儲i在一個局部變量,並在您的匿名方法使用它的

for (int i = 0; i < controlObj.Count() - 1; i++) 
    { 
     int j = i; 
     controlObj[i].BeginInvoke((Action)delegate 
     { 
      if (controlObj[j] is TextBox || controlObj[j] is CheckBox || controlObj[j] is Panel) 
       controlObj[j].Enabled = true; 
      else 
      { 
       controlObj[j].BackColor = Color.DarkGray; 
       controlObj[j].Enabled = true; 
      } 
     }); 
    }