1

我正在开发一个基于网络的测验系统。

我有代码生成一个 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();
            }
        }

此代码生成的内容很好 - 出现测验问题,并且单选按钮列表按预期呈现。

当我有一个单独的按钮单击事件时,有些奇怪。用户选择他们的答案后,我想做一个回发并循环遍历表中的行,从每行第二个单元格的单选按钮列表中提取答案。我开始走这条路:

        foreach (TableRow tr in tblQuiz.Rows)
    {
        TableCell tc = tr.Cells[1];
        RadioButtonList rbl = (RadioButtonList) tc.Controls[1];
    }

问题是当第二个按钮被点击(发布答案)时,表格没有行。为什么会这样,我该如何纠正?

4

1 回答 1

2

我现在只能想到一个实例,那就是您有在if (!IsPostBack){}(或者If (Not IsPostBack) Then ...如果是 VB)中创建表的代码

如果是这种情况,回发时不会创建您的表。您需要将代码放在 OUTSIDE 之外,if (!IsPostBack){}以便在回发时重新创建表。

更新

根据您的评论,我建议:

将生成表的代码移动到它自己的子目录中。像(在vb中)

Private Sub GenerateTable()
   '' Code here
End Sub

然后当您单击按钮生成表时,调用此子。

最后,当您单击按钮提交答案时,在处理任何选择之前再次调用此子程序。

最终,需要先创建表,然后才能处理其内容。

不用担心 - 表的创建不会覆盖用户所做的任何选择。

于 2012-12-04T20:49:35.000 回答