最近正在做一个考试系统. 要求实现以下效果.
考题是从后台数据库中取的数据,测试答案也是从后台取的数据, 还要根据复选单选 来添加复选框和单选框.
最开始的思路是,Repeater中套一个Repeater,在Repeater的Item_DataBind 中绑定数据,但是这样的话,数据是可以正常绑定,但是复选单选框实在不好处理...
最后考虑从后台添加控件...
1.首先,添加考题数据,绑定考题数据.
protected void Page_Load(object sender, EventArgs e)
{
RepeaterItem.DataSourceID=getItemData();//getItemData 是一个获取数据源的方法,返回一个数据源。
RepeaterItem.DataBind();
}
2.添加考题的答案选项
protected void RptExamItem_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
string examItemID,optionSign; //两个变量,是存取本考题的考题ID,和单选或复选的标记
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
examItemID = ((HiddenField)e.Item.FindControl("EItemID")).Value;
optionSign =((HiddenField)e.Item.FindControl("OptionSign")).Value;
DataSet ds = getAnswerItem(examItemID); //getAnswerItem()返回一个考题的答案选项的数据源
PlaceHolder phl =(PlaceHolder) e.Item.FindControl("ControlContainer");
HtmlGenericControl span = new HtmlGenericControl("span");
span.ID = "sphd";
string listr = "";
for(int i =0; i < ds.Tables[0].Rows.Count; i ++)
{
HtmlContainerControl li = new HtmlGenericControl("li");
li.ID = "lihd" + i;
listr = ds.Tables[0].Rows[i]["NumberSignDesc"].ToString() + ds.Tables[0].Rows[i]["ExamItemAsTitle"].ToString();
li.InnerHtml = listr;
span.Controls.Add(li);
if (optionSign == "False")
{
HtmlInputRadioButton rd = new HtmlInputRadioButton();
rd.ID = "rdanswer"+i;
rd.Name = "ckanswer" + examItemID;
rd.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
rd.Attributes.Add("onclick", "OnTimeBegin()");
span.Controls.Add(rd);
}
else
{
HtmlInputCheckBox ck = new HtmlInputCheckBox();
ck.ID = "ckanswer"+i;
ck.Name = "ckanswer" + examItemID;
ck.Value = ds.Tables[0].Rows[i]["NumberSign"].ToString();
ck.Attributes.Add("onclick", "OnTimeBegin()");
span.Controls.Add(ck);
}
phl.Controls.Add(span);
}
}
因为我要用RADIO 和checkbox 的值。这是取值的代码.
HtmlGenericControl span = (HtmlGenericControl)this.RptExamItem.Items[i].FindControl("sphd");
for (int j = 0; j < span.Controls.Count; j++)
{
if (span.FindControl("rdanswer" + j) !=null)
{
HtmlInputRadioButton rd = (HtmlInputRadioButton)span.FindControl("rdanswer" + j);
if (rd.Checked)
{
checkanswer = checkanswer + rd.Value + "|";
}
}
if (span.FindControl("ckanswer" + j)!=null)
{
HtmlInputCheckBox ck = (HtmlInputCheckBox)span.FindControl("ckanswer" + j);
if (ck.Checked)
{
checkanswer = checkanswer + ck.Value + "|";
}
}
前台页面代码:
<asp:Repeater ID="RptExamItem" runat="server"
onitemdatabound="RptExamItem_ItemDataBound" >
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<asp:HiddenField runat="server" ID="EItemID" value='<%#Eval("ExamItemID") %>'/>
<asp:HiddenField runat="server" ID="OptionSign" Value='<%#Eval("OptionSign") %>' />
<ul class="item">
<li class="first" id="one" value='<%#Eval("ExamItemID") %>'><%#Eval("EItemContent")%>(<%#Eval("POINT")%> 分)</li>
<asp:PlaceHolder ID="ControlContainer" runat="server"/>
</ul>
</ItemTemplate>
<FooterTemplate>
<br />
</FooterTemplate>
</asp:Repeater>
本来 placeHolder 那里放的是一个嵌套的Repeater的,呵呵,这种嵌套的数据,第一反应就是嵌套数据控件,,但是纠结了半天也搞不定checkbox 和redio 控件的问题,也取不出值来..所以就用这种办法了.... 纠结..