2014-10-15 6 views
0

여기 내 문제를 나타내는 샘플 코드가 있습니다. 5 LinkLabel을 추가합니다. 각각 Click 이벤트 핸들러가 있습니다. 라벨의 텍스트는 1 ... 5이며 동일한 결과가 표시되어야합니다. 각 라벨을 클릭하면 각각에 대해 동일한 메시지가 나타납니다. 5LinkLabel 클릭 이벤트가 루프 내에서 덮어 쓰여지고 있습니다.

마지막 핸들러가 덮어 쓰는 것과 같습니다 다른 라벨의 각 핸들러. 루프를 반복 할 때마다 새로운 EventHandlerLinkLabel을 새로 작성하여 피할 수 있다고 생각했습니다.

LinkLabelFlowLayoutPanel에 더했습니다.

왜 이러한 결과가 발생하며 어떻게 해결할 수 있습니까? 당신이 당신의 코드를 설명하는 문제를 재현하는 내 시도에서

List<Test> objects = new List<Test>(); 
for (int i = 0; i < 5; i++) 
{ 
    objects.Add(new Test(i + 1)); 
} 

foreach (Test t in objects) 
{ 
    LinkLabel label = new LinkLabel(); 
    label.AutoSize = true; 
    label.Text = t.a + ""; 

    label.Click += new EventHandler((sender, args) => 
    { 
     MessageBox.Show(t.a + ""); 
    }); 

    flowLayoutPanel1.Controls.Add(label); 
} 

답변

1

은 링크가 당신이 원하는 것처럼 클릭하면 각각 1-5 표시 을 통해 레이블. 여기

은 최소한 당신은 (그냥 구축하고 실행하기 위해 필요한 범위)에 게시 된 코드를 기반으로 구축 독립 예입니다 ... 예상대로 작동합니다

// FORNOW: Added Main method for PoC. 
void Main() 
{ 
    // FORNOW: Added necessary Form and FlowLayoutPanel locals. 
    Form form1 = new Form(); 
    FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel(); 

    List<Test> objects = new List<Test>(); 
    for (int i = 0; i < 5; i++) 
    { 
     objects.Add(new Test(i + 1)); 
    } 

    foreach (Test t in objects) 
    { 
     LinkLabel label = new LinkLabel(); 
     label.AutoSize = true; 
     label.Text = t.a + ""; 

     label.Click += new EventHandler((sender, args) => 
     { 
      MessageBox.Show(t.a + ""); 
     }); 

     flowLayoutPanel1.Controls.Add(label); 
    } 

    // FORNOW: Added necessary control wiring and display call. 
    form1.Controls.Add(flowLayoutPanel1); 
    form1.Show(); 
} 

// FORNOW: Added a Test class based on the OP's code. 
public class Test 
{ 
    public int a { get; set; } 

    public Test(int a) 
    { 
     this.a = a; 
    } 
} 

당신은 문제가있을 수 있습니다 당신이 고용하고있는 다른 코드에서, 당신이 공유 한 코드는 당신이 당신이 말한 것을 기반으로 잘 작동합니다.

+0

흠, 이상한데, 나는 여전히 같은 문제를 겪고 있습니다. 각 레이블을 클릭하면 "5"메시지가 전송됩니다. – kschieck

+0

어떤 이유로 그것이 동일한 객체를 참조하고있었습니다. 그래서'string a = t.a + "";'와 같은 변수를 만들었다면 올바른 값을 가질 것입니다; – kschieck

+0

@kschieck, 그 이유는 코드를 변경 (변경)하기 전의 코드 상태에 있기 때문입니다. 일단 솔루션을 분리하면 솔루션에 대한 설명을 게시해야합니다. 또한 유용하다고 판명되면 내 대답을 upvoting 고려해야합니다. :} – J0e3gan