如何為gridview控件裏的“刪除”列添加一個確認對話框?網上眾說紛紜,大致見到了三種解決方案,現歸納如下:
1、繼承Web.IO裏的button控件,為其實現一個IPostback的接口用於回調,具體代碼之複雜,隻有作者自己想體會吧……
2、在gridview的RowDataBound事件中,遍曆所有子控件,若屬於LinkButton類,且CommandName為“Delete”,就調用其Atributes.Add方法,添加一個onclick事件內含confirm語句,即
lb.Attributes.Add("onclick", "return confirm('您真的要刪除此行嗎?')");
這種做法效率低下而且代碼十分不雅。
3、目前已知的最簡潔的方法,如圖,在刪除按鈕的那一列屬性裏麵,把DeleteText屬性設為
<div id="de" onclick="JavaScript:return confirm('確定刪除嗎?')">刪除</div>
這個太強了,讚一個。

可問題是,.net輸出的html代碼如下:
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$GridView1','Delete$0')" style="color:#4A3C8C;"><div id="de" onclick="JavaScript:return confirm('確定刪除嗎?')">刪除</div></a>
為什麼內層<div>的onclick事件所返回的bool值能影響到外層<a>標簽的的語句是否被執行呢?
仔細想了想,以前用asp直接寫的刪除標簽是這個樣子的:
<a href="deleteUser.asp?id=xxx" onclick="return confirm('確定刪除嗎?')">刪除</a>
也就是說,onclick事件接受一個bool值,其決定了click事件是否被觸發。若click事件沒有被觸發,href內含的跳轉動作就不會生效。同理,之前的那段代碼中,<div>在<a>中,隻有先觸發<div>的click事件,<a>的跳轉動作才會生效。而我們在<div>的onclick事件中若選擇為其賦值false,隨即取消了<div>的click事件,也同時取消了<a>的跳轉。
之後,新的問題又來了。如果我們的CommandField中ButtonType是Button的話,這段代碼就失效了。我想了下,可以通過將其轉換為模板列的方式來解決。
先將該字段轉換成模板,然後編輯這個模板列,選中用於刪除的Button,將其onClientClick屬性設為
return confirm('您確認刪除要刪除麼?')
即可。