2011-04-15 132 views
0

我瞭解ASP.net頁面生命週期,當我點擊一個按鈕時,它首先重新載入頁面,然後執行我的按鈕背後的代碼。我的問題是我如何得到它,以便在這個過程發生之前我可以設置一些東西。我試圖通過一個變量,該按鈕已被點擊,但由於頁面生命週期它永遠不會收到這個。我該怎麼做,才能確定這個按鈕已被點擊,可能是我過度思考這個問題,或者甚至是思考問題。ASP.net頁面生命週期問題

頁面加載:

 ImageButton btn = (ImageButton)(Page.FindControl("displayYImgBtn")); 
     if (btn != null) 
     { 
      string state = btn.CommandArgument; 
      if (state == "true") 
      { 
       search(); 
       btn.CommandArgument = "false"; 
      } 
     } 

按鈕:

ImageButton btn = (ImageButton)(sender); 
    btn.CommandArgument = "true"; 
+0

您是否必須在頁面加載中搜索()? – AGoodDisplayName 2011-04-15 18:28:56

+0

@AGoodDisplayName這個名稱有點令人誤解,但是如果條件爲真,那麼需要在頁面加載期間執行。 – atrljoe 2011-04-15 18:30:10

+0

是不是因爲FindControl中的兩個'Y'? 'ImageButton btn =(ImageButton)(Page.FindControl(「displayyImgBtn」));'(這段代碼是否被剪切粘貼?) – 2011-04-15 18:45:06

回答

3

你總是可以直接檢查後變量。如果點擊提交按鈕,它將在Request.Form集合中具有值,如果它不是回發或其他控件導致回發,則不應出現。

1

有多種不同的方式來解決這個問題。

  • 將您的Page_Load代碼放在OnPreRender上。這將發生在RaisePostBackEvent之後,因此可以保證任何按鈕的點擊已經被處理。注意到這一點很重要,取決於你要在那裏做什麼,它可能無法正常工作。某些組件在以後的事件中不接受某些屬性更改。如果它有效,這是推薦的方法。
  • 在您更改ImageButton的CommandArgument時觸發的按鈕上創建一個新事件。然後,在Page_Load上,爲您的新按鈕的事件創建一個處理程序,並將那些代碼放在Page_Load中。使用這種方法將導致此處理髮生在OnPreRender之前
0

我想這取決於您的Page_Load事件中發生了什麼,但是。

如果變量在Page_Load被設置,你可以把它包裝:

If(!Page.IsPostback) { 
    // only execute when the page first loads 
} 

,只是有一個onclick事件爲您的ImageButton

0

在一個Asp.Net webforms配置中,ImageButton點擊應該觸發ImageButton_OnClick類型的事件。無論是在您的標記或Page_Init事件的方法,你將需要連接此事件處理程序:

在標記:

<asp:imagebutton click="ImageButton_Onclick" runat="server" id="displayYImgBtn" /> 

在後臺代碼:

public void Page_Init() { 
    displayYImgBtn.Click += ImageButton_OnClick; 
} 

在這兩種模式,應該創建你的按鈕,並且應該在回發時執行你的方法(當點擊按鈕時)。

如果您希望在觸發按鈕單擊事件之前設置其他配置信息,則需要在Page.Load事件或Page.Init事件期間執行此操作。無論您選擇何時接觸到您的控件並設置變量,您都不得以任何方式將其從回送狀態更改。如果ImageButton沒有像之前那樣格式化,您將不會收到回發事件。