GridView學習

iDotNetSpace發表於2008-09-24
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";

        }

    }

 

3RowType

RowType可以確定GridView中行的型別,RowType是玫舉變數DataControlRowType中的一個值。RowType可以取值包括 DataRowFooterHeaderEmptyDataRowPagerSeparator。很多時候,我們需要判斷當前是否是資料行,通過如下程式碼來進行判斷 :

   if (e.Row.RowType == DataControlRowType.DataRow)

 

4RowDeletingRowDeleted事件

RowDeleting發生在刪除資料之前,RowDeleted發生在刪除資料之後。

使用RowDeleting事件,可以在真正刪除前再次確認是否刪除,可以通過設定GridViewDeleteEventArgs.Cancel=True來取消刪除;也可以用於判斷當前資料庫記錄數,如果只剩一條記錄且資料庫不能為空則提示並取消刪除操作。

使用RowDeleted事件,可以在刪除後,通過GridViewDeletedEventArgsException屬性判斷刪除過程中是否產生異常,如無異常,則可以顯示類似於” 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 += "
您成功刪除了"+str1 ;

        else

            Message.Text += "刪除失敗,請聯絡管理員";

}

5RowEditing事件

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;

}

 

6RowUpdatingRowUpdated事件

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 += "更新成功!";

    }

 

7KeysOldValuesNewValues集合

Keys字典中一般存放的是資料來源中的主鍵欄位的keyvalue的對應值,如果主鍵由多個欄位組成,那麼Keys為每個鍵欄位新增其欄位名稱和值。OldValues中存放的是要更新的行的欄位名和原始值,每個欄位為其中的一項。NewValues中存放的是要更新的行的欄位名和修改後的值,每個欄位為其中的一項。注意,主鍵欄位只存放於keys集合中。

這三個集合中的每一項都是DictionaryEntry型別的物件,我們可以用DictionaryEntry.Key來確定一個項的欄位名稱,DictionaryEntry.Value來確定某項的值。

在上面的例子中,為了把密碼明文加密後再存入資料庫,我們利用了NewValues欄位,重新設定keypassword的項的值。為了保證安全性,我們在更新資料前對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)

{

//分別利用KeysOldValuesNewValues取得主鍵名、原始資料和更新後資料

        Message .Text  = e.Keys["username"] + "email地址從" + e.OldValues["email"] + "變更為" + e.NewValues["email"];

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-462847/,如需轉載,請註明出處,否則將追究法律責任。

相關文章