GridView詳解

來源:互聯網
上載者:User
寫在前面asp.NET2.0中GridView恐怕是我們用得最多的一個資料清單控制項了(與此相當的是Repeater)
下面從設定它的資料來源到它的資料繫結,再到它的顯示設定來說說GridView的用法.(可以看出本文實在只是個總結貼,沒啥技術含量,歡迎大家補充說明)

 

No.1 資料來源:
    對於GridView來說,只要是序列化的資料都可以作為資料來源.比如對象數組/XML/Table等等,只要你能想象到的,可以轉化成一張表的東西.
    如果圖省心的話,可以配合DataSource控制項來使用它,那麼對資料的操作就可以集中在DataSource中處理,雙劍合璧挖,省時又省心.
其綁定資料來源的步驟就是:1.指定資料來源:gridview.Datasource=xxx;2.綁定資料來源:gridview.DataBind();

No.2 資料的綁定:
    GridView在我們綁定資料來源之後會預設自動根據資料產生列,但是有時候,我們會手動指定資料來源而不用DataSource控制項,並且需要更多樣化的資料繫結和控制,所以,使用模板列來綁定資料,並對模版內的控制項定位就成了關鍵:(這裡我把用GridView內建資料行繫結資料省略掉了,如果有時間,我會把這裡放在本文的最下面的附錄裡)

    1.設定模板列
    在Design(設計)模式下,GridView右上方有個小三角,點擊它就可以對GridView進行更多操作,比如對列進行編輯;如果添加了模板列的話,還可以在這裡對模板列進行編輯.

    在"顯示"這裡,點擊下拉式清單,選擇Item Template(這裡是主要的顯示處,所放進來的東西會在GridView的普通狀態下顯示),我們可以隨便往裡面填什麼(基本上所有可以顯示資料的控制項都可以放進來協助我們綁定並顯示資料).
    比如我們拖進來一個Label,然後點擊Label右上方的小三角就可以設定其的資料繫結了.
    如果用一個設定好的DataSource控制項做資料來源,那麼就可以直接在裡面選擇要綁定的欄位及其顯示格式,系統幫我們自動產生代碼;
    如果是自己指定資料來源.....那麼我們就只好自己來設定綁定了,可以在這裡直接輸入Eval("需要顯示的欄位"),也可以切換到代碼,在裡面寫.對於Label來說,可能的寫法是:<asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>.
    自己書寫<%# Eval("id") %>最大的好處就是:我們可以任意在裡面填寫我們所需要的代碼!比如:<%# Convert.ToString(Convert.ToInt32( Eval("id") )+100)%>
    瞧,這意味著我們可以對該繫結資料進行一定的修飾,然後再顯示.如果該資料控制項是一個類似GridView的可以幫定資料列的,那麼我們甚至可以給它指定一個返回資料來源的函數!

    在"顯示"這裡,點擊下拉式清單,選擇EditItem Template(所放進來的東西會在GridView的編輯狀態下顯示--即GridView.EditIndex等於該行時),我們需要往裡面放我們希望在編輯該資料時要顯示的東西,比如一個TextBox(在這裡,同樣可以給控制項指定要繫結資料).
     代碼可能是這樣的:<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("id") %>'></asp:TextBox>
     然後GridView裡面的全部代碼可能是這樣的:
         <Columns>
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("id") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="True" />
            </Columns>
    給GridView添加一個RowEditing事件:
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        this.GridView1.EditIndex = e.NewEditIndex;
    }
    運行一下,顯示正常,點擊Edit會發現顯示的資料被放進了一個TexBox,這樣我們就可以對它進行編輯了.

    2.在GridView的RowDataBound事件中,設定詳細的綁定資料
    在上面我們使用模板列來控制資料繫結以後基本上可以控制大部分資料的詳細顯示了.但是可能有人覺得這樣寫不太好看(頁面和代碼根本沒分離嘛),或者我們在GridView裡使用了UserControl而帶來的綁定錯誤(因為在GridView給控制項綁定資料時,UserControl還沒有初始化)等原因,所以可以在這個事件裡進行詳細的綁定設定.
    從名字上就可以知道,該事件是GridView的一行被綁定後才觸發的.由於具體的行綁定涉及到行內資料的定位,所以就放在下面來說明如何使用RowDataBound,在這裡,我們大概說下它的過程:首驗證傳回的e.Row是否被建立完全,然後從e.Row裡用FindControl(ControlID)來擷取ID為ControlID的控制項,最後給控制項賦值即可.需要注意的是,如果用的是GridView內建的列,則在RowDataBound中就是不同的方法來尋找了.
    由於資料的綁定完全在後台代碼中實現,我們可以更加自由地去修改和綁定資料了.

No.3 GriView中的控制項/資料定位:
     在GridView中尋找一個資料並不是簡簡單單地一個this.GridView1.XXX那麼簡單,因為畢竟我們在後台寫代碼的時候,GridView裡面的資料/資料範本還沒有產生呐.所以一般來說,我們採用的方法是先確定該資料/資料範本所在的行,然後根據其類型來從該行提取它(在這裡我們就可以看到,這也是一個假定該行已經被完全建立,且該行包含我們要找的資料/資料範本----因此使用的時候請首先確認執行該代碼前,代碼所需要的行已經被建立).
     要擷取GridView自產生的列,可以用this.GridView1.Rows[index].Cells[index].Text;
     而模版列,則要用this.GridView1.Rows[index].Cells[index].FindControl(string ControlID)或者是this.GridView1.Rows[index].FindControl(string ControlID).
     檢查GridView的行是否被建立,可以用Row.RowType == DataControlRowType.DataRow(其中Row是我們要檢驗的GridView行).

     下面介紹常用的2種定位,各有各的優缺點,使用事件常常得到的是一個行,而使用Button控制項的資料繫結則可以根據綁定的不同得到特定的資料.
    1.使用GridView內建事件進行定位:
        下面我列出可能用到的事件(這裡預設控制項名為GridView1)
    protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
         //用GridView的Select列時,可以使用這個方法
        //e.NewSelectedIndex;//當前要選擇的行,擷取的是GridView當前頁的index
    }
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //this.GridView1.SelectedValue.ToString();
        //當前要選擇的行的DataKeys,擷取的是GridView當前頁的DataKeys,
        //比如可以設定GridView的DataKeys是資料來源裡的"ID"那麼這裡擷取的就是當前選中行的資料的ID.
        //需要注意的是,SelectedValue只有在SelectedIndexChanged中才有值,其他時候是null;
    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //e.RowIndex;//當前要提交的行,擷取的是GridView當前頁的index
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        //e.NewEditIndex;//當前要編輯的行,擷取的是GridView當前頁的index
    }
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        //e.RowIndex;//當前要刪除的行,擷取的是GridView當前頁的index
    }
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        //e.RowIndex;//當前要撤消編輯的行,擷取的是GridView當前頁的index
    }
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        //e.NewPageIndex;//當前要到的頁,擷取的是GridView要切換頁的index
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex != GridView1.EditIndex)
        {
            //e.Row;//當前已經產生,並綁定好資料的行;
        }
    }
    2.使用Button中的CommandArgument屬性來綁定ID,進而擷取要編輯、刪除、提交、選擇的行.
        比如可能的代碼是這樣的:<asp:Button ID="Button1" runat="server" CommandArgument='<%# Eval("id") %>'
                         onclick="Button1_Click" Text="Button" />
        然後在Button1_Click這個事件中,我們就可以用((Button)sender).CommandArgument來獲得繫結資料
    3.使用GridView.XXX來進行定位.
        問題回來了,現在我們要討論的是如何用GridView這種常用而又熟悉的方式來從GridView中擷取我們想要的資料.
        在GridView中,可以存放2種資料:一種可以顯示出來的,呈現給我們的是一個表格形式,那就是我們通常所使用GridView.Row或者Column來擷取到的;一種是不顯示的,但是我們可以在後台使用,可以使用GridView.DataKeys來設定和擷取其值;
        不管是哪種資料,只要不是GridView的屬性,就需要我們在GridView完全產生以後才能擷取.
        1)資料表格
         就像前面所說,GridView僅僅將資料產生了一個表格,所以擷取的方式無非就是GridView.Row(GridView.Column主要用來設定整個列的屬性,所以一般不用來擷取裡面的值),下面就是一個例子,我給每行的第2列中的btnAdd這個Button添加一個小屬性:
         foreach (GridViewRow gr in GridView)
        {
            ((Button)gr.Cells[1].FindControl("Button")).Attributes.Add("onclick", "alert('Clicked me!')");
        }
        2)DataKeys
         如果是DataKeys中的資料,那麼就可以直接使用GridView.DataKeys[編號或者綁定的Key的名稱]來擷取.比如我在開始的時候設定GridView.DataKeyNames="id";那麼等到所有資料繫結完成後,就可以用GridView.DataKeys["id"]來擷取該行資料id的值了.
         這樣的好處是顯而易見的,如果我希望能擷取該行的特定欄位值,而又不讓其在頁面上顯示,那麼這種方法最好不過了.
     基本先說到這兒,其他的以後再加,歡迎大家討論和提點意見

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.