我正在开发基于网络的测验系统。
我的代码生成一个带有问题列表的ASP.NET表,以及指示测验问题答案的单选按钮列表。
//Retrieve questions and answers - build the actual quiz
DataTable dtQuiz = qr.GetQuizQuestions(QuizID);
if (dtQuiz != null && dtQuiz.Rows.Count >= 1)
{
foreach (DataRow row in dtQuiz.Rows)
{
TableRow tr = new TableRow();
TableCell tcQuestionNum = new TableCell();
TableCell tcQuestion = new TableCell();
tcQuestionNum.VerticalAlign = VerticalAlign.Top;
tcQuestionNum.Controls.Add(new LiteralControl(row["QuestionNum"].ToString()));
tcQuestion.Controls.Add(new LiteralControl(row["Question"].ToString()));
RadioButtonList rblAnswers = qr.GetAnswers(QuizID, Int32.Parse(row["QuestionNum"].ToString()));
tcQuestion.Controls.Add(rblAnswers);
tr.Cells.Add(tcQuestionNum);
tr.Cells.Add(tcQuestion);
tblQuiz.Rows.Add(tr);
tblQuiz.DataBind();
}
}
此代码生成内容很好 - 出现测验问题,并且radiobutton列表按预期呈现。
当我有一个单独的按钮点击事件时,有些奇怪。在用户选择他们的答案之后,我想进行回发并遍历表格中的行,从每行的第二个单元格中的radiobutton列表中拉出答案。我开始走这条路:
foreach (TableRow tr in tblQuiz.Rows)
{
TableCell tc = tr.Cells[1];
RadioButtonList rbl = (RadioButtonList) tc.Controls[1];
}
问题是当单击第二个按钮(发布答案)时,表没有行。为什么会这样,我该如何纠正?
答案 0 :(得分:2)
我现在只能想到一个实例,那就是你有代码在if (!IsPostBack){}
(或If (Not IsPostBack) Then ...
如果VB)中创建表
如果是这种情况,则在回发时不会创建表格。您需要将代码放在if (!IsPostBack){}
的OUTSIDE中,以便在回发时重新创建表。
<强>更新强>
根据您的评论,我建议:
将生成表的代码移动到自己的子代码中。像(在vb中)的东西
Private Sub GenerateTable()
'' Code here
End Sub
然后,当您单击按钮生成表格时,请调用此子目录。
最后,当您单击按钮提交答案时,请在处理任何选择之前再次调用此子目录。
最终,在您处理其内容之前,表需要创建。
不要担心 - 表的创建不会覆盖用户做出的任何选择。