2010-04-03 75 views
4
public Form1() 
    { 
     InitializeComponent(); 
     Collection<Test> tests = new Collection<Test>(); 
     tests.Add(new Test("test1")); 
     tests.Add(new Test("test2")); 
     foreach (Test test in tests) 
     { 
      Button button = new Button(); 
      button.Text = test.name; 
      button.Click+=new EventHandler((object obj, EventArgs arg)=>{ 
       this.CreateTest(test); 
      }); 
      this.flowLayoutPanel1.Controls.Add(button); 
     } 
    } 
    public void CreateTest(Test test) 
    { 
     MessageBox.Show(test.name); 
    } 
} 

內anonymouse代表當我按一下按鈕女巫文字是「測試1」,在MessageBox將顯示「測試2」,但我想到的是「TEST1」。 那麼,有人會告訴我爲什麼或者我的代碼有什麼問題。問題用foreach

回答

14

是的 - 你正在關閉循環變量。 lambda表達式中的test引用所有委託中的相同變量,這意味着它將以循環結尾處的最終值結尾。獲取價值的副本並使用它。你也使用了lambda表達式的一個很長的形式。下面是固定的,縮短了代碼:

foreach (Test test in tests) 
{ 
    // Take a copy of the "test" variable so that each iteration 
    // creates a delegate capturing a different variable (and hence a 
    // different value) 
    Test copy = test; 
    Button button = new Button(); 
    button.Text = test.name; 
    button.Click += (obj, arg) => CreateTest(copy); 
    this.flowLayoutPanel1.Controls.Add(button); 
} 

更多信息請參見Eric Lippert's blog post on this topic

+0

非常感謝。 – geting 2010-05-07 13:33:13