当我的页面被加载时,我遇到了一个问题,出于某种原因,我必须在触发事件之前单击该按钮两次。
这是我的代码
protected void Page_Load(object sender, EventArgs e)
{
ds = DA.DsQndA(1);//pass quiz id to fill dataset with requested quiz.
numOfRows = ds.Tables[0].Rows.Count;//so we know when to get redirected to results page
//if we are at over max questions then go right to results page
if (myNum >= numOfRows)
Response.Redirect("~/QuizResult.aspx");
Question.InnerText = ds.Tables[0].Rows[myNum]["Question"].ToString();//very first question
Btn1.Click += BtnClick;
Btn2.Click += BtnClick;
Btn3.Click += BtnClick;
Btn4.Click += BtnClick;
}
这是我的按钮点击处理程序代码
private void BtnClick(object sender, EventArgs e)
{
Button button = (Button)sender;
var rnd = new Random();
var qa = new List<KeyValuePair<string, int>>();
qa.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[myNum]["CorrectAnswer"].ToString(), 1));
qa.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[myNum]["WrongAnswer1"].ToString(), 0));
qa.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[myNum]["WrongAnswer2"].ToString(), 0));
qa.Add(new KeyValuePair<string, int>(ds.Tables[0].Rows[myNum]["WrongAnswer3"].ToString(), 0));
var myQa = qa.OrderBy(c => rnd.Next()).Select(c => new { c.Key, c.Value }).ToList();
if (button.ID == "Btn1")
DA.TrackAnswer(1, 1, Convert.ToInt32(ds.Tables[0].Rows[myNum]["QandAID"].ToString()), Btn1.Text, myQa[0].Value);
if (button.ID == "Btn2")
DA.TrackAnswer(1, 1, Convert.ToInt32(ds.Tables[0].Rows[myNum]["QandAID"].ToString()), Btn2.Text, myQa[1].Value);
if (button.ID == "Btn3")
DA.TrackAnswer(1, 1, Convert.ToInt32(ds.Tables[0].Rows[myNum]["QandAID"].ToString()), Btn3.Text, myQa[2].Value);
if (button.ID == "Btn4")
DA.TrackAnswer(1, 1, Convert.ToInt32(ds.Tables[0].Rows[myNum]["QandAID"].ToString()), Btn4.Text, myQa[3].Value);
Btn1.Text = myQa[0].Key;
Btn2.Text = myQa[1].Key;
Btn3.Text = myQa[2].Key;
Btn4.Text = myQa[3].Key;
myNum = myNum + 1;
}
当页面加载时,它会从我的数据集中提取第一个问题,但是当我单击按钮选择我的答案时,按钮会显示所有更改,但问题仍然相同,但是当我再次单击按钮然后更改时问题开始起作用了。
我尝试在我的页面加载事件中使用if(!postback)并添加了几乎所有在buttonclick处理程序中的内容,但是在我点击另一个然后它恢复正常之前问题仍然不会让步。
我需要做的是加载问题和答案,只需要点击一次答案按钮,而不是两次开始测验。
我想我解释得对。
答案 0 :(得分:0)
这是由ASP.NET页面生命周期引起的。您的Page_Load方法首先运行,然后是您的按钮处理程序,所以当您在按钮处理程序中更新myNum以加载下一个问题时,同样的问题已经加载到Page_Load中。有关详细信息,请参阅MSDN上的生命周期概述:http://msdn.microsoft.com/en-us/library/ms178472.aspx
我能想到解决它的最简单方法是在页面加载时增加myNum(如果它是回发),如下所示:
protected void Page_Load(object sender, EventArgs e)
{
ds = DA.DsQndA(1);//pass quiz id to fill dataset with requested quiz.
numOfRows = ds.Tables[0].Rows.Count;//so we know when to get redirected to results page
if (Page.IsPostBack)
{
myNum += 1;
}
//if we are at over max questions then go right to results page
if (myNum >= numOfRows)
Response.Redirect("~/QuizResult.aspx");
Question.InnerText = ds.Tables[0].Rows[myNum]["Question"].ToString();
Btn1.Click += BtnClick;
Btn2.Click += BtnClick;
Btn3.Click += BtnClick;
Btn4.Click += BtnClick;
}
另一种选择是尝试在LoadComplete事件中加载您的问题,该事件在按钮处理程序之后运行,如下所示:
protected void Page_LoadComplete(object sender, EventArgs e)
{
numOfRows = ds.Tables[0].Rows.Count;//so we know when to get redirected to results page
//if we are at over max questions then go right to results page
if (myNum >= numOfRows)
{
Response.Redirect("~/QuizResult.aspx");
}
Question.InnerText = ds.Tables[0].Rows[myNum]["Question"].ToString();//very first question
}
您可能需要在此方法中添加按钮处理程序中的一些更改,以便正确加载新问题。否则,您可能会使用错误的答案加载新问题。
答案 1 :(得分:0)
您需要进行事件接线
Btn1.Click += BtnClick;
Btn2.Click += BtnClick;
Btn3.Click += BtnClick;
Btn4.Click += BtnClick;
Page_Init中的.. Page_Load在生命周期中为时已晚