用repeater控件还原学生的答题,例如考试时学生选择的是B,然后从数据库中取学生答案,显示在repeater中,现在完成的代码如下: <asp:Repeater ID="rpSingle" runat="server" >
<HeaderTemplate><strong>一、单选题</strong></HeaderTemplate>
<ItemTemplate>
<ul>
<li>
<%#(Container.ItemIndex+1)%>. <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>
<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实现
<HeaderTemplate><strong>一、单选题</strong></HeaderTemplate>
<ItemTemplate>
<ul>
<li>
<%#(Container.ItemIndex+1)%>. <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>
<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实现
你这个selected好像不行,测试没过
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;
}
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;
}
注意
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;
}
注意
注意什么???如果我的题是多选题呢?后台怎么办?不能把所有情况都列出来吧?用前台那个方法?可是不会用啊,求赐教
多选题就把单选框换多选框,
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;
} }
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的值了,其余的都好了,但是最后一个却没有变,这是为什么呢?还请大侠帮我看一下
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的值了,其余的都好了,但是最后一个却没有变,这是为什么呢?还请大侠帮我看一下最后一个不能选的图是这样的:
我试着只弄了一个题,没有选中,我断点看了一下foreach (RepeaterItem item in rpSingle.Items)这句它不进去,所以就跑不到后台语句了.......到底这是怎么了
{
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;
}修改循环
<div id="paper">
<asp:Repeater ID="rpSingle" runat="server"
onitemdatabound="rpSingle_ItemDataBound" >
<HeaderTemplate>
<strong>一、单选题</strong></HeaderTemplate>
<ItemTemplate>
<ul>
<li>
<%#(Container.ItemIndex+1)%>. <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>
<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事件的代码了