天天看點

第十五講 GridView資料綁定控件(二)

主要内容

    續GridView控件使用講解

    1. 類似于在性别列中的True/false,如何在GridView控件中,将True/fase改成男/女呢?

        這裡又用到一個GridView中非常重要的事件:RowDataBound---在對行進行了資料綁定後激發的。即,如果被綁定的資料有10條,那個此事件将會被觸12次,為什麼呢?

        這是因為GridView控件有個列頭和列腳,在進行資料綁定時也同樣會觸發這個RowDataBound事件。

        注意:這個時候就要對性别字段進行資料處理了,那麼,按照上節所講,GridView控件的編輯列中,前六個字段功能單一,如BoundField,它隻能用于顯示資料,不能對資料進行處理操作,如果需要對資料進行特殊處理時,需要将其字段類型(BoundField),轉換成模闆字段(TemplateField)才行。

        如執行個體代碼:

        /// <summary>

        /// 控件中的資料轉換操作

        /// </summary>

        /// <param name="sender">事件源對象</param>

        /// <param name="e">事件源參數對象</param>

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

        {

            //因為此事件,會把GridView控件的列頭列腳作為觸發事件的源,是以在這裡

            //需要進行判斷以便過濾這兩個不必要的行

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

            {

                //DataControlRowType是個枚舉,它包含列頭(Header)列腳(Footer)

                //DataRow就是内容中的行資料類型

                //注意,因為GridView控件編輯列選項中的前六個字段功能單一,如:BoundField

                //它的功能隻是在列頭顯示資訊,如果需要其它的資料處理操作,需要将其先轉換成

                //TemplateField字段。進入編輯模闆就可以看到被轉換後的字段了,在Item Template項

                //模闆中預設使用了Label控件,隻是這個Label控件有了一定的智能。但它必竟還是一個

                //Label控件,由于修改了Label控件的ID屬性,是以有了下面的操作

                string sex = (e.Row.FindControl("lblSex") as Label).Text;

                if (sex == "True")//注意這裡的True是個字元串哦

                    (e.Row.FindControl("lblSex") as Label).Text = "男";

                else

                    (e.Row.FindControl("lblSex") as Label).Text = "女";

            }

        }

    2. GridView控件智能提示中的,添加新列,這裡執行個體操作的背景是,當使用者想要看到備注資訊的詳細資訊時,可以通過一個超連接配接進行檢視。

        1. 選擇字段類型HyperLinkField,這裡選擇是超連接配接文本就有了下面幾個選項

        2. 頁眉文本,顯示在列标題位置的文本資訊

        3. 超連接配接文本,使用者需要點選的文本超連接配接

        4. 超連接配接URL,連接配接的位址,這裡選擇是從資料字段擷取URL

            這一項下面有兩個需要填充地方:

            1. 是參數值(這裡可以使用學生的ID,stuID)

            2. 是URL格式的超連接配接字元串,如使用某頁面來顯示這個詳細資訊,StudentDetails.aspx?id={0} ,那字元串中的{0} 就是指向上面的參數stuID。隻是這裡沒有建立StuDetails.aspx這個頁面,來接收這個變量并進行查尋操作。

    3. GridView控件智能提示中的,添加新列,這一次操作的一個按鈕CommandField字段類型的。

        1. 選擇字段類型CommandField,它有下面幾個選項

        2. 頁眉文本,同上(你懂的)

        3. 按鈕類型(Link超連接配接樣式,或普通按鈕樣式)

        4. 指令按鈕,删除,編輯,選擇,顯示取消按鈕等,節省了手動從工具欄裡拖放按鈕的麻煩。

        注意:每個指令按鈕都有一個對應的事件哦。

        在這個執行個體中,添加了兩個按鈕,編輯和删除 以Link的樣式顯示

        在頁面中就會生成兩個超連接配接,那這兩個超連接配接就會觸發GridView的兩個事件,RowEditing,RowDeleting兩個事件,這個兩個事件就需要我們人為的手動去進行處理。

            1. 在RowEditing事件中,如何執行個體點選那一行的編輯按鈕就是将該行内容轉換為編輯狀态呢?

            這裡老師給的思路是前一節中提到的編輯模闆中的EditItem Template,這個編輯模闆,當單擊這個編輯按鈕時,GridView就會将Item Template這個項模闆轉換成EditItem Template編輯項模闆。

            那如問題所問,如何執行個體單擊那一行就轉換那一行呢?

            這裡是通過事件中的源參數對象攜帶的NewEditIndex屬性來指定的。

            即,GridView預轉換為編輯狀态的行索引= 參數對象攜帶的行索引

            this.GridView1.EditIndex=e.NewEditIndex;

            2. 為什麼需要單擊兩次編輯按鈕呢?

            當單擊編輯按鈕是,GridView隻是将項模闆轉換成編輯項模闆,而資料綁定隻是将資料加載到了項目模闆中,當轉換成編輯項模闆時,并沒有将資料加載到編輯項模闆。

            經測試證明,如果當将項模闆轉換到編輯模闆時再次加載資料綁定到編輯項模闆,此類現象即消除了。

            3. 點選編輯按鈕時,性别列的資料轉換會報錯?

            這個應該不難了解,那是因,資料轉換操作隻在項模闆中進行了轉換,RowDataBound事件中也隻是對Label标簽進轉換操作,當轉換到編輯項模闆時RowDataBound事件并沒有對其标簽進行擷取并做轉換操作,故有此報錯現象。

            在此,RowDataBound事件隻是老師說的,示範一下此事件的用法,必竟它是非常重要的。

            對于性别的轉換,最好的方法是在編輯模闆中的性别的Text屬性的自定義代碼進行三目運算符操作:

            Eval("stuSex").ToString()=="True"?"男":"女"

            注意:當進行資料類型轉換時,使用Eval方法。

    4. GridView控件的修改操作

    需要考慮某些列的特殊情況,如,學号是不能修改的,性别如何修改呢?因為它的值是True/false,不如男,女來的簡單。

    将所有的字段都轉換成模闆字段:

        1. 将學号的編輯項模闆中的文本框控件替換成Label控件就可以了。

        2. 改變編輯模闆中的控件顯示的尺寸,可以像WinForm中一樣,點選該控件,修改它的width屬性即可

        3. 同樣,在編輯模闆中的性别這項,它的編輯項模闆中的控件也可以替換成下拉式菜單DropDwonList控件,編輯控件的項,男和女,同時設定項對應的Value值。然後再在性别的DataBindings中的SelectedValues的代碼表達式中Bind("stuSex").這樣,當SelectedValues的值為True時,就顯示男,否則就顯示女了。

    5. GridView控件的取消操作

        取消按鈕關聯的GridView控件的RowCancelingEdit事件

        它就是将編輯項模闆再轉換成項模闆。

        即:this.GridView1.EditIndex=-1;即可

        記得還要再進一次資料綁定

    6. GridView控件的更新操作

        更新按鈕關聯的是GridView控件的RowUpDating事件

        1. 找出GridView中子控件的ID,擷取其文本值

            從GridView控件的行集合中索引到行,找到對應的控件ID,轉控件類型,通過轉換後的控件類型的屬性來擷取其攜帶的值

            如:int id =Convert.ToInt32((this.GridView1.Rows[e.RowIndex].FindControl("lblStuID") as Label).Text);

        2. 将值傳遞給資料庫進行更新

    7. 注意:這裡補充一點,我仿照老師的執行個體做,但是更新過程總是無法擷取修改後的資料,GridView控件中子控件的值,但是在公司操作就沒有問題,尋根究根,終于明白了是什麼原因?

        更新操作後要再加載一次資料,這時就發現,原來,我在頁面加載事件中沒有進行首次加載的判斷,即IsPostBack().

        原來,系統在執行是竟然先進行了重加載資料,再将子控件中的資料擷取到并指派給我的對象變量。卧槽,這個問題搞的我昨晚三點才睡覺,也沒有想明白。看了鑽牛角尖真是自做自受,停下來,搞點其它的事情做做,再回頭來看,可能思路就變幻過來了。