加载页面时,需要单击按钮两次以启动触发按钮事件

时间:2014-01-23 01:27:56

标签: c# asp.net webforms

当我的页面被加载时,我遇到了一个问题,出于某种原因,我必须在触发事件之前单击该按钮两次。

这是我的代码

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处理程序中的内容,但是在我点击另一个然后它恢复正常之前问题仍然不会让步。

我需要做的是加载问题和答案,只需要点击一次答案按钮,而不是两次开始测验。

我想我解释得对。

2 个答案:

答案 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在生命周期中为时已晚