2012-11-23 5 views
3

C#에서 동적 단추를 만들고 Click 이벤트 처리기 (ID)에 매개 변수를 추가해야합니다.대리인이 포함 된 이벤트 처리기

그러나이 예에서 출력은 all 버튼에 대한 마지막 매개 변수 "10"이며 "1-2-3-4-5 -...."가 아닌 이유는 무엇입니까?

for(int counter = 1; counter < 10; counter++) 
{ 

    // Add new button 

    Button btn = new Button(); 

    btn.Width = 250; 
    btn.Height = 50; 

    btn.Click += delegate (object sender1, EventArgs e1) 
    { myEventHandler(sender1, e1, counter); }; 

    Test.Controls.Add(btn); 

} 


public void myEventHandler(object sender, EventArgs e, int i) 
{ 

    MessageBox.Show("Test: " + i); 

} 

고맙습니다. 대리자가 counter 변수 참조 아닌 값을 포착하기 때문이다

플로리안

답변

3

이 카운터 변수가 포착되지 않기 때문에 :

BTW, 당신은 조금 덜 장황이 코드를 만들기 위해 람다 구문을 사용할 수 있습니다.

for(int counter = 1; counter < 10; counter++) 
{ 

    // Add new button 

    Button btn = new Button(); 

    btn.Width = 250; 
    btn.Height = 50; 

    int num = counter; 
    btn.Click += delegate (object sender1, EventArgs e1) 
    { myEventHandler(sender1, e1, num); }; 

    Test.Controls.Add(btn); 

} 


public void myEventHandler(object sender, EventArgs e, int i) 
{ 

    MessageBox.Show("Test: " + i); 

} 

더 많은 정보를 원하시면 유래에이 질문을 참조하십시오 : 이것은 루프가 끝날 때 카운터의 값이 10이 될 것이다, 그래서 모든 대표들이이 같은 루프 내에서 변수를 사용할 수 있습니다 해결하기 위해 그 값을해야한다는 것을 의미 Captured variable in a loop in C#

2

. 즉, 10 명의 모든 대표는 매우 동일한 counter 변수에 대한 참조를 포함합니다. 델리게이트를 실행하면 루프는 이미 끝났기 때문에이 변수의 값은 자연스럽게 10입니다. 이 같은

수정을 :

var tmp = counter; 
btn.Click += delegate (object sender1, EventArgs e1) 
{ myEventHandler(sender1, e1, tmp); }; 

지금 각 대표는 자신의 인스턴스가됩니다.

var tmp = counter; 
btn.Click += (sender1, e1) => myEventHandler(sender1, e1, tmp);