【轉(zhuǎn)】RowDataBound事件(2009-02-12 14:43:24)轉(zhuǎn)載標(biāo)簽: it 分類: 技術(shù)類
【轉(zhuǎn)】RowDataBound事件
2008-12-25 14:22
RowDataBound事件
在創(chuàng)建gridView控件時(shí),必須先為GridView的每一行創(chuàng)建一個(gè)GridViewRow對(duì)象,創(chuàng)建每一行時(shí),將引發(fā)一個(gè)RowCreated事件;當(dāng)行創(chuàng)建完畢,每一行GridViewRow就要綁定數(shù)據(jù)源中的數(shù)據(jù),當(dāng)綁定完成后,將引發(fā)RowDataBound事件。如果說(shuō)我們可以利用RowCreated事件來(lái)控制每一行綁定的控件,那么我們同樣可以利用RowDataBound事件來(lái)控制每一行綁定的數(shù)據(jù),也就是讓數(shù)據(jù)如何呈現(xiàn)給大家。
還舉同樣的例子,在數(shù)據(jù)表中,存在性別列,上面我們用DropListDown控件的DataBounding來(lái)表示出了中文的性別,但是畢竟不太美觀,我們現(xiàn)在可以利用Label控件和RowDataBound事件來(lái)實(shí)現(xiàn)完美的中文性別顯示。RowDataBound,
首先,還是把性別列,設(shè)置為模板列,并添加一個(gè)Label控件,將Label控件綁定到數(shù)據(jù)源的性別段,然后我們?cè)贕ridView控件屬性的事件列表中雙擊RowDataBound,生成如下事件:
Example:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//判斷當(dāng)前行是否是數(shù)據(jù)行
if (e.Row.RowType == DataControlRowType.DataRow)
{ //用FindControl方法找到模板中的Label控件
Label lb1= (Label)e.Row.FindControl("Label1");
//因?yàn)镽owDataBound是發(fā)生在數(shù)據(jù)綁定之后,所以我們可以
//判斷Label綁定的數(shù)據(jù),如果是True,就更改其text屬性為男
if (lb1.Text== "True")
lb1.Text = "男";
else
lb1.Text = "female";
}
}
3、RowType
RowType可以確定GridView中行的類型,RowType是玫舉變量DataControlRowType中的一個(gè)值。RowType可以取值包括 DataRow、Footer、Header、EmptyDataRow、Pager、Separator。很多時(shí)候,我們需要判斷當(dāng)前是否是數(shù)據(jù)行,通過(guò)如下代碼來(lái)進(jìn)行判斷:
if (e.Row.RowType == DataControlRowType.DataRow)
4、RowDeleting和RowDeleted事件
RowDeleting發(fā)生在刪除數(shù)據(jù)之前,RowDeleted發(fā)生在刪除數(shù)據(jù)之后。
使用RowDeleting事件,可以在真正刪除前再次確認(rèn)是否刪除,可以通過(guò)設(shè)置GridViewDeleteEventArgs.Cancel=True來(lái)取消刪除;也可以用于判斷當(dāng)前數(shù)據(jù)庫(kù)記錄數(shù),如果只剩一條記錄且數(shù)據(jù)庫(kù)不能為空則提示并取消刪除操作。
使用RowDeleted事件,可以在刪除后,通過(guò)GridViewDeletedEventArgs的Exception屬性判斷刪除過(guò)程中是否產(chǎn)生異常,如無(wú)異常,則可以顯示類似于” 1 Records deleted” 之類的提示信息。
Example:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//取得當(dāng)前行號(hào),并取得當(dāng)前行的GridViewRow對(duì)象
int index=e.RowIndex ;
GridViewRow gvr=GridView1.Rows[index];
//取得當(dāng)前行第二個(gè)單元格中的文字
str1 = gvr.Cells[1].Text;
//進(jìn)行提示
Message.Text ="您將刪除一個(gè)用戶,其姓名為"+str1 ;
}
protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)
{
//如果沒(méi)有產(chǎn)生異常,則提示成功刪除,否則提示刪除失敗
if (e.Exception == null)
Message.Text += "<br>您成功刪除了"+str1 ;
else
Message.Text += "刪除失敗,請(qǐng)聯(lián)系管理員";
}
5、RowEditing事件
在GridView中的行進(jìn)入編輯模式之前,引發(fā)RowEditing事件,如果您需要在編輯記錄前進(jìn)行某些預(yù)處理,可以在這里操作。如果想取消對(duì)當(dāng)前行的編輯,可以把GridViewEditEventArgs 對(duì)象的 Cancel 屬性設(shè)置為 true即可。
Example:
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
//用NewEidIndex取得當(dāng)前編輯的行號(hào),然后獲取gridviewrow對(duì)象
GridViewRow gvr = GridView1.Rows[e.NewEditIndex];
//判斷,如果當(dāng)前編輯行姓名欄為admin用戶,則取消對(duì)當(dāng)前行的編輯
if (gvr.Cells[1].Text =="admin")
e.Cancel = true;
}
6、RowUpdating和RowUpdated事件
RowUpdating事件發(fā)生在更新數(shù)據(jù)源之前,RowUpdated發(fā)生在更新數(shù)據(jù)源之后。
我們可以在記錄更新前利用RowUpdating做一些預(yù)處理工作,比如修改密碼時(shí),因?yàn)槊艽a在數(shù)據(jù)庫(kù)中不是明文存儲(chǔ),進(jìn)行了hash,所以在更新密碼前,應(yīng)該生成其hash值,再進(jìn)行更新操作。RowUpdated則可以檢驗(yàn)更新是否成功。
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這個(gè)字典中
e.NewValues ["password"] =tb1.Text .GetHashCode().ToString () ;
}
protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
//如無(wú)異常,則更新成功
if (e.Exception == null)
Message.Text += "更新成功!";
}
7、Keys、OldValues、NewValues集合
Keys字典中一般存放的是數(shù)據(jù)源中的主鍵字段的key和value的對(duì)應(yīng)值,如果主鍵由多個(gè)字段組成,那么Keys為每個(gè)鍵字段添加其字段名稱和值。OldValues中存放的是要更新的行的字段名和原始值,每個(gè)字段為其中的一項(xiàng)。NewValues中存放的是要更新的行的字段名和修改后的值,每個(gè)字段為其中的一項(xiàng)。注意,主鍵字段只存放于keys集合中。
這三個(gè)集合中的每一項(xiàng)都是DictionaryEntry類型的對(duì)象,我們可以用DictionaryEntry.Key來(lái)確定一個(gè)項(xiàng)的字段名稱,用DictionaryEntry.Value來(lái)確定某項(xiàng)的值。
在上面的例子中,為了把密碼明文加密后再存入數(shù)據(jù)庫(kù),我們利用了NewValues字段,重新設(shè)置key為password的項(xiàng)的值。為了保證安全性,我們?cè)诟聰?shù)據(jù)前對(duì)NewValues中的所有值進(jìn)行html編碼:
Example1:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//遍歷NewValues,取得其中每一對(duì)DictionaryEntry對(duì)象
foreach (DictionaryEntry de in e.NewValues)
//de.key就是字段名,如果此處單獨(dú)更新某字段的話,也可以直接填寫(xiě)字段名,//比如 e.NewValues[“password”]
e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());
}
Example2:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//分別利用Keys、OldValues、NewValues取得主鍵名、原始數(shù)據(jù)和更新后數(shù)據(jù)
Message .Text = e.Keys["username"] + "的email地址從" + e.OldValues["email"] + "變更為" + e.NewValues["email"];
}