因为我的毕业论文是关于WEB上的考试系统所以在选择题方面我就想到用DataList控件的模板上加上RadioButtonList控件的方法.
首先我的数据表如下图:
其中examAsk为选择题的问题,examOption为选择题的选项用$符号分隔开,optionAns为选择题正确答案.这样做的难点是要把选择题的选项分离出来并绑定到RadioButtonList上,得到的效果如下图.
因为本人的粗心在开始Page_Load绑定数据时没有加上if(!IsPost)所以一直都解决不了RadioButtonList选中项的回传问题,所以搞了我两天.令我在这两天使用了各种方法都试过了,虽说走了好多弯路,不过都学了不同的RadioButtonList的数据绑定方法. 下面是总结的两种可行的方法。
方法一: 直接在前台绑定选择题选项字符的分离方法:
前台代码:
<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="300" align="center" border="1">
<TBODY>
<TR>
<TD align="center"></TD>
</TR>
<TR>
<TD align="center"></TD>
</TR>
<TR>
<TD align="center"><asp:datalist id="dlOption" runat="server">
<ItemTemplate>
<TABLE id="Table2" cellSpacing="1" cellPadding="1" width="300" border="1">
<TR>
<TD>
<asp:Label id=lbAsk runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"examAsk") %>'>
</asp:Label></TD>
</TR>
<TR>
<TD>
<asp:RadioButtonList id=rblOption runat="server" DataSource='<%# rdlDataBind(DataBinder.Eval(Container.DataItem,"examOption").ToString()) %>'>
</asp:RadioButtonList></TD>
</TR>
</TABLE>
</ItemTemplate>
</asp:datalist></TD>
</TR>
</TBODY>
</TABLE>
后台方法:
public string[] rdlDataBind(string data)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
string[] strOpt;
strOpt=data.Split('$');
return strOpt;
}
这种方法较好,不过就是当要取得RadioButtonList选中项的value值就不可以返回A、B、C、D的值。还不知道怎么添加value值。
方法二:
就是直接在DataList的ItemDataBound直接绑定
这种方法就不用在前台进行绑定了,后台绑定方法代码如下:
public DataTable radblBind(string data)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
DataTable dt=new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("strLet",typeof(string)));
dt.Columns.Add(new DataColumn("strOpt",typeof(string)));
string letter="A,B,C,D,E,F,G,H";
string[] strLet=letter.Split(',');
string[] strOpt=data.Split('$');
![](/Images/OutliningIndicators/InBlock.gif)
for(int i=0;i<strOpt.Length;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
dr=dt.NewRow();
dr[0]=strLet[i];
dr[1]=strOpt[i];
dt.Rows.Add(dr);
}
return dt;
}
private void dlOption_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem||e.Item.ItemType==ListItemType.EditItem)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
RadioButtonList rbt=(RadioButtonList)e.Item.FindControl("rblOption");
string data=Convert.ToString(DataBinder.Eval(e.Item.DataItem,"examOption"));
DataTable dtOpt=this.radblBind(data);
for(int i=0;i<dtOpt.Rows.Count;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//直接用ListItem绑定 ListItem it=new ListItem(dtOpt.Rows[i]["strOpt"].ToString(),dtOpt.Rows[i]["strLet"].ToString());
rbt.Items.Add(it);
}
// 用DataBind绑定RadioButtonList rbt.DataSource=new DataView(dtOpt);
// rbt.DataTextField="strOpt";
// rbt.DataValueField="strLet";
// rbt.DataBind();
}
}
上面这种方法就可以直接设置给RadioButtonList的value的返回值。
上面就是我试过的两种行得通的方法,其它的方法我也试过,不过都有这有那的错误就不介绍了。
若是各位有什么其它更好的方法请各位博客们多多赐教。因为这是本人第一次,所以要是有什么错误的地请各位大虾不要笑话。