一、GridView的準系統
將GridView控制項由“工具箱”拖至aspx頁面合適位置,由會自動產生一個GridView的控制項編輯檢視,預設控制項ID是GridView1。在aspx.cs檔案中寫入下面的程式碼即可以顯示DataTable或DataReader中資料。
GridView1.DataSource=dt; //或是=reader;之類的
GridView1.DataBind(); //執行此方法後,資料才會真正綁定並顯示出來
在瀏覽器中查看頁面,會發現所有欄位全部顯示在頁面上,如所示:
圖中用紅色標出的部分是每一更的"HeaderText"屬性,預設是採用的該列的欄位名稱。
二、設定列屬性
在基本用法中,是自動將DataTable中所有的欄位全部顯示出來,但在實際中,往往只需要顯示所需要的欄位,這就需要設定GridView中列的屬性。
GridView是由許多“列”對象組成,可以在GridView對象中看到有一個Columns的屬性。可以通過設定列的屬性達到我們所需要的顯示效果。
如上兩圖所示,進行編輯列的介面,先選中GridView控制項,然後即可以通過aspx頁面控制項上的右向箭頭點擊菜單進入,也可通過屬性的"Columns"編輯按鈕進入。
列編輯介面如下:
就是列編輯的對話方塊,紅色框標識出基本的屬性介面功能。除了“DataField”和“HeaderText”兩個屬性外,還有一個定義列寬的屬性也經常用,在“樣式”分類中的“ItemStyle”屬性群裡有一個“Width”屬性,既可定義固定的寬度(如100px),也可定義為百分比(如:50%)。
在所示的對話方塊中,示範了“BoundField”類型的欄位,此類型的欄位是將資料表中的欄位值以文本的方式進行顯示,相對來說功能較為簡單。除了圖中示範的“BoundField”,還有其它類型的欄位,下面就分別介紹其它常規列的使用。
三、常規列屬性
1.BoundField
此類型的列是將資料表中的欄位內容用文本的方式顯示出來。
2.CheckBoxField(不常用)
常用來顯示資料庫中的布爾類型欄位的值
3.HyperLinkField
顯示一個連結,此類型欄位常用,其主要屬性是:
DataNavigateUrlFields、DataNavigateUrlFormatString、DataTextField、DataTextFormatString
如:要在此列中形成一個連結,連結的文字是“公司名稱”,連結到查看公司詳細資料的頁面:ViewCompany.aspx,並且頁面後要跟一個參數ID=xxxx。第一條記錄ID=ALFKI,CompanyName=Alfreds Futterkiste,其產生的連結應該是ViewCompany.aspx?ID=ALFKI,其連結文本為“Alfreds Futterkiste”,以上四個屬性定義的值如下:
DataNavigateUrlFields 的值為 "CustomerID"
DataNavigateUrlFormatString 的值為 "ViewCompany.aspx?id={0}",在產生時,{0}就會用DataNavigateUrlFields屬性所定義的欄位的值進行替換。
DataTextField的值為"CompanyName"
DataTextFormatString的值為"{0}",也就是只顯示其公司的名稱,無其它多餘文字。顯示效果如所示:
4.ImageField(不常用)
用於顯示儲存圖片的二進位類型欄位的資料,直接將二進位欄位儲存的圖片資料顯示為圖片,但此欄位在VS2005之後去掉了DataField屬性,加入了DataImageUrlField欄位,其意思是不再支援直接顯示二進位內容為圖片,而是需要自己再寫一個顯示頁面,在這個頁面去讀取二進位欄位內容,並將其輸出為圖片內容。此欄位不常用。
5.ButtonField
此列顯示為“按鈕”,注意:按鈕並不只是HTML語言中的<input type="button"...>這一種類型,在asp.net中,能夠完成將表單(頁面)提交(PostBack)到伺服器動作的控制項都可以稱之為“按鈕”,因此,此類型的欄位有一個屬性:ButtonType有三個選項,Link、Image、Button,表示了“按鈕”的三種表現形式,分別對應著“工具箱”中的LinkButton、ImageButton、Button三種控制項。
當按鈕被Click之後,會觸發GridView的“RowCommand”事件,按鈕被點擊後執行什麼樣的程式,要在RowCommand事件中去寫。
有這樣一個問題:如果一個GridView中有多個Button列,但只有一個RowCommand事件,那麼如何知道當前是哪一列的Button被Click了呢?這就需要通過ButtonField列的CommandName屬性來指定。
如:有兩個ButtonField列,將第一列的CommandName屬性設定為“這是第一列”,將第二列的CommandName屬性設定為“這是第二列”。
選中GridView控制項,在“屬性面板”的“事件”頁中雙擊RowCommand事件後的空格。
再在aspx.cs檔案中的GridView的RowCommand事件中程式如下書寫:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "這是第一列":
//此處請寫被點擊後需要處理的事務
Response.Write("第一列被點擊");
break;
case "這是第二列":
//此處請寫被點擊後需要處理的事務
Response.Write("第二列被點擊");
break;
}
}
6.CommandField
此列的實質與ButtonField列沒有任何區別,唯有的區別就是不需要再設定CommandName屬性,而是每一種按鈕對應了GridView的一種事件,而不是RowCommand事件,如:編輯按鈕對應著RowEditing事件,刪除按鈕對應著RowDeleting(刪除之時)和RowDeleted(刪除之後)兩個事件,以此類推,這裡就不一一列舉。也不再舉例。
四、模板列
前面幾個類型的列,把它們統稱為“常規列”,模板列(Template)與之前的幾個列的區別在於:之前的列都相當於一個單個的控制項,而此列相當於一個容器,在容器中又可以拖入多個控制項,構成更複雜的儲存格內容。GridView之所以靈活就靈活在這個模板列。在列定義的對話方塊中加入一個模板列,只設定HeadText和ItemStyle.Width等屬性,再點擊確定關閉對話方塊。在aspx頁面中選中GridView控制項並點擊右向箭頭,如所示:
點擊“編輯模板”進入下面介面:
可以看到,右方的下拉式清單中列出了模板列的名稱,如果有多個模板列,則會列出多個模板列的名稱,每個模板下有多個Template,我們一般只需要編輯ItemTemplate,其它的Template大家可以根據其名稱推測其作用。
ItemTemplate就是“容器”,可以將“工具箱”中的控制項拖入其中。中就拖入一個Image控制項,一個Button控制項和一個CheckBox控制項。
選中這些控制項,並在屬性面板中將其ID改為有意義的名稱。其具體的用法在後面再講。
模板列編輯結束後,點擊右向箭頭選擇“結束模板編輯”。
五、RowDataBound事件
上面只是定義了模板列,如果要其顯示出每條記錄的相應資訊,還需要將模板列中的控制項屬性賦值,這個動作一般放在GridView的RowDataBound事件中去完成。雙擊屬性面板的動作頁,定義一個RowDataBound事件。假定剛才定義的三個控制項其ID分別為:imgTemp,btnTemp,cbTemp,則aspx.cs檔案示範程式如下:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowIndex < 0) //如果正在產生表頭
return;
DataRowView drv = (DataRowView)e.Row.DataItem; //將綁定當前行的資料行視圖取出
Image img = (Image)e.Row.FindControl("imgTemp");
img.ImageUrl = drv["ImageUrl"].ToString(); //假定資料表中有一個ImageUrl的欄位
Button btn = (Button)e.Row.FindControl("btnTemp");
btn.Text = drv["CompanyName"].ToString();
CheckBox cb = (CheckBox)e.Row.FindControl("cbTemp");
cb.Checked = (drv["IsSelect"].ToString() == "1" ? true : false); //假定資料表中有一個IsSelect欄位,1表示選中,0表示未選中。
}
上面這段程式是一個示範,並不是完全按照示範表Customer表中的欄位進行設定。其過程為:
1.將e.Row.DataItem強制轉換為DataRowView對象,這個對象就是綁定到此行的資料表DataTable中的一條DataRow的視圖,其用法與DataRow類似。
2.通過e.Row.FindControl方法找到指定ID的那個模板中的控制項
3.通過一定的計算,將DataRowView中的值轉換為控制項的屬性。
不僅模板列可以在RowDataBound事件中進行操作,常規列也可以,但不是用FindControl方法,以下例為示範,要擷取第2列公司名稱這個HyperLinkField類型的常規列中的HyperLink對象,在RowDataBound事件中寫下面這行程式:
HyperLink hl = (HyperLink)e.Row.Cells[1].Controls[0];
因為此列位於該表的第二列,因此Cells[1]表示該儲存格,此儲存格中只有一個控制項,因此為Controls[0]。
再如:在刪除動作列中的刪除按鈕上加一個JavaScript動作,每次點擊刪除按鈕時,先在頁面通過JavaScript彈出一個確認對話方塊,可以按如下步驟操作:
1.在列編輯對話方塊中添加一個“刪除”按鈕列,按鈕類型為Button,假定是在表格的第4列
2.在RowDataBound中如此寫:
Button btDel = (Button)e.Row.Cells[3].Controls[0];
bt.Attributes.Add("OnClick", "return confirm('您是否確認刪除此條記錄?')");
在瀏覽器中查看此表格的HTML源碼時,就會發現每一個刪除按鈕都有如此一段HTML 屬性:
OnClick="return confirm('您是否確認刪除此條記錄?')"
return confirm('.....')是一句JavaScript語句,根據使用者在彈出的對話方塊中選擇的項來決定返回的值,如果選擇“是”,則返回true,則此按鈕所觸發的提交表單繼續進行;反之,返回false,則此按鈕所觸發的提交表單事情停止,刪除動作就不會完成。
六、DataKeys屬性
GridView有一個DataKeys屬性會經常用到,這裡單獨講一下。比如:有一個刪除按鈕列,點擊刪除後,要刪除當前行,但是你怎麼從背景程式中擷取到當前行的關鍵字段的值呢?方法有多種,但最可靠的方法還是通過GridView的DataKeys屬性。下面程式是示範:
1.在進行資料繫結之時,設定DataKeyNames屬性的值:
this.GridView1.DataSource = ds.Tables[0];
this.GridView1.DataKeyNames = new string[] { "CustomerID", "CompanyName" };
this.GridView1.DataBind();
此行程式的作用是將CustomerID和CompanyName兩個欄位的值放入到DataKeys數組中。
2.在GridView1_RowDeleting事件中寫如下程式:
string id = this.GridView1.DataKeys[e.RowIndex]["CustomerID"].ToString();
string name = this.GridView1.DataKeys[e.RowIndex]["CompanyName"].ToString();
這樣就擷取到了當前行記錄在DataKeys數組中的值。
七、事件
DataBinding 當伺服器控制項綁定到資料來源時發生。(從 Control 繼承。)
DataBound 在伺服器控制項綁定到資料來源後發生。(從 BaseDataBoundControl 繼承。)
Disposed 當從記憶體釋放伺服器控制項時發生,這是請求 ASP.NET 頁時伺服器控制項生存期的最後階段。(從 Control 繼承。)
Init 當伺服器控制項初始化時發生;初始化是控制項生存期的第一步。(從 Control 繼承。)
Load 當伺服器控制項載入到 Page 對象中時發生。(從 Control 繼承。)
PageIndexChanged 在單擊某一頁導覽按鈕時,但在 GridView 控制項處理分頁操作之後發生。
PageIndexChanging 在單擊某一頁導覽按鈕時,但在 GridView 控制項處理分頁操作之前發生。
PreRender 在載入 Control 對象之後、呈現之前發生。(從 Control 繼承。)
RowCancelingEdit 單擊編輯模式中某一行的“取消”按鈕以後,在該行退出編輯模式之前發生。
RowCommand 當單擊 GridView 控制項中的按鈕時發生。
RowCreated 在 GridView 控制項中建立行時發生。
RowDataBound 在 GridView 控制項中將資料行綁定到資料時發生。
RowDeleted 在單擊某一行的“刪除”按鈕時,但在 GridView 控制項刪除該行之後發生。
RowDeleting 在單擊某一行的“刪除”按鈕時,但在 GridView 控制項刪除該行之前發生。
RowEditing 發生在單擊某一行的“編輯”按鈕以後,GridView 控制項進入編輯模式之前。
RowUpdated 發生在單擊某一行的“更新”按鈕,並且 GridView 控制項對該行進行更新之後。
RowUpdating 發生在單擊某一行的“更新”按鈕以後,GridView 控制項對該行進行更新之前。
SelectedIndexChanged 發生在單擊某一行的“選擇”按鈕,GridView 控制項對相應的選擇操作進行處理之後。
SelectedIndexChanging 發生在單擊某一行的“選擇”按鈕以後,GridView 控制項對相應的選擇操作進行處理之前。
Sorted 在單擊用於列排序的超連結時,但在 GridView 控制項對相應的排序操作進行處理之後發生。
Sorting 在單擊用於列排序的超連結時,但在 GridView 控制項對相應的排序操作進行處理之前發生。
Unload 當伺服器控制項從記憶體中卸載時發生。(從 Control 繼承。)