RowDataBound事件 在創建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, GridViewDeletedEventArgse)
{
//如果沒有產生異常,則提示成功刪除,否則提示刪除失敗
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, GridViewUpdatedEventArgse)
{
//如無異常,則更新成功
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"];
}