1 回答

TA貢獻1793條經驗 獲得超6個贊
你的問題在這一行:
ddl.SelectedIndexChanged += (sender, e) => ScoreChanged(sender, e, tc1,tc2, ddl.SelectedIndex);
這里有兩件事很重要:
您正在使用匿名方法調用
ScoreChanged
.您正在傳遞
tc1
和tc2
作為ScoreChanged
方法的參數。您已在代碼塊的開頭、循環外定義了這些變量。
在這種情況下,神奇的詞是閉包。由于tc1
和tc2
是在匿名方法的范圍之外定義的,因此它們變成了閉包。這意味著在您定義方法時將沒有值,但在您調用它時。由于您不斷覆蓋foreach
循環中變量的值,因此在調用時這些變量將具有循環最后一次迭代的值。
解決方案很簡單:在循環內聲明變量。這將為 的每次迭代創建一個新的閉包foreach
:
TableRow tr;
TableCell tc;
TextBox txt;
CheckBox cbk;
foreach (Question q in questions)
{
TableCell tc1;
TableCell tc2;
DropDownList ddl; //Don't forget to include ddl, since you are using its selected index
//...
更一般的注意事項:不要在 C# 中的方法的開頭執行這樣的“聲明”塊。第一次使用時聲明變量(除非有充分的理由不這樣做,例如您希望它成為閉包的一部分)。這有很多很好的理由,而您只是體驗過其中的一個。另一種情況是,當您將部分代碼轉換為具有 Visual Studio 重構功能的方法時,您會將預先聲明的變量作為ref參數傳遞。這些是最明顯的原因。還有更多。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報