我正在尝试使用ASP C#创建自己的在线测验网站。
我试图将数据库中的问题绑定到gridview
,并将gridview
的页面大小设置为1。然后,我尝试将答案选项(4个选项)拉入radioButton
。
但是当我尝试从gridview
的第一页移至另一页时,检查值丢失。我知道那是因为当我们更改gridview
页面时,它将执行postback
。
我的问题是:
RadioButton
?是因为在Updatepanel内部吗?postback
的情况下在gridview中进行页面索引更改?或者,RadioButton
检查值在切换到下一页时不丢失(下一个问题)?这是我的代码:
**
quiz.aspx:**
<asp:UpdatePanel ID="upd1" runat="server">
<ContentTemplate>
<asp:GridView ID="grdquestions" runat="server" EnableViewState="true" EnableSortingAndPagingCallbacks="false" OnPageIndexChanging="grdquestions_PageIndexChanging" AutoGenerateColumns="false" DataKeyNames="QuestionId" Width="100%" AllowPaging="True" AllowCustomPaging="False" PageSize="1" ViewStateMode="Enabled">
<Columns>
<asp:TemplateField HeaderText="DOJO eQuiz">
<ItemTemplate>
<table class="tableclass" id='<%#Eval("QuestionId") %>'>
<tr>
<td><b>Question : <%#Eval("Question") %></b>
<asp:HiddenField ID="hdnquestionId" runat="server" />
</td>
</tr>
<tr>
<td>
<table>
<tr style="margin-top: 10px;">
<td>
<table class="tblOptions">
<tr>
<td>
<asp:RadioButton ID="rdOption1" AutoPostBack="true" runat="server" Text='<%#Eval("Option1") %>' GroupName="chcbox" />
</td>
</tr>
<tr>
<td>
<asp:RadioButton ID="rdOption2" runat="server" AutoPostBack="true" Text='<%#Eval("Option2") %>' GroupName="chcbox" />
</td>
</tr>
<tr>
<td>
<asp:RadioButton ID="rdOption3" runat="server" AutoPostBack="true" Text='<%#Eval("Option3") %>' GroupName="chcbox" />
</td>
</tr>
<tr>
<td>
<asp:RadioButton ID="rdOption4" runat="server" Text='<%#Eval("Option4") %>' GroupName="chcbox" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lbquestionstatus" runat="server"></asp:Label>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle HorizontalAlign="Center" CssClass="GridPager" />
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
**
quiz.aspx.cs **
protected void Page_Load(object sender, EventArgs e)
{
if (Session["username"] == null)
{
Response.Redirect("Login.aspx");
}
else
{
if (!Page.IsPostBack)
{
BindGrid();
}
else
{
}
}
}
public void BindGrid()
{
var sess = Session["username"].ToString();
string a = sess.Substring(sess.Length - 1);
SqlDataAdapter adp = new SqlDataAdapter("select * from dojoquiz order by " + a + "", ConfigurationManager.ConnectionStrings["dashboardConnectionString"].ToString());
adp.Fill(dt);
grdquestions.DataSource = dt;
grdquestions.DataBind();
}
protected void grdquestions_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
RadioButtonList rdlstOptions = (RadioButtonList)e.Row.FindControl("rdlstOptions");
HiddenField hdnquestionId = (HiddenField)e.Row.FindControl("hdnquestionId");
if (rdlstOptions != null && hdnquestionId != null)
{
DataRow[] result = dt.Select("questionid=" + (Convert.ToInt32(hdnquestionId.Value)));
DataView view = new DataView();
view.Table = dt;
view.RowFilter = "questionid=" + (Convert.ToInt32(hdnquestionId.Value));
if (view.Table.Rows.Count > 0)
{
DataTable dt1 = new DataTable();
dt1 = view.ToTable();
}
}
}
}
protected void grdquestions_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
grdquestions.PageIndex = e.NewPageIndex;
this.BindGrid();
}
谢谢您的帮助和建议。
如果sql查询没有更改,则不要在回发时执行DataBind()
,但是您仍然需要给他数据源以获取数据。因此,您的代码必须为:
protected void Page_Load(object sender, EventArgs e)
{
BindGrid();
}
public void BindGrid()
{
var sess = Session["username"].ToString();
string a = sess.Substring(sess.Length - 1);
SqlDataAdapter adp = new SqlDataAdapter("select * from dojoquiz order by " + a + "", ConfigurationManager.ConnectionStrings["dashboardConnectionString"].ToString());
adp.Fill(dt);
grdquestions.DataSource = dt;
if (!Page.IsPostBack)
grdquestions.DataBind();
}
不可能在没有回发页面的情况下更改页面或对GridView进行思考,但是如果正确,这不是问题。