2009-04-23 61 views
3

在Page_Init上,我創建了一個基於幾個數據庫表的動態創建控件的表。其中一個控件是用於將列表項移動到列表中的ImageButton。此事件處理程序執行的操作是更新數據庫中的SortOrder列以查找受影響的項目。如何在事件處理後更新頁面數據?

現在的問題是,由於控件是在Page_Init事件中創建的,而SortOrder稍後會在ImageButton命令事件觸發時更新。使用正確的SortOrder更新表格的最佳步驟是什麼?如果在事件觸發後重新創建表格,則ImageButton命令事件不再起作用。

  • 我應該實現一種方法來更新表中的數據而不重新創建嗎?
  • 事件發生後,我應該在代碼中重新加載頁面嗎?

解決此問題的最佳方法是什麼?

回答

8

頁的事件,如InitLoad將引發該回發事件處理程序之前總是閃光。這是Page lifecycle的基礎(對於Peter Bromberg的視覺表示,see here)。大多數新開發ASP.NET的開發人員都有一個主要的問題理解和適當處理這個「尷尬」。

做到這一點,理想的方式是:

一個。你的Page_Init應該調用一個程序(我們將其稱爲BindData())以處理基於數據庫數據的表的創建。此方法與綁定數據庫數據並基於該綁定呈現UI元素的綁定方法類似。 IOW,您應該從Page_Init方法中刪除表格創建代碼,並將其置於一個單獨的方法中,以便在需要時調用它。

重要注意事項:這個BindData()方法還處理動態創建的ImageButton控件的事件處理程序附加到控件。我們將這稱爲ImageButton_Click。這對控制事件在隨後的回發中觸發至關重要。

b。當您的ImageButton_Click方法執行時,它會調用BindData()方法來重新創建表及其綁定,但會使用新的排序順序規則。

因此,在第一負載執行的順序是:

  1. Page_Init
  2. BindData()

上後續加載執行(在回發)的順序爲:

  1. Page_Init
  2. BindData() - 附加ImageButton的事件處理程序。
  3. ImageButton_Click
  4. BindData()
4

你需要像這樣...

  • 的OnInit(的IsPostBack = FALSE)
    • 動態創建的ImageButton
    • Wireup ImageButton的事件處理程序
    • 負載表 - 檢查一會話/變量中的排序順序。如果沒有;使用默認

點擊按鈕

  • 的OnInit(的IsPostBack = TRUE /第一回發)

    • 動態地重新創造的ImageButton
    • Wireup的ImageButton事件處理程序
    • 負載表 - 與默認的排序順序
  • ImageButton_OnClick(還是一樣第一次回傳)

    • 刷新表 - 與特定的排序順序
    • 保存在ViewState中/ Session變量這種順序變量

造成一些其他回傳

  • 的OnInit(的IsPostBack = TRUE /第二&隨後回發)
    • 動態創建的ImageButton
    • Wireup ImageButton的事件處理程序
    • 負載表 - 檢查會話/變量中的排序順序。如果找到了,使用它。
+0

心靈感應,我告訴你! +1 – Cerebrus 2009-04-23 08:12:37

1

首先,你似乎是手工綁定數據到UI控件。在Asp.Net中有許多方法可以避免使用內置的數據綁定技術。像GridView這樣的許多控件允許從給定的數據源自動創建Html表。還有許多其他選項,包括中繼器。

但是,您確實選擇綁定數據,該技術是在每次通過頁面生命週期的某個時間點重新綁定。

你需要......

  1. 綁定的排序順序已經改變之後,你在第一頁的負荷信息與默認的排序順序
  2. 重新綁定在圖像按鈕的事件處理程序中的數據。

的代碼會是這個樣子......

private void Page_Load (...) 
{ 
    if (!IsPostBack) 
     //On First Load 
     BindData(defaultSoortOrder); 
    else 
     BindData(currentSortOrder);    
} 

private void ImageButton_Click (...) 
{ 
    currentSortOrder = newSortOrder; 
    BindData(currentSortOrder); 
} 

如果點擊圖像按鈕,你將最終調用BindData兩次。但這是必要的,因爲頁面回發可以從任何控件啓動,您需要始終確保在頁面加載時綁定數據。

相關問題