2010年8月22日 星期日

ImageButton 似乎跟 Repeater、DataList、GridView 不合

最近為了讓網頁變得花俏,所以每個按鈕都有專屬的一張圖使用,不過是按鈕放張圖而已嘛~
但跑出的結果,卻讓人噴飯 >_<
「無效的回傳或回呼引數」,這就是美麗的代價嗎?

我本來是要做上圖的功能,透過 Repeater ,並在每一個資料列中放「刪除」按鈕,執行刪除後就會重新更新一次資料。

所以在 Page_Load( ) 事件,就沒有將繫結 Repeater 的動作包在 if(!IsPostBack) 的判斷式中。我曾經試著用錯誤畫面裡的建議,將 <%@ Page 裡的  EnableEventValidation 屬性設為 false 。雖然這動作可以避免產生「無效的回傳或回呼引數」錯誤訊息,但是原先針對「刪除」按鈕的事件動作卻變成不會被觸發,真是折磨人啊!

我決定,要去抓個墊背來試試...
我就棄 ImageButton 改用 Button 試試。發現他一樣有這種現象。
接著測試  LinkButton ,成功了!這三個Button 兄弟,總算有一個有出息,沒有全軍覆沒。

可是,使用 LinkButton,有沒有辦法放圖呢?於是,把腦筋動到他的 Text 屬性,把 <img src=btn_delete2.jpg border=0 /> 寫到 Text 屬性裡,發現竟然可以哩~

今天發生的這種現象,並非只存在於 Repeater ,DataList 、 GridView 也是都這樣。為何以前自己沒注意到有這現象發生,這就在於繫結資料的動作,以前我都習慣將他放到 if(!IsPostBack) 判斷式裡,還有另一種可能,就是 ... 程式寫太少啦,你這懶鬼 !!!

測試檔案下載

網路上相同受害者

2 則留言:

  1. 嗯,好像沒注意到會發生這種錯耶!!真厲害。
    但我的做法,都還是會將繫結的動作放在 if(!IsPostBack)裡,
    只是都另外包成一個「BindData()」的fun,當按了刪除按鈕後~~再重新呼叫一次BindData(),以達到此效果。

    回覆刪除
  2. 剛好有個機會,是 Repeater 裡包 asp:checkbox ,同時也將他的 autopostback 設為 true。此時如果再把這 repeater 的 databind 動作移到 if(!IsPostBack) 外面,同樣也會出現上面的錯誤訊息

    回覆刪除