2012年6月30日 星期六

ASP.NET GridView上刪除欄位資料時,出現confirm box 確認視窗

DNOWBA在 ASP.NET webform上加上JavaScript對話框 已經寫過一個簡單的方法,是把刪除的確認視窗寫在html原始碼裡,如果是使用像GridView這類的控制項,在產生每個欄位的時候,就會自動調整GridView裡的小控制項。

如果要更靈活的和客戶端「互動」,把刪除哪份資料也在confirm 視窗裡頭提示,如下圖,在按下刪除按鈕的時候,顯示的confirm box會帶出刪除哪一篇文章的訊息(反白的文字就是標題),這樣的話更可以知道自已到底是按了哪個刪除按鈕,刪除資料前會更有保障。
image

那麼,我們可以把script寫在後置程式碼裡來完整控制。不過,愈是要「完整控制」,牽涉的程式碼愈複雜,我想這是免不了的,不過也因為這樣,我們可以學習更多的控制項內容…蠻有趣的。

寫程式碼之前:


在頁面上拉出GridView控制項並做好databind,啟用「刪除」的功能
編輯資料欄位,把自動生成的刪除commanfield轉換成templatefield

程式碼如下:

程式碼不長,但要解釋的東西還蠻多的

    Protected Sub GridView2_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView2.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim DELbutton As Button
            DELbutton = CType(e.Row.Cells(0).FindControl("Button1"), Button)
            DELbutton.Attributes.Add("onclick", "javascript: return confirm('你確定要刪除標題為「 " & e.Row.Cells(4).Text & "」的文章嗎?')")
        End If
    End Sub

行1 的RowDataBound事件

因為我們必須在畫面呈現之前,在每一個刪除按鈕上都綁上一個confirm box的JavaScript,所以這段程式「一定」要寫在RowDataBound事件,補充一下,要知道每個事件到底是在做什麼,在自已亂試一通之後,也可以去微軟文件庫MSDN裡看一下,像這樣的事件和網頁生命週期有一點關聯。
image

行2的 e.Row.RowType 代表的意思:

e 代表使用者點選的行為。
e.row 代表使用者點選GridView的某一列
e.row.type 代表使用者選擇的那列是什麼型態
DataControlRowType.DataRow

行2的 DataControlRowType.DataRow 代表的意思:


DataControlRowType在MSDN的解釋就是「指定資料控制項 (例如 DetailsViewGridView) 中之資料列的功能」,白話一點就是像GridView是用用table表格的外觀來呈現資料,所以會有很多不同功能的工作列(row)和其型態(rowtype),以下就是不同的row:
image

行2的if判別式 e.Row.RowType = DataControlRowType.DataRow 代表的意思:


就是確定當前行是否為數據行,即執行數據綁定的行,是在確保我們新增confirm 這個JavaScript,在GridView自動生成的時候,不會跑去header(表頭)、footer(表尾)、pager(分頁列)…等其他的row上面,這樣程式一定會出錯,因為在這些其他的列上面是找不到刪除控制項的。

行4 中e.Row.Cells的意思:

e 代表使用者點選的行為
e.row 代表使用者點選GridView裡的哪一列
e.row.cell( n ) 代表GridView 裡的第n欄,我們用下圖解釋
image
第一欄不是cells(1),是cells(0),電腦是從0開始算起的…我也不知道為什麼???

另一種寫法:

在說明行2~6為什麼要這樣寫時,我想先用另一種寫法來解釋比較恰當…
行2~6可以合在一起寫的,寫法如下:

CType(e.Row.Cells(0).FindControl("Button1"), Button).Attributes.Add("onclick", "javascript: return confirm('你確定要刪除標題為「 " & e.Row.Cells(4).Text & "」的文章嗎?')")

ctype在這裡的功能是要「抓取GridView中的刪除按鈕」,因為GridView在後置程式碼、原始程式碼的樣子和使用者看到的不大一樣,畢竟GridView的列數是在前端依資料庫變化的,所以一個GridView顯示列數不同,裡頭自動生成的刪除按鈕數量(和按鈕的id等參數)也不同…若要用中文解釋這個程式碼,就是:

找到(findcontrol)GridView這個大控制項裡的子控制項,位置在第一欄 (cells0) 名為button1的控制項,然後轉換(ctype)它為button物件,在前端加上名為onclick的參數並賦值(這邊給他JavaScript的值)

為什麼我們可以確定是找第一欄名為button1的控制項,這是因為我們在生成commandfield時,轉換button為templatefield,這個時候系統就自動給這個button一個專屬id了。
image

1 則留言:

  1. 寫的很清楚!!
    給我很大的幫助 感謝~

    回覆刪除

Related Posts Plugin for WordPress, Blogger...
// Dnow Function