2016-07-16 22 views
2

Wie verwende ich einen einzelnen Event-Handler pro Iteration, ohne die Funktionen hart zu codieren?C# for-Schleife und Click Event Handler

for (int i = 0; i < 100; i++) 
{ 
     //other code 
     PictureBox listItem = new PictureBox(); 
     listItem.Click += new EventHandler((sender2, e2) => ListItemClicked(i)); 
     //other code  
} 

private void ListItemClicked(int index) 
{ 
    MessageBox.Show(index.ToString()); 
} 
+0

Sie verwenden bereits einen Handler pro Iteration, nicht wahr? Kannst du bitte mehr erklären? –

+0

Ja, tue ich, aber die ListItemClicked() - Funktion zeigt nur den Index 100 (den letzten Index) an, egal auf welches listItem ich klicke. – Reese

Antwort

3

Sie benötigen Iterator in eine lokale Variable für die Delegierten kopieren um es richtig zu erfassen:

for (int i = 0; i < 100; i++) 
{ 
     var idx = i; 
     //other code 
     PictureBox listItem = new PictureBox(); 
     listItem.Click += new EventHandler((sender2, e2) => ListItemClicked(idx)); 
     //other code  
} 

In Ihrem ursprünglichen Stück Code, der Delegierte sagt: „Rückkehr mir der aktuelle Wert der Variable ", die 100 ist. Nicht:" der Wert, als es erstellt wurde ". Lesen Sie auf Schließungen, um eine eingehende Erklärung dafür zu erhalten. Ich würde Jon Skeets C# in der Tiefe empfehlen.

In C# 5.0 wurde dies für die foreach Schleife geändert, nicht die for i; eine.

+0

Vielen Dank. Dies hat das Problem gelöst. – Reese