http://blog.kkbruce.net/2010/04/gridvieweventeventhandle.html#.Ut4P_tIVHcs

了解GRIDVIEW事件(EVENT)

GridView實在是非常好入門的控制項,讓我們可以知一解百,也就是說,你如果能完全了解GridView控制項,那其他類似的資料處理控制項你也差不多學完了,所以對GridView的投資是非常值得。 

除了要好好了解拉放之間滑鼠及Vistual Studio帶來的便利,我覺的學好GridView 事件,對學習ASP.NET有更重大的意義,一般控制項了不起就是Page_Load、Click、Change、Select這幾類,但GridView不同,因為它能幫你做好多好多事,所以他的事件就複雜很多,複雜不代表難。

GridView的事件多數都有前後之分(ing或ed結尾),這樣的事件流程讓我們可以對整個控制項或資料處理上有更靈活的操作,例如我要進行刪除作業:

刪除前 → 刪除中 → 刪除後

除了刪除中是我們無法操作的(因為刪除動作是在資料庫),我們可以在刪除前先做個Double Check,刪除後再Check一次及提示訊息。這是以前ASP所做不到的。「事件」可以說是ASP.NET一個很大的優勢,以下針對GridView事件做一個整理,而且每一個事件裡都把常用參數整理好,再加上一個小小範例,以後有GridView方面事件的問題,就可以直接查這篇,可以當成GridView事件快速入門篇。


RowCreated事件

01 ''' <summary>
02     ''' 建立 GridView 控制項中的資料列時發生。
03     ''' <summary>
04     ''' <remarks>必須先為控制項中的每個資料列建立 GridViewRow  物件,才能呈現 GridView 控制項。建立 GridView 控制項中的每個資料列時,會引發 RowCreated  事件。</remarks>
05     Protected Sub GridView1_RowCreated(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated
06         'e.Row:取得所建立或繫結(Binding)到資料的資料列。
07         'e.Row.Cells(i):i是數值,存取資料列的第i個儲存格。
08         'e.Row.RowType:在執行作業之前判斷資料列的型別。
10     End Sub

RowCommand事件(常用)

01 ''' <summary>
02     ''' 按一下 GridView 控制項中的按鈕時發生。
03     ''' </summary>
04     Protected Sub GridView1_RowCommand(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
05         '通常判斷e.CommandName與e.CommandArgument來進行一些額外的事件處理
06         'e.CommandName有些內建關鍵字,會引發特定行為與事件(http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridview.rowcommand%28v=VS.80%29.aspx)
07         'e.CommandName:取得自訂按鈕命令名稱
08         'e.CommandArgument:取得自訂按鈕命令引數
09         'e.CommandSource:存取引發事件的按鈕控制項
10
11         '自訂按鈕,命令名稱為"cancelSelected"
12         If e.CommandName = "cancelSelected" Then
13             GridView1.SelectedIndex = -1
14         End If
15     End Sub

我們自訂的命令名稱都需要在RowCommand事件做處理。例如GridView沒有取消選取的功能,我們就可以自訂按鈕,然後命名為cancelSelected,然後在RowCommand事件來進行取消選取的功能。

RowDataBound事件

01 ''' <summary>
02     ''' 資料列繫結(Binding)至 GridView 控制項中的資料時發生。
03     ''' </summary>
04     ''' <remarks>控制項中的每個資料列必須都繫結(Binding)至資料來源中的資料錄,才能呈現 GridView  控制項。資料列 (由 GridViewRow  物件表示) 繫結(Binding)至 GridView 控制項中的資料時,會引發 RowDataBound 事件。這可讓您提供事件處理方法,用於每次發生這個事件時執行自訂常式,例如修改繫結(Binding)至資料列之資料的值。GridViewRowEventArgs 物件會傳遞至事件處理方法,讓您存取正在繫結(Binding)之資料列的屬性。若要存取資料列中的特定儲存格,請使用 GridViewRowEventArgs 物件的 Cells 屬性。您可以使用 RowType 屬性決定繫結(Binding)那種資料列型別 (標頭資料列、資料列等)。</remarks>
05     Protected Sub GridView1_RowDataBound(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
06         'e.Row:取得所建立或繫結(Binding)到資料的資料列。
07         'e.Row.Cells(i):i是數值,存取資料列的第i個儲存格。
08         'e.Row.RowType:在執行作業之前判斷資料列的型別。
09         '1. DataRow:GridView 控制項中的資料列。(常用)
10         '2. Footer:GridView 控制項的頁尾資料列。
11         '3. Header:GridView 控制項的標頭資料列。
12         '4. EmptyDataRow:GridView 控制項中的空白資料列。
13         '5. Pager:GridView 控制項中的頁面巡覽列。
14         '6. Separator:GridView 控制項中的分隔列。
15
16         '如果資料的類型是「資料列DataRow」,第一個儲存格文字改為粗體。
17         If e.Row.RowType = DataControlRowType.DataRow Then
18             e.Row.Cells(1).Text = "<b>" & e.Row.Cells(1).Text & "</b>"
19         End If
20     End Sub

例如我們想幫GridView的每個刪除按鈕加上一段JavaScript,就必須寫在這裡。想像成DataSource把資料一列一列送給GridView,而每一列資料與資料列綁定時,就會發生RowDataBound事件(一列發生一次),所以如果你想做的事是對整個GridView產生作用(每個刪除按鈕),那就必須寫在RowDataBound事件。

刪除事件

01 ''' <summary>
02     ''' 按一下資料列的 [刪除] 按鈕時發生 (但在 GridView 控制項刪除資料列之前)。
03     ''' </summary>
04     Protected Sub GridView1_RowDeleting(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting
05         'e.Keys:取得欲刪除那筆資料的PK值。查看DataKeyNames屬性,就可以知道PK值有那些。
06         'e.Cancel:Boolean,True表示取消刪除動作。
07         'e.Values:取得要刪除那筆資料的"欄位值"
08         'e.RowIndex:目前要刪除這筆資料在GridView中的索引值。注意,Index及PK是不同東西。Index指的是排序順序,另外GridView有啟用分頁,假設每頁10筆,則第2頁第一筆資料的RowIndex是0非10。
09
10         If e.Keys("CustomerID") = "ALFKI" Then
11             Response.Write("此資料不能刪除!")
12             e.Cancel = True
13         End If
14     End Sub

如果你想手寫刪除程式,必須寫在RowDeleting事件。

01 ''' <summary>
02     ''' 按一下資料列的 [刪除] 按鈕時發生 (但在 GridView 控制項刪除資料列之後)。
03     ''' </summary>
04     Protected Sub GridView1_RowDeleted(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewDeletedEventArgs) Handles GridView1.RowDeleted
05         'e.AffectedRows:刪除筆數。
06         'e.Keys:取得欲刪除那筆資料的PK值。
07         'e.Values:取得要刪除那筆資料的"欄位值"。
08         'e.Exception:若刪除發生例外,可透過e.Exception取得例外相關資訊。
09         'e.ExceptionHandled:Boolean,當例外發生且e.ExceptionHandled沒有為True時,會值接在網頁上顯示例外的錯誤畫面。
10
11         '確認是否有刪除例外發生
12         If e.Exception Is Nothing Then
13             Response.Write("刪除" & e.AffectedRows & "筆資料:" & e.Keys("CustomerID") & "," & e.Values("CompanyName"))
14         Else
15             '不要產生錯誤畫面
16             e.ExceptionHandled = True
17             Response.Write(e.Exception.Message)
18         End If
19     End Sub

編輯事件

01 ''' <summary>
02     ''' 按一下資料列的 [編輯] 按鈕時發生 (但在 GridView 控制項進入編輯模式之前)。
03     ''' </summary>
04     ''' <remarks>RowEdit沒有ed事件(RowEdited),因為進入Edit模式後,是由RowUpdating/RowUpdated接手處理。</remarks>
05     Protected Sub GridView1_RowEditing(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing
06         'e.Cancel:Boolean,True表示取消編輯動作。
07         'e.NewEditIndex:取得或設定要編輯之資料列的索引。
08
09         '按下「編輯」按鈕的這一資料列(e.NewEditIndex)進入編輯模式
10         GridView1.EditIndex = e.NewEditIndex
11     End Sub
01 ''' <summary>
02     ''' 按一下處於編輯模式之資料列的 [取消] 按鈕時發生 (但在資料列結束編輯模式之前)。
03     ''' </summary>
04     Protected Sub GridView1_RowCancelingEdit(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles GridView1.RowCancelingEdit
05         'e.Cancel:Boolean,True表示取消編輯模式。
06         'e.RowIndex:目前要取消這筆資料在GridView中的索引值。
07
08         '取消編輯模式
09         'e.Cancel = True
10         '在VB中「-1」(負1)也有取消的意思
11         GridView1.EditIndex = -1
12     End Sub

更新事件

01 ''' <summary>
02     ''' 按一下資料列的 [更新] 按鈕時發生 (但在 GridView 控制項更新資料列之前)。
03     ''' </summary>
04     Protected Sub GridView1_RowUpdating(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
05         'e.Keys:取得欲更新那筆資料的PK值。
06         'e.Cancel:True表示取消更新動作。
07         'e.OldValues:取得更新那筆資料,除了PK欄位之外的原始值。
08         'e.NewValues:取得欲更新那筆資料,除了PK欄位之外的更新值。
09         'e.RowIndex:目前要更新這筆資料在GridView中的索引值。
10
11         Dim cmpName As String = Trim(e.NewValues("CompanyName"))
12         If cmpName.Length = 0 Then
13             Response.Write("公司名稱不可為空白")
14             e.Cancel = True
15         End If
16     End Sub

利用更新前做一些錯誤處理,避免不正確的資料進到資料庫中。或是手寫更新程式,也必須寫在這裡。

01 ''' <summary>
02     ''' 按一下資料列的 [更新] 按鈕時發生 (但在 GridView 控制項更新資料列之後)。
03     ''' </summary>
04     Protected Sub GridView1_RowUpdated(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewUpdatedEventArgs) Handles GridView1.RowUpdated
05         'e.AffectedRows:更新筆數。
06         'e.Keys:取得欲更新那筆資料的PK值。
07         'e.OldValues:取得更新那筆資料,除了PK欄位之外的原始值。
08         'e.NewValues:取得欲更新那筆資料,除了PK欄位之外的更新值。
09         'e.KeepInEditMode:Boolean,是否讓GridView維持在編輯模式。
10         'e.Exception:若更新發生例外,可透過e.Exception取得例外相關資訊。
11         'e.ExceptionHandled:Boolean,當例外發生且e.ExceptionHandled沒有為True時,會值接在網頁上顯示例外的錯誤畫面。
12
13         If e.Exception Is Nothing Then
14             Response.Write("成功更新 " & e.AffectedRows & " 筆資料.")
15         Else
16             e.ExceptionHandled = True
17             Response.Write(e.Exception.Message)
18             e.KeepInEditMode = True
19         End If
20     End Sub

分頁事件

01 ''' <summary>
02     ''' 按一下其中一個頁面巡覽區按鈕時發生 (但在 GridView 控制項處理分頁作業之前)。
03     ''' </summary>
04     ''' <remarks>以程式設計的方式設定 PageIndex  屬性時,不會引發這個事件。</remarks>
05     Protected Sub GridView1_PageIndexChanging(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
06         'e.Cancel:Boolean,True表示取消分頁選取模式。
07         'e.NewPageIndex:取得或設定要在 GridView  控制項中顯示的新頁面索引。
08
09         '按下「分頁」選擇,讓GridView顯示指定的分頁(e.NewPageIndex)
10         GridView1.PageIndex = e.NewPageIndex
11     End Sub
1 ''' <summary>
2     ''' 按一下其中一個頁面巡覽區按鈕時發生 (但在 GridView  控制項處理分頁作業之後)。
3     ''' </summary>
4     Protected Sub GridView1_PageIndexChanged(ByVal sender As ObjectByVal As System.EventArgs) HandlesGridView1.PageIndexChanged
5         '在產生「Page 1 of 10 .」的提示資訊。
6         Response.Write("Page " & (GridView1.PageIndex + 1).ToString() & " of " & GridView1.PageCount.ToString() & ".")
7     End Sub

選取

01 ''' <summary>
02     ''' 按一下資料列的 [選取] 按鈕時發生 (但在 GridView 控制項處理選取作業之前)。
03     ''' </summary>
04     ''' <remarks>以程式設計的方式設定 SelectedIndex  屬性時,不會引發這個事件。</remarks>
05     Protected Sub GridView1_SelectedIndexChanging(ByVal sender As ObjectByVal AsSystem.Web.UI.WebControls.GridViewSelectEventArgs) Handles GridView1.SelectedIndexChanging
06         'e.NewSelectedIndex:取得或設定要在 GridView  控制項中選取之新資料列的索引。
07         'e.Cancel:Boolean,True表示取消選取事件。
08
09         '按下「選取」按鈕的這一資料列(e.NewSelectedIndex)進入選取模式
10         GridView1.SelectedIndex = e.NewSelectedIndex
11         '另一種寫法
12         'GridView1.SelectedIndex = GridView1.SelectedIndex
13     End Sub
1 ''' <summary>
2     ''' 按一下資料列的 [選取] 按鈕時發生 (但在 GridView 控制項處理選取作業之後)。
3     ''' </summary>
4     Protected Sub GridView1_SelectedIndexChanged(ByVal sender As ObjectByVal As System.EventArgs) HandlesGridView1.SelectedIndexChanged
5         '在選取完成後,顯示所選取資料列第三個儲存格(Cells從0開始計算)的資料。
6         Response.Write("You selected: " & GridView1.SelectedRow.Cells(2).ToString() & ".")
7     End Sub

排序事件

01 ''' <summary>
02     ''' 按一下排序資料行的超連結時發生 (但在 GridView 控制項處理排序作業之前)。
03     ''' </summary>
04     ''' <remarks>按一下排序資料行的超連結時,會引發 Sorting 事件 (但在 GridView 控制項處理排序作業之前)。</remarks>
05     Protected Sub GridView1_Sorting(ByVal sender As ObjectByVal As System.Web.UI.WebControls.GridViewSortEventArgs)Handles GridView1.Sorting
06         'e.Cancel:Boolean,True表示取消排序事件。
07         'e.SortDirection:取得或設定排序 GridView  控制項的排序方向。
08         'e.SortDirection.Ascending():小到大,A~Z。
09         'e.SortDirection.Descending():大到小:Z~A。
10         'e.SortExpression:取得或設定運算式,用來排序 GridView 控制項中的項目。
11
12         '切換大小排序
13         If e.SortDirection = SortDirection.Ascending Then
14             e.SortDirection = SortDirection.Descending
15         Else
16             e.SortDirection = SortDirection.Ascending
17         End If
18
19         '欄位Brithday不能排序
20         If e.SortExpression = "Birthday" Then
21             e.Cancel = True
22             Response.Write("You cannot sort by Birthday.")
23         End If
24     End Sub
1 ''' <summary>
2     ''' 按一下排序資料行的超連結時發生 (但在 GridView 控制項處理排序作業之後)。
3     ''' </summary>
4     Protected Sub GridView1_Sorted(ByVal sender As ObjectByVal As System.EventArgs) Handles GridView1.Sorted
5         '顯示排序方法及排序欄位
6         Response.Write("Sorting by " & GridView1.SortExpression.ToString() & " in " & GridView1.SortDirection.ToString() & " order.")
7     End Sub