用repeater控件还原学生的答题,例如考试时学生选择的是B,然后从数据库中取学生答案,显示在repeater中,现在完成的代码如下:     <asp:Repeater ID="rpSingle" runat="server" >
    <HeaderTemplate><strong>一、单选题</strong></HeaderTemplate>
        <ItemTemplate>
            <ul>
                <li>
                    <%#(Container.ItemIndex+1)%>.&nbsp<asp:Label ID="lblSingleQ" runat="server" Text='<%#Eval("question") %>'></asp:Label>
                    <asp:Label
                        ID="lblQid" runat="server" Text='<%#Eval("question_id") %>' Visible="false"></asp:Label>
                </li>
                <li>
                    <asp:RadioButton ID="rbA" runat="server" GroupName="s1" Text='<%#Eval("a") %>' />
                </li>
                <li>
                    <asp:RadioButton ID="rbB" runat="server" GroupName="s1" Text='<%#Eval("b") %>' />
                    </li>
                <li>
                    <asp:RadioButton ID="rbC" runat="server" GroupName="s1" Text='<%#Eval("c") %>' />
                </li>
                <li>
                    <asp:RadioButton ID="rbD" runat="server" GroupName="s1" Text='<%#Eval("d") %>' />
                </li>
                <br />                <li>
                    <asp:Label ID="lblSingleStuPlay" runat="server" ForeColor="Blue" Text="学生答案是:"></asp:Label><asp:Label ID="lblStuAnswer" ForeColor="Blue" runat="server" Text='<%#Eval("student_answer")%>'></asp:Label>
                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <asp:Label ID="lblSinglePlay" runat="server" ForeColor="Blue" Text=" 正确答案是:" ></asp:Label> <asp:Label ID="lblAnswer" ForeColor="Blue" runat="server" Text='<%#Eval("answer") %>'></asp:Label>
                </li>
            </ul>
        </ItemTemplate>
    </asp:Repeater>实现图
就是radiobutton根据数据库的答案呈现选中状态求解答
也可以不用repeater实现

解决方案 »

  1.   

    <asp:RadioButton ID="rbD" runat="server" GroupName="s1" Text='<%#Eval("d") %>' Selected=<%#questionanswer=d?"true":"false"#>/>
      

  2.   

    如果这种方法可行的话那岂不是在每一个选项绑定后边都得这样写?
    你这个selected好像不行,测试没过
      

  3.   

    这是前台的用法,后台方法加入
     onitemdatabound="Repeater1_ItemDataBound" //事件代码    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lb = (Label)e.Item.FindControl("lblAnswer");
            RadioButton rbSelected = null;
            switch (lb.Text.ToLower())
            {
                case "a":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "b":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "c":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                default:
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
            }
            rbSelected.Checked = true;
        }
      

  4.   

    这是前台的用法,后台方法加入
     onitemdatabound="Repeater1_ItemDataBound" //事件代码    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lb = (Label)e.Item.FindControl("lblAnswer");
            RadioButton rbSelected = null;
            switch (lb.Text.ToLower())
            {
                case "a":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "b":
                    rbSelected = (RadioButton)e.Item.FindControl("rbB");
                    break;
                case "c":
                    rbSelected = (RadioButton)e.Item.FindControl("rbC");
                    break;
                default:
                    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    break;
            }
            rbSelected.Checked = true;
        }

    注意
      

  5.   

    这是前台的用法,后台方法加入
     onitemdatabound="Repeater1_ItemDataBound" //事件代码    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lb = (Label)e.Item.FindControl("lblAnswer");
            RadioButton rbSelected = null;
            switch (lb.Text.ToLower())
            {
                case "a":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "b":
                    rbSelected = (RadioButton)e.Item.FindControl("rbB");
                    break;
                case "c":
                    rbSelected = (RadioButton)e.Item.FindControl("rbC");
                    break;
                default:
                    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    break;
            }
            rbSelected.Checked = true;
        }

    注意
    注意什么???如果我的题是多选题呢?后台怎么办?不能把所有情况都列出来吧?用前台那个方法?可是不会用啊,求赐教
      

  6.   

    注意这个,
    多选题就把单选框换多选框,
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            //获取标准答案 例如多选 a,b,c  或 a,b
            Label lb = (Label)e.Item.FindControl("lblAnswer");        CheckBox rbSelected = null;        //将标准答案转化成数组
            string[] answers = lb.Text.Split(',');        //循环标准答案设置控件选中
            foreach (string i in answers)
            {
                rbSelected = (CheckBox)e.Item.FindControl("rb" + answers.ToString().ToUpper());
                rbSelected.Checked = true;
            }    }
      

  7.   

    这是前台的用法,后台方法加入
     onitemdatabound="Repeater1_ItemDataBound" //事件代码    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lb = (Label)e.Item.FindControl("lblAnswer");
            RadioButton rbSelected = null;
            switch (lb.Text.ToLower())
            {
                case "a":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "b":
                    rbSelected = (RadioButton)e.Item.FindControl("rbB");
                    break;
                case "c":
                    rbSelected = (RadioButton)e.Item.FindControl("rbC");
                    break;
                default:
                    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    break;
            }
            rbSelected.Checked = true;
        }

    注意

    我用你的方法试了一遍,在
      switch (lb.Text.ToLower()) 这一行它提示未将对象引用到对象的实例,我用断点看了一下,lb的值为null,然后我自己改了一下


      foreach (RepeaterItem item in rpSingle.Items)
            {
                Label lb = (Label)item.FindControl("lblStuAnswer");
                RadioButton rbSelected = null;
                switch (lb.Text.ToUpper())
                {
                    case "A":
                        rbSelected = (RadioButton)item.FindControl("rbA");
                        break;
                    case "B":
                        rbSelected = (RadioButton)item.FindControl("rbB");
                        break;
                    case "C":
                        rbSelected = (RadioButton)item.FindControl("rbC");
                        break;
                    default:
                        rbSelected = (RadioButton)item.FindControl("rbD");
                        break;
                    //case "D":
                    //    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    //    break;            }
                rbSelected.Checked = true;
            }
    这次可以取到lb的值了,其余的都好了,但是最后一个却没有变,这是为什么呢?还请大侠帮我看一下
      

  8.   

    这是前台的用法,后台方法加入
     onitemdatabound="Repeater1_ItemDataBound" //事件代码    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            Label lb = (Label)e.Item.FindControl("lblAnswer");
            RadioButton rbSelected = null;
            switch (lb.Text.ToLower())
            {
                case "a":
                    rbSelected = (RadioButton)e.Item.FindControl("rbA");
                    break;
                case "b":
                    rbSelected = (RadioButton)e.Item.FindControl("rbB");
                    break;
                case "c":
                    rbSelected = (RadioButton)e.Item.FindControl("rbC");
                    break;
                default:
                    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    break;
            }
            rbSelected.Checked = true;
        }

    注意

    我用你的方法试了一遍,在
      switch (lb.Text.ToLower()) 这一行它提示未将对象引用到对象的实例,我用断点看了一下,lb的值为null,然后我自己改了一下


      foreach (RepeaterItem item in rpSingle.Items)
            {
                Label lb = (Label)item.FindControl("lblStuAnswer");
                RadioButton rbSelected = null;
                switch (lb.Text.ToUpper())
                {
                    case "A":
                        rbSelected = (RadioButton)item.FindControl("rbA");
                        break;
                    case "B":
                        rbSelected = (RadioButton)item.FindControl("rbB");
                        break;
                    case "C":
                        rbSelected = (RadioButton)item.FindControl("rbC");
                        break;
                    default:
                        rbSelected = (RadioButton)item.FindControl("rbD");
                        break;
                    //case "D":
                    //    rbSelected = (RadioButton)e.Item.FindControl("rbD");
                    //    break;            }
                rbSelected.Checked = true;
            }
    这次可以取到lb的值了,其余的都好了,但是最后一个却没有变,这是为什么呢?还请大侠帮我看一下最后一个不能选的图是这样的:
      

  9.   


    我试着只弄了一个题,没有选中,我断点看了一下foreach (RepeaterItem item in rpSingle.Items)这句它不进去,所以就跑不到后台语句了.......到底这是怎么了
      

  10.   

      for (int i=0;i<rpSingle.Items.Count;i++)
            {
                Label lb = (Label)rpSingle.Items[i].FindControl("lblStuAnswer");
                RadioButton rbSelected = null;
                switch (lb.Text.ToUpper())
                {
                    case "A":
                        rbSelected = (RadioButton)rpSingle.Items[i].FindControl("rbA");
                        break;
                    case "B":
                        rbSelected = (RadioButton)rpSingle.Items[i].FindControl("rbB");
                        break;
                    case "C":
                        rbSelected = (RadioButton)rpSingle.Items[i].FindControl("rbC");
                        break;
                    default:
                        rbSelected = (RadioButton)rpSingle.Items[i].FindControl("rbD");
                        break;
                    //case "D":
                    //    rbSelected = (RadioButton)e.rpSingle.Items[i].FindControl("rbD");
                    //    break;            }
                rbSelected.Checked = true;
            }修改循环
      

  11.   

    悲催的是还是不可以,还是最后一个选不中,如果只有一个的话也选不中,我插断点发现在i=0时,rpSingle.Items.Count的值为0,所以进不去,为什么会是零呢?不是20这个总体数??然后这个rpSingle.Items.Count运行一次就加一个。好吧,既然这样我给rpSingle.Items.Count  +1,它就报错了,明明有一个item,怎么会没有呢?
      

  12.   

    前台,只是单选题
       <div id="paper">
           <asp:Repeater ID="rpSingle" runat="server" 
               onitemdatabound="rpSingle_ItemDataBound" >
               <HeaderTemplate>
                   <strong>一、单选题</strong></HeaderTemplate>
               <ItemTemplate>
                   <ul>
                       <li>
                           <%#(Container.ItemIndex+1)%>.&nbsp<asp:Label ID="lblSingleQ" runat="server" Text='<%#Eval("question") %>'></asp:Label>
                           <asp:Label ID="lblQid" runat="server" Text='<%#Eval("question_id") %>' Visible="false"></asp:Label>
                       </li>
                       <li>
                           <asp:RadioButton ID="rbA" runat="server" GroupName="s1" Text='<%#Eval("a") %>' />
                       </li>
                       <li>
                           <asp:RadioButton ID="rbB" runat="server" GroupName="s1" Text='<%#Eval("b") %>' />
                       </li>
                       <li>
                           <asp:RadioButton ID="rbC" runat="server" GroupName="s1" Text='<%#Eval("c") %>' />
                       </li>
                       <li>
                           <asp:RadioButton ID="rbD" runat="server" GroupName="s1" Text='<%#Eval("d") %>' />
                       </li>
                       <br />
                       <li>
                           <asp:Label ID="lblSingleStuPlay" runat="server" ForeColor="Blue" Text="学生答案是:"></asp:Label><asp:Label
                               ID="lblStuAnswer" ForeColor="Blue" runat="server" Text='<%#Eval("student_answer")%>'></asp:Label>
                           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                           <asp:Label ID="lblSinglePlay" runat="server" ForeColor="Blue" Text=" 正确答案是:"></asp:Label>
                           <asp:Label ID="lblAnswer" ForeColor="Blue" runat="server" Text='<%#Eval("answer") %>'></asp:Label>
                       </li>
                   </ul>
               </ItemTemplate>
           </asp:Repeater>
            <hr />后台数据绑定:
     DataTable Singledt = OnLineBLL.Paper.GetStuPaper(Convert.ToInt32(Request.QueryString["courseid"]), lblStudentID.Text, 1);
                rpSingle.DataSource = Singledt;
                rpSingle.DataBind();
    然后就是ItemDataBound事件的代码了