2014-01-23 78 views
0

我遇到了一個問題,當我的頁面被加載,出於某種原因,我必須點擊按鈕兩次,纔會觸發事件。按鈕需要點擊兩次,當頁面加載開始觸發按鈕事件

這裏是我的代碼

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

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

您可能需要添加一些來自於這個方法的按鈕處理程序的變化,以及使他們正確加載新問題。否則,您可能會用錯誤的答案加載新問題。

+0

我準備在今晚的某個時間嘗試一下 – Chris

0

你需要把你的事件連接

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

..in Page_Init; Page_Load在生命週期中已經太晚了

+0

我試過了,它把所有東西都丟掉了,值被混淆了 – Chris

+0

這是因爲你沒有在PageLoad中根據無論IsPostback是否爲真。 PageLoad中的前兩個語句在每個請求上執行 - 我不確定你想要這樣做。另外,你如何在回傳之間堅持'myNum'?您是否嘗試過設置斷點並檢查每個請求上的變量值? – sh1rts

+0

我看到我在將PageInit添加事件處理程序時遇到了問題,當我將它們添加到那裏時,我忘記了將它們從PageLoad註釋掉。這就是爲什麼它會拋出我的錯誤。我堅持myNum作爲一個受保護的靜態int,然後我只是在click事件中迭代並使用它來迭代拋出我的數據集。我已經在事件處理程序上設置了斷點並逐步完成了一切。問題出在頁面加載中,出於某種原因,我需要回發才能開始測驗,所以現在當頁面加載時詢問「準備開始?!」用戶點擊按鈕,並導致我的回發... – Chris