【问题标题】:Button needs to be clicked twice when page is loaded to start firing button event加载页面时需要单击两次按钮才能开始触发按钮事件
【发布时间】:2014-01-23 01:27:55
【问题描述】:

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

这是我的代码

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 处理程序中的几乎所有内容,但问题仍然没有解决,直到我单击另一个然后它才正常。

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

我想我解释得对。

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    这是由 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
    }
    

    您可能还需要在此方法中添加按钮处理程序中的一些更改,以便它们为新问题正确加载。否则,您可能会加载带有错误答案的新问题。

    【讨论】:

    • 今晚某个时候我要试试这个
    【解决方案2】:

    你需要把你的事件连线

    Btn1.Click += BtnClick;
    Btn2.Click += BtnClick;
    Btn3.Click += BtnClick;
    Btn4.Click += BtnClick;
    

    ..in Page_Init; Page_Load 在生命周期中为时已晚

    【讨论】:

    • 我试过了,它把所有东西都扔掉了,价值观混在一起了
    • 那是因为您没有根据 IsPostback 是否为真在 PageLoad 中正确路由逻辑。 PageLoad 中的前两个语句在每个请求上都执行 - 我不确定您是否要这样做。另外,您如何在回发之间坚持“myNum”?您是否尝试过设置断点并检查每个请求的变量值?
    • 我看到了将事件处理程序添加到 PageInit 时出错的地方,当我在那里添加它们时,我忘记在 PageLoad 中将它们注释掉。这就是为什么它给我带来错误。我将 myNum 持久化为受保护的静态 int,然后我只需迭代 click 事件并使用它来迭代 throw 我的数据集。我已经在事件处理程序上设置断点并逐步完成所有内容。问题出在页面加载中,出于某种原因,我需要回发才能开始测验,所以现在我在页面加载时询问“准备好开始了吗?!”用户单击按钮,并导致我的回发...
    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 2011-07-29
    • 2017-09-23
    • 2013-05-10
    • 2012-09-11
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多