來源 http://www.allenkuo.com/GenericArticle/view1401.aspx
小舖上有人問了一則關於 DropDownList SelectedIndexChanged事件的問題
首先我們要先了解一些基本知識才能解決問題, DropDownList 被選取的值若有變動時, 會在 PostBack 之後觸發SelectedIndexChanged 事件。如果希望一改變值就立刻觸發, 可以設定 DropDownList 的 AutoPostBack 屬性為 true,便可以在一變動該值就立刻 PostBack。
DropDownList 是如何判斷要不要觸發SelectedIndexChanged 事件的呢?順序如下表所示
網頁 | 控制項 | 說明 |
LoadViewState | 控制項取得上一次的值 | |
LoadPostData | 控制項取得這一次的值,並用一個變數記下兩次的值是否相同 | |
Load | ||
RaisePostBackChangedEvent | 若兩次的值不同,就在此時觸發事件 | |
RaisePostBackEvent | Button 的Click ,Command事件在此時觸發 |
由上表可以得知以下結論:
- 在Page 的 Load 事件可以取得控制項最新的值
- 在Button 的 Click 事件也可以取得控制項最新的值
- DropDownList 的SelectedIndexChanged 事件是在 Page Load事件之後才觸發。
- 如果網頁裡同時放 DropDownList, Button 而且 DropDownList 控制項又沒有設定 AutoPostBack, 那麼事件觸發順序分別是 DropdownList的SelectedIndexChanged事件, 接下來才是 Button 的 Click 事件。
- 如果網頁裡同時放 DropDownList, Button 而且 DropDownList 控制項又沒有設定 AutoPostBack, 那麼選了新值才按 Button 時, 會觸發 DropdownList的SelectedIndexChanged事件以及 Button 的 Click 事件, 但若持續按Button 多次, 由於DropDownList值並沒有變動, 所以第二次以後只會觸發 Button Click 事件而已。
有了以上結論之後, 可以知道如果想取得 DropDownList 做為篩選值, 其實只需要在 Button Click 事件裡取得 DropDownList值並篩選記錄即可, 甚至連Session都不必用上就可以解決問題。
然而提問者是先在 DropDownList 的 SelectedIndexChanged事件裡找好篩選條件, 供稍後的 Button Click 事件取用, 這做法並不好, 因為若使用者沒改變 DropDownList值,只是重覆按 Button , 不會觸發 DropDownList 的SelectedIndexChanged事件, 就無法取得篩選條件了。
另一個讀者可能有的疑問是, 提問者在 DropDownList 的 SelectedIndexChanged事件組合好篩選條件後已存放在變數裡, 為何不會有做用呢? 那是因為若先選DropDownList 新值並按Button時, 程式會如提問者預期的執行。但第二次按下 Button時等於是再次 PostBack ,因此變數值早就又回歸到空字串了, 才會變成又再度顯示所有記錄。