1 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
你的問題在這一行:
ddl.SelectedIndexChanged += (sender, e) => ScoreChanged(sender, e, tc1,tc2, ddl.SelectedIndex);
這里有兩件事很重要:
您正在使用匿名方法調(diào)用
ScoreChanged
.您正在傳遞
tc1
和tc2
作為ScoreChanged
方法的參數(shù)。您已在代碼塊的開頭、循環(huán)外定義了這些變量。
在這種情況下,神奇的詞是閉包。由于tc1
和tc2
是在匿名方法的范圍之外定義的,因此它們變成了閉包。這意味著在您定義方法時(shí)將沒有值,但在您調(diào)用它時(shí)。由于您不斷覆蓋foreach
循環(huán)中變量的值,因此在調(diào)用時(shí)這些變量將具有循環(huán)最后一次迭代的值。
解決方案很簡(jiǎn)單:在循環(huán)內(nèi)聲明變量。這將為 的每次迭代創(chuàng)建一個(gè)新的閉包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
//...
更一般的注意事項(xiàng):不要在 C# 中的方法的開頭執(zhí)行這樣的“聲明”塊。第一次使用時(shí)聲明變量(除非有充分的理由不這樣做,例如您希望它成為閉包的一部分)。這有很多很好的理由,而您只是體驗(yàn)過其中的一個(gè)。另一種情況是,當(dāng)您將部分代碼轉(zhuǎn)換為具有 Visual Studio 重構(gòu)功能的方法時(shí),您會(huì)將預(yù)先聲明的變量作為ref參數(shù)傳遞。這些是最明顯的原因。還有更多。
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報(bào)