GridView 控件可公開分頁事件和排序事件,以及在創建當前行或將當前行綁定至數據時發生的事件。單擊一個命令控件(例如,包含在 GridView 控件中作為其中的一部分的 Button 控件)時也會引發事件。下表描述了由 GridView 控件公開的事件。
RowCommand
在 GridView 控件中單擊某個按鈕時發生。此事件通常用于在該控件中單擊某個按鈕時執行某項任務。
- PageIndexChanging
-
在單擊頁導航按鈕時發生,但在 GridView 控件執行分頁操作之前。此事件通常用于取消分頁操作。
- PageIndexChanged
-
在單擊頁導航按鈕時發生,但在 GridView 控件執行分頁操作之后。此事件通常用于在用戶定位到該控件中不同的頁之后需要執行某項任務時。
- SelectedIndexChanging
-
在單擊 GridView 控件內某一行的 Select 按鈕(其 CommandName 屬性設置為“Select”的按鈕)時發生,但在 GridView 控件執行選擇操作之前。此事件通常用于取消選擇操作。
- SelectedIndexChanged
-
在單擊 GridView 控件內某一行的 Select 按鈕時發生,但在 GridView 控件執行選擇操作之后。此事件通常用于在選擇了該控件中的某行后執行某項任務。
- Sorting
-
在單擊某個用于對列進行排序的超鏈接時發生,但在 GridView 控件執行排序操作之前。此事件通常用于取消排序操作或執行自定義的排序例程。
- Sorted
-
在單擊某個用于對列進行排序的超鏈接時發生,但在 GridView 控件執行排序操作之后。此事件通常用于在用戶單擊對列進行排序的超鏈接之后執行某項任務。
- RowDataBound
-
在 GridView 控件中的某個行被綁定到一個數據記錄時發生。此事件通常用于在某個行被綁定到數據時修改該行的內容。
- RowCreated
-
在 GridView 控件中創建新行時發生。此事件通常用于在創建某個行時修改該行的布局或外觀。
- RowDeleting
-
在單擊 GridView 控件內某一行的 Delete 按鈕(其 CommandName 屬性設置為“Delete”的按鈕)時發生,但在 GridView 控件從數據源刪除記錄之前。此事件通常用于取消刪除操作。
- RowDeleted
-
在單擊 GridView 控件內某一行的 Delete 按鈕時發生,但在 GridView 控件從數據源刪除記錄之后。此事件通常用于檢查刪除操作的結果。
- RowEditing
-
在單擊 GridView 控件內某一行的 Edit 按鈕(其 CommandName 屬性設置為“Edit”的按鈕)時發生,但在 GridView 控件進入編輯模式之前。此事件通常用于取消編輯操作。
- RowCancelingEdit
-
在單擊 GridView 控件內某一行的 Cancel 按鈕(其 CommandName 屬性設置為“Cancel”的按鈕)時發生,但在 GridView 控件退出編輯模式之前。此事件通常用于停止取消操作。
- RowUpdating
-
在單擊 GridView 控件內某一行的 Update 按鈕(其 CommandName 屬性設置為“Update”的按鈕)時發生,但在 GridView 控件更新記錄之前。此事件通常用于取消更新操作。
- RowUpdated
-
在單擊 GridView 控件內某一行的 Update 按鈕時發生,但在 GridView 控件更新記錄之后。此事件通常用來檢查更新操作的結果。
- DataBound
-
此事件繼承自 BaseDataBoundControl 控件,在 GridView 控件完成到數據源的綁定后發生。
在創建gridView控件時,必須先為GridView的每一行創建一個GridViewRow對象,創建每一行時,將引發一個RowCreated事件;當行創建完畢,每一行GridViewRow就要綁定數據源中的數據,當綁定完成后,將引發RowDataBound事件。如果說我們可以利用RowCreated事件來控制每一行綁定的控件,那么我們同樣可以利用RowDataBound事件來控制每一行綁定的數據,也就是讓數據如何呈現給大家。
還舉同樣的例子,在數據表中,存在性別列,上面我們用DropListDown控件的DataBounding來表示出了中文的性別,但是畢竟不太美觀,我們現在可以利用Label控件和RowDataBound事件來實現完美的中文性別顯示。RowDataBound,
首先,還是把性別列,設置為模板列,并添加一個Label控件,將Label控件綁定到數據源的性別段,然后我們在GridView控件屬性的事件列表中雙擊RowDataBound,生成如下事件:
Example:
????protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//判斷當前行是否是數據行
????????if (e.Row.RowType == DataControlRowType.DataRow)
????????{??//用FindControl方法找到模板中的Label控件
Label lb1= (Label)e.Row.FindControl("Label1");
//因為RowDataBound是發生在數據綁定之后,所以我們可以
//判斷Label綁定的數據,如果是True,就更改其text屬性為男
????????????????if (lb1.Text== "True")
??????????????????????lb1.Text = "男";
????????????????else
??????????????????????lb1.Text = "female";
????????}
????}
?
3、RowType
RowType可以確定GridView中行的類型,RowType是玫舉變量DataControlRowType中的一個值。RowType可以取值包括 DataRow、Footer、Header、EmptyDataRow、Pager、Separator。很多時候,我們需要判斷當前是否是數據行,通過如下代碼來進行判斷:
???if (e.Row.RowType == DataControlRowType.DataRow)
?
4、RowDeleting和RowDeleted事件
RowDeleting發生在刪除數據之前,RowDeleted發生在刪除數據之后。
使用RowDeleting事件,可以在真正刪除前再次確認是否刪除,可以通過設置GridViewDeleteEventArgs.Cancel=True來取消刪除;也可以用于判斷當前數據庫記錄數,如果只剩一條記錄且數據庫不能為空則提示并取消刪除操作。
使用RowDeleted事件,可以在刪除后,通過GridViewDeletedEventArgs的Exception屬性判斷刪除過程中是否產生異常,如無異常,則可以顯示類似于” 1 Records deleted” 之類的提示信息。
Example:
????protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//取得當前行號,并取得當前行的GridViewRow對象
????????int index=e.RowIndex ;
????????GridViewRow gvr=GridView1.Rows[index];
//取得當前行第二個單元格中的文字
????????str1 = gvr.Cells[1].Text;
//進行提示
????????Message.Text??="您將刪除一個用戶,其姓名為"+str1 ;
????}
????protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
{
//如果沒有產生異常,則提示成功刪除,否則提示刪除失敗
????????if (e.Exception == null)
????????????Message.Text += "<br>您成功刪除了"+str1 ;
????????else
????????????Message.Text += "刪除失敗,請聯系管理員";
}
5、RowEditing事件
在GridView中的行進入編輯模式之前,引發RowEditing事件,如果您需要在編輯記錄前進行某些預處理,可以在這里操作。如果想取消對當前行的編輯,可以把GridViewEditEventArgs 對象的 Cancel 屬性設置為 true即可。
Example:
????protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
//用NewEidIndex取得當前編輯的行號,然后獲取gridviewrow對象
????????GridViewRow gvr = GridView1.Rows[e.NewEditIndex];
?
//判斷,如果當前編輯行姓名欄為admin用戶,則取消對當前行的編輯
????????if (gvr.Cells[1].Text =="admin")
????????????e.Cancel = true;
}
?
6、RowUpdating和RowUpdated事件
RowUpdating事件發生在更新數據源之前,RowUpdated發生在更新數據源之后。
我們可以在記錄更新前利用RowUpdating做一些預處理工作,比如修改密碼時,因為密碼在數據庫中不是明文存儲,進行了hash,所以在更新密碼前,應該生成其hash值,再進行更新操作。RowUpdated則可以檢驗更新是否成功。
Example:
????protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
????{
????????GridViewRow gvr = GridView1.Rows[GridView1 .EditIndex??];
//尋找輸入密碼的控件
????????TextBox tb1 = (TextBox)gvr.FindControl("tb_password");
//將此控件中的文本hash后,把password存入NewValues這個字典中
????????e.NewValues ["password"] =tb1.Text .GetHashCode().ToString () ;
?
????}
????protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
//如無異常,則更新成功
????????if (e.Exception == null)
????????????Message.Text += "更新成功!";
????}
?
7、Keys、OldValues、NewValues集合
Keys字典中一般存放的是數據源中的主鍵字段的key和value的對應值,如果主鍵由多個字段組成,那么Keys為每個鍵字段添加其字段名稱和值。OldValues中存放的是要更新的行的字段名和原始值,每個字段為其中的一項。NewValues中存放的是要更新的行的字段名和修改后的值,每個字段為其中的一項。注意,主鍵字段只存放于keys集合中。
這三個集合中的每一項都是DictionaryEntry類型的對象,我們可以用DictionaryEntry.Key來確定一個項的字段名稱,用DictionaryEntry.Value來確定某項的值。
在上面的例子中,為了把密碼明文加密后再存入數據庫,我們利用了NewValues字段,重新設置key為password的項的值。為了保證安全性,我們在更新數據前對NewValues中的所有值進行html編碼:
Example1:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//遍歷NewValues,取得其中每一對DictionaryEntry對象
???????foreach (DictionaryEntry de in e.NewValues)
?
//de.key就是字段名,如果此處單獨更新某字段的話,也可以直接填寫字段名,//比如 e.NewValues[“password”]
?
???????e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());
????}
?
Example2:
????protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//分別利用Keys、OldValues、NewValues取得主鍵名、原始數據和更新后數據
????????Message .Text??= e.Keys["username"] + "的email地址從" + e.OldValues["email"] + "變更為" + e.NewValues["email"];
}