很久以前就想寫一些關於DataGrid/DataList的東西,但是一直以來,一方面自感所學未深,另一方面,總覺無從下筆,一拖再拖,離剛開始的念頭已距一年有余。
DataGrid/DataList在ASP.NET中的重要性,想必就不用我再強調了,凡顯示Table類型的數據,大多會使用這兩個控件(當然,如果誰還像ASP那樣寫ASP.NET,那我也沒有辦法),所以,每個人可能都有自己的領悟,這篇文章,算是拋磚引玉,為大家做個鋪墊。
一、方法
1、DataBind
很簡單、最常用的方法。綁定數據用。需要注意的只有一點:執行了這個方法後,DataGrid(由於DataGrid和DataList極為相似,所以下面的介紹雖然是針對DataGrid,但與DataList也相差不遠)裡面所有的顯示綁定數據的控件,都會顯示DataSource裡的數據,其余控件也將初始化成.aspx裡設計的狀態。
二、屬性
1、DataSource
有DataBind的地方,就應該有DataSource。如果沒有指定DataSource而執行DataBind,那DataGrid將什麼也不會顯示。
DataSource一般是DataSet、DataTable或者DataView。當然也可以綁定DataReader或者其他實現IEnumerable的類。
2、DataKeyField,DataKeys
當你在DataGrid中定位一行之後,肯定想知道這行在數據表裡的位置,至少有五種方法可以做到這一點,設置DataGrid的DataKeyField就是這幾種方法之一。
DataKeyField一般設置為數據表的Unique字段(否則就沒意義了),通過DataKey可以得到這一行對應的關鍵字段的值。
DataKeys是DataKey的集合,通過行的索引來讀取相應行的DataKey。
3、EditItemIndex,SelectedIndex,CurrentPageIndex,SelectedItem
這些屬性都很好理解,看名字就知道是什麼意思,需要注意的是,設置了EditItemIndex或者CurrentPageIndex後需要重新執行DataBind方法(當然,前面提到過,還需要設置DataSource)。
4、Columns
沒什麼好解釋的,Columns就是Columns,列的集合,可以設置列的屬性,包括Visible、HeaderText、FooterText、SortExpression等。
嚴重注意:自動生成的列,是不包含在Columns中的。只有在.aspx中顯示聲明的列和在代碼中添加的列才會被包含在其中。
5、Items
俗話說,最後的都是最重要的,把Items作為最後一個屬性來介紹,正式基於這樣的理由。
Items是DataGridItem的集合,可以遍歷當前DataGrid中顯示數據的DataGridItem。
5.1、DataGridItem
每一個DataGridItem就是DataGrid中顯示的一行,其中包括:
Header DataGrid 控件的標題部分
Item DataGrid 控件中的項
AlternatingItem DataGrid 控件中的交替項
SelectedItem DataGrid 控件中的選定項(由SelectedIndex設置,通過SelectedItem屬性或者Items[SelectedIndex]來讀取)
EditItem DataGrid 控件中處於編輯狀態的項(由EditItemIndex設置,通過Items[EditItemIndex]來讀取)
Separator DataGrid 控件中項之間的分隔符
Footer DataGrid 控件的腳注部分
Pager DataGrid 控件的頁選擇節
注意,DataGrid的Items屬性中不會包含Header、Footer、Pager這三類DataGridItem的。
5.1.1、DataGridItem的屬性
ItemIndex —— 得到行在Items中的索引
ItemType —— 返回行的類型,也就是上面列出的Header、Item、...、Pager
Cells —— 返回行包含的所有TableCell(不管是顯示聲明的,還是自動生成的,不管是可以看見的,還是隱藏掉的),通過TableCell,可以讀取Cell中顯示的文本、包含的控件
嚴重注意:只有BoundColumn列和自動生成列,才可以通過TableCell.Text屬性讀取顯示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要將目標控件轉換成相應的控件。
比如:
假設DataGrid的第一列聲明如下
<asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
讀取的時候可以用:
//Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一個控件(也只有這個控件可以用)
HyperLink link = (HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
Response.Write(link.Text);
至於模板列(TemplateColumn),當然也可以通過DataGrid1.Items[i].Cells[j].Controls[n]來獲取,然後轉換成原來的控件類型再操作,但是還有個更好的辦法,就是用FindControl來查找控件。
FindControl是System.Web.UI.Control的方法,可以根據子控件ID來查找子控件
比如:
假設DataGrid的某一列聲明如下
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id") %>'>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
讀取方法:
TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
Response.Write(txt.Text);
注意:DataList中是沒有Cell的
三、事件
1、ItemCommand、CancelCommand、DeleteCommand、EditCommand、UpdateCommand
也就是DataGrid中,點擊Button、LinkButton後執行的事件,執行的事件取決於按鈕的CommandName。其實最主要的一個是ItemCommand,而後面四個都只是ItemCommand的一小部分,
比如一個按鈕的CommandName為"Cancel",當返回後,首先執行的是ItemCommand事件,然後才是CancelCommand事件。
2、PageIndexChanged
如果你的DataGrid是分頁的,那當你在DataGrid上點擊Pager上的1、2、3或者<、>時,就會激發這個事件。
在這個事件裡面,你可以用e.NewPageIndex來讀取要改變的頁,然後賦值給DataGrid的CurrentPageIndex屬性,最後不要忘了,還要設置DataSource,還要執行DataBind。