asp.NET2.0中GridView恐怕是我們用得最多的一個(gè)數(shù)據(jù)列表控件了(與此相當(dāng)?shù)氖荝epeater)
下面從設(shè)置它的數(shù)據(jù)源到它的數(shù)據(jù)綁定,再到它的顯示設(shè)置來(lái)說(shuō)說(shuō)GridView的用法.(可以看出本文實(shí)在只是個(gè)總結(jié)貼,沒(méi)啥技術(shù)含量,歡迎大家補(bǔ)充說(shuō)明)
No.1 數(shù)據(jù)源:
對(duì)于GridView來(lái)說(shuō),只要是序列化的數(shù)據(jù)都可以作為數(shù)據(jù)源.比如對(duì)象數(shù)組/XML/Table等等,只要你能想象到的,可以轉(zhuǎn)化成一張表的東西.
如果圖省心的話,可以配合DataSource控件來(lái)使用它,那么對(duì)數(shù)據(jù)的操作就可以集中在DataSource中處理,雙劍合璧挖,省時(shí)又省心.
其綁定數(shù)據(jù)源的步驟就是:1.指定數(shù)據(jù)源:gridview.Datasource=xxx;2.綁定數(shù)據(jù)源:gridview.DataBind();
No.2 數(shù)據(jù)的綁定:
GridView在我們綁定數(shù)據(jù)源之后會(huì)默認(rèn)自動(dòng)根據(jù)數(shù)據(jù)生成列,但是有時(shí)候,我們會(huì)手動(dòng)指定數(shù)據(jù)源而不用DataSource控件,并且需要更多樣化的數(shù)據(jù)綁定和控制,所以,使用模板列來(lái)綁定數(shù)據(jù),并對(duì)模版內(nèi)的控件定位就成了關(guān)鍵:(這里我把用GridView自帶列綁定數(shù)據(jù)省略掉了,如果有時(shí)間,我會(huì)把這里放在本文的最下面的附錄里)
1.設(shè)置模板列
在Design(設(shè)計(jì))模式下,GridView右上角有個(gè)小三角,點(diǎn)擊它就可以對(duì)GridView進(jìn)行更多操作,比如對(duì)列進(jìn)行編輯;如果添加了模板列的話,還可以在這里對(duì)模板列進(jìn)行編輯.
在"顯示"這里,點(diǎn)擊下拉列表,選擇Item Template(這里是主要的顯示處,所放進(jìn)來(lái)的東西會(huì)在GridView的普通狀態(tài)下顯示),我們可以隨便往里面填什么(基本上所有可以顯示數(shù)據(jù)的控件都可以放進(jìn)來(lái)幫助我們綁定并顯示數(shù)據(jù)).
比如我們拖進(jìn)來(lái)一個(gè)Label,然后點(diǎn)擊Label右上角的小三角就可以設(shè)置其的數(shù)據(jù)綁定了.
如果用一個(gè)設(shè)置好的DataSource控件做數(shù)據(jù)源,那么就可以直接在里面選擇要綁定的字段及其顯示格式,系統(tǒng)幫我們自動(dòng)生成代碼;
如果是自己指定數(shù)據(jù)源.....那么我們就只好自己來(lái)設(shè)置綁定了,可以在這里直接輸入("需要顯示的字段"),也可以切換到代碼,在里面寫.對(duì)于Label來(lái)說(shuō),可能的寫法是:<asp:Label ID="Label1" runat="server" Text='<%# ("id") %>'></asp:Label>.
自己書寫<%# ("id") %>最大的好處就是:我們可以任意在里面填寫我們所需要的代碼!比如:<%# Convert.ToString(Convert.ToInt32( ("id") )+100)%>
瞧,這意味著我們可以對(duì)該綁定的數(shù)據(jù)進(jìn)行一定的修飾,然后再顯示.如果該數(shù)據(jù)控件是一個(gè)類似GridView的可以幫定數(shù)據(jù)列的,那么我們甚至可以給它指定一個(gè)返回?cái)?shù)據(jù)源的函數(shù)!
在"顯示"這里,點(diǎn)擊下拉列表,選擇EditItem Template(所放進(jìn)來(lái)的東西會(huì)在GridView的編輯狀態(tài)下顯示--即GridView.EditIndex等于該行時(shí)),我們需要往里面放我們希望在編輯該數(shù)據(jù)時(shí)要顯示的東西,比如一個(gè)TextBox(在這里,同樣可以給控件指定要綁定的數(shù)據(jù)).
代碼可能是這樣的:<asp:TextBox ID="TextBox1" runat="server" Text='<%# ("id") %>'></asp:TextBox>
然后GridView里面的全部代碼可能是這樣的:
<Columns>
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# ("id") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# ("id") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" />
</Columns>
給GridView添加一個(gè)RowEditing事件:
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
this.GridView1.EditIndex = e.NewEditIndex;
}
運(yùn)行一下,顯示正常,點(diǎn)擊Edit會(huì)發(fā)現(xiàn)顯示的數(shù)據(jù)被放進(jìn)了一個(gè)TexBox,這樣我們就可以對(duì)它進(jìn)行編輯了.
2.在GridView的RowDataBound事件中,設(shè)置詳細(xì)的綁定數(shù)據(jù)
在上面我們使用模板列來(lái)控制數(shù)據(jù)綁定以后基本上可以控制大部分?jǐn)?shù)據(jù)的詳細(xì)顯示了.但是可能有人覺得這樣寫不太好看(頁(yè)面和代碼根本沒(méi)分離嘛),或者我們?cè)贕ridView里使用了UserControl而帶來(lái)的綁定錯(cuò)誤(因?yàn)樵贕ridView給控件綁定數(shù)據(jù)時(shí),UserControl還沒(méi)有初始化)等原因,所以可以在這個(gè)事件里進(jìn)行詳細(xì)的綁定設(shè)置.
從名字上就可以知道,該事件是GridView的一行被綁定后才觸發(fā)的.由于具體的行綁定涉及到行內(nèi)數(shù)據(jù)的定位,所以就放在下面來(lái)說(shuō)明如何使用RowDataBound,在這里,我們大概說(shuō)下它的過(guò)程:首驗(yàn)證傳回的e.Row是否被創(chuàng)建完全,然后從e.Row里用FindControl(ControlID)來(lái)獲取ID為ControlID的控件,最后給控件賦值即可.需要注意的是,如果用的是GridView自帶的列,則在RowDataBound中就是不同的方法來(lái)尋找了.
由于數(shù)據(jù)的綁定完全在后臺(tái)代碼中實(shí)現(xiàn),我們可以更加自由地去修改和綁定數(shù)據(jù)了.
No.3 GriView中的控件/數(shù)據(jù)定位:
在GridView中尋找一個(gè)數(shù)據(jù)并不是簡(jiǎn)簡(jiǎn)單單地一個(gè)this.GridView1.XXX那么簡(jiǎn)單,因?yàn)楫吘刮覀冊(cè)诤笈_(tái)寫代碼的時(shí)候,GridView里面的數(shù)據(jù)/數(shù)據(jù)模板還沒(méi)有生成吶.所以一般來(lái)說(shuō),我們采用的方法是先確定該數(shù)據(jù)/數(shù)據(jù)模板所在的行,然后根據(jù)其類型來(lái)從該行提取它(在這里我們就可以看到,這也是一個(gè)假定該行已經(jīng)被完全創(chuàng)建,且該行包含我們要找的數(shù)據(jù)/數(shù)據(jù)模板----因此使用的時(shí)候請(qǐng)首先確認(rèn)執(zhí)行該代碼前,代碼所需要的行已經(jīng)被創(chuàng)建).
要獲取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的行是否被創(chuàng)建,可以用Row.RowType == DataControlRowType.DataRow(其中Row是我們要檢驗(yàn)的GridView行).
下面介紹常用的2種定位,各有各的優(yōu)缺點(diǎn),使用事件常常得到的是一個(gè)行,而使用Button控件的數(shù)據(jù)綁定則可以根據(jù)綁定的不同得到特定的數(shù)據(jù).
1.使用GridView自帶事件進(jìn)行定位:
下面我列出可能用到的事件(這里默認(rèn)控件名為GridView1)
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
//用GridView的Select列時(shí),可以使用這個(gè)方法
//e.NewSelectedIndex;//當(dāng)前要選擇的行,獲取的是GridView當(dāng)前頁(yè)的index
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
//this.GridView1.SelectedValue.ToString();
//當(dāng)前要選擇的行的DataKeys,獲取的是GridView當(dāng)前頁(yè)的DataKeys,
//比如可以設(shè)置GridView的DataKeys是數(shù)據(jù)源里的"ID"那么這里獲取的就是當(dāng)前選中行的數(shù)據(jù)的ID.
//需要注意的是,SelectedValue只有在SelectedIndexChanged中才有值,其他時(shí)候是null;
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//e.RowIndex;//當(dāng)前要提交的行,獲取的是GridView當(dāng)前頁(yè)的index
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
//e.NewEditIndex;//當(dāng)前要編輯的行,獲取的是GridView當(dāng)前頁(yè)的index
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//e.RowIndex;//當(dāng)前要?jiǎng)h除的行,獲取的是GridView當(dāng)前頁(yè)的index
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
//e.RowIndex;//當(dāng)前要撤消編輯的行,獲取的是GridView當(dāng)前頁(yè)的index
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//e.NewPageIndex;//當(dāng)前要到的頁(yè),獲取的是GridView要切換頁(yè)的index
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex != GridView1.EditIndex)
{
//e.Row;//當(dāng)前已經(jīng)生成,并綁定好數(shù)據(jù)的行;
}
}
2.使用Button中的CommandArgument屬性來(lái)綁定ID,進(jìn)而獲取要編輯、刪除、提交、選擇的行.
比如可能的代碼是這樣的:<asp:Button ID="Button1" runat="server" CommandArgument='<%# ("id") %>'
onclick="Button1_Click" Text="Button" />
然后在Button1_Click這個(gè)事件中,我們就可以用((Button)sender).CommandArgument來(lái)獲得綁定的數(shù)據(jù)
3.使用GridView.XXX來(lái)進(jìn)行定位.