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 关注
- 125 浏览
添加回答
举报