ASP.NET 2.0中,新增加的gridview控制項的確十分強大,彌補了在asp.net 1.1中,使用datagrid控制項時的不足之處。因為在asp.net 1.1中,在使用datagrid時,很多情況下依然要編寫大量的代碼,十分不方便,而且有時需要很多技巧。而在asp.net 2.0中,很多情況下,使用gridview控制項的話,甚至只需要拖拉控制項,設定屬性就可以了,不需要編寫任何代碼。在《使用ASP.NET 2.0中的GridView控制項》和《ASP.NET2.0中用Gridview控制項操作資料》中,已經對gridview控制項做了一系列介紹,如果之前沒有瞭解過gridview的讀者,請先閱讀這兩篇文章。在本文中,將繼續深入介紹gridview的一些提示。
一 格式化gridview
和asp.net 1.1一樣,gridview可以很方便地定製其樣式,比如css,顏色等。要定製gridview的格式,十分簡單,只需要滑鼠右擊gridview,在彈出的菜單中選擇"AUTO FORMAT",則可以選擇gridview的樣式,內建了許多樣式,如:
如果你要對gridview中每一列自訂格式,則只需要點擊gridview右上方的"smart tag"智能標記,在彈出的菜單中,選擇"edit columns",會彈出如的表單,這樣就可以對每列進行詳細的設定了:
比如,如果要某一列設定為特殊格式,如要將unitprice設定為貨幣格式,可以在unitprice列的DataFormatString屬性中設定為{0:C},程式碼如下:
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:SqlDataSource ID="productsDataSource" Runat="server" SelectCommand="SELECT [ProductID], [ProductName], [QuantityPerUnit], [UnitPrice], [UnitsInStock] FROM [Products]" ConnectionString="<%$ ConnectionStrings:NWConnectionString %>" DataSourceMode="DataReader"> </asp:SqlDataSource> <asp:GridView ID="productGridView" Runat="server" DataSourceID="productsDataSource" DataKeyNames="ProductID" AutoGenerateColumns="False" BorderWidth="1px" BackColor="#DEBA84" CellPadding="3" CellSpacing="2" BorderStyle="None" BorderColor="#DEBA84"> <FooterStyle ForeColor="#8C4510" BackColor="#F7DFB5"></FooterStyle> <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center"></PagerStyle> <HeaderStyle ForeColor="White" Font-Bold="True" BackColor="#A55129"></HeaderStyle> <Columns> <asp:BoundField ReadOnly="True" HeaderText="ID" InsertVisible="False" DataField="ProductID" SortExpression="ProductID"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField> <asp:BoundField HeaderText="Name" DataField="ProductName" SortExpression="ProductName"> </asp:BoundField> <asp:BoundField HeaderText="Qty/Unit" DataField="QuantityPerUnit" SortExpression="QuantityPerUnit"></asp:BoundField> <asp:BoundField HeaderText="Price/Unit" DataField="UnitPrice" SortExpression="UnitPrice" DataFormatString="{0:c}"> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundField> <asp:BoundField HeaderText="Units In Stock" DataField="UnitsInStock" SortExpression="UnitsInStock" DataFormatString="{0:d}"> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundField> </Columns> <SelectedRowStyle ForeColor="White" Font-Bold="True" BackColor="#738A9C"></SelectedRowStyle> <RowStyle ForeColor="#8C4510" BackColor="#FFF7E7"></RowStyle> </asp:GridView> </div> </form> </body> </html> |
程式運行後結果如下:
而有的時候,我們可能要根據需要,對gridview中的資料進行特殊的顯示,比如當某樣商品庫存為0時,要求gridview中以不同顏色進行顯示,這時,可以按如下的方法進行:
首先,gridview提供了rowdatabound事件,該事件在gridview中每行被建立並且綁定到datasource控制項後被觸發,因此,我們可以利用該事件去檢查庫存是否為0,如果為0的話,將所在行的北京顏色設定為黃色,代碼如下:
public void productsGridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { int unitsInStock = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "UnitsInStock")); if (unitsInStock == 0) e.Row.BackColor = Color.Yellow; } } |
首先,該事件首先檢查,當前的行是否屬於datarow類型的行,因為象gridview中的headerrow,footerrow等行,並不包含實際的資料,因此,我們不需要使用headerrow和footerrow,而為了取得庫存unitesinstock的內容,通過使用databinder.eval的方法取出其內容,並轉換為int類型,接著判斷是否為0,如果為0的話,則設定其行的背景顏色為黃色。程式運行結果如所示:
二 gridview的分頁和排序
在asp.net 1.1中,datagrid分頁是很常見的。而在asp.net 2.0中,依然有兩種分頁方式,一種是預設的分頁方式,比如,有1000條資料,每頁顯示10條資料,則每次頁面請求都必須從資料庫中將1000條資料讀取出來,只不過每次顯示一頁時,顯示10條資料,速度和效能會降低。另一種是自訂分頁方式,比如1000條資料,每頁顯示10條資料,則程式每次在頁面跳轉時,只會從資料庫中拿10條資料出來顯示給使用者,而不是每次都把1000條資料拿出來,因此效能大為提高。
在asp.net 2.0中,使用sqldatasource控制項進行分頁是十分容易的事情。Sqldatasource資料來源控制項是用來與資料庫打交道的,可以讀取資料庫中的資料,並可以和gridview等控制項進行綁定。在下面的示範中,首先拖拉一個sqldatasource控制項,並且設定其資料來源為sql server 中的northwind資料庫,再拖拉一個gridview控制項,並且點gridview的smart tag智能標記,在彈出的菜單中,選擇"enable paging"和"enable sorting",即允許分頁和排序,則可以完成分頁和排序的功能了,是不是很簡單呢?如所示:
而在分頁的效果中,有時我們想讓使用者知道,目前正在瀏覽的是第幾頁,那麼要如何?呢?在gridview中,有一個pageindex的屬性,指示頁面的序號(從0開始),則只需在頁面的html代碼內,寫下如下代碼,即可實現效果:
<i>You are viewing page <%=productsGridView.PageIndex + 1%> of <%=productsGridView.PageCount%> </i> |
完整代碼如下:
<form id="form1" runat="server"> <div> <asp:SqlDataSource ID="productDataSource" Runat="server" SelectCommand="SELECT [ProductName], [UnitPrice], [UnitsInStock], [QuantityPerUnit] FROM [Products]" ConnectionString="<%$ ConnectionStrings:NWConnectionString %>"> </asp:SqlDataSource> <asp:GridView ID=" productsGridView" Runat="server" DataSourceID="productDataSource" AutoGenerateColumns="False" AllowSorting="True" BorderWidth="2px" BackColor="White" GridLines="None" CellPadding="3" CellSpacing="1" BorderStyle="Ridge" BorderColor="White" AllowPaging="True"> <FooterStyle ForeColor="Black" BackColor="#C6C3C6"></FooterStyle> <PagerStyle ForeColor="Black" HorizontalAlign="Right" BackColor="#C6C3C6"></PagerStyle> <HeaderStyle ForeColor="#E7E7FF" Font-Bold="True" BackColor="#4A3C8C"></HeaderStyle> <Columns> <asp:BoundField HeaderText="Product" DataField="ProductName" SortExpression="ProductName"> </asp:BoundField> <asp:BoundField HeaderText="Unit Price" DataField="UnitPrice" SortExpression="UnitPrice" DataFormatString="{0:c}"> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundField> <asp:BoundField HeaderText="Units In Stock" DataField="UnitsInStock" SortExpression="UnitsInStock" DataFormatString="{0:d}"> <ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:BoundField> <asp:BoundField HeaderText="Quantity Per Unit" DataField="QuantityPerUnit"></asp:BoundField> </Columns> <SelectedRowStyle ForeColor="White" Font-Bold="True" BackColor="#9471DE"></SelectedRowStyle> <RowStyle ForeColor="Black" BackColor="#DEDFDE"></RowStyle> </asp:GridView> <i>You are viewing page <%=productsGridView.PageIndex + 1%> of <%=productsGridView.PageCount%> </i> </div> </form> |
實現的效果如所示:
注意的是,可以點擊gridview中各欄位的名稱,如product,unit price,等進行排序,十分方便。如果要對分頁時每頁顯示多少條資料進行顯示,則只需要設定gridview的pagesize屬性就可以了。
三 在gridview中使用圖片
在asp.net 1.1中,如果要使用圖片的話,需要設定templatecolumn模版列。而在asp.ne 2.0中,則提供了imagefield列可以顯示gridview中的圖片。下面,我們設計一個簡單的相簿清單,讓大家瞭解如何在gridview中使用圖片,其中,資料表的結果如下,並且已經假設使用者已經上傳了相片,因此著重討論如何在gridview中顯示圖片
· PictureID-圖片的序號,自動遞增.
· Title-圖片的標題
· DateAdded-圖片上傳日期
· PictureUrl-圖片上傳後的相對路徑
接下來,我們拖拉一個gridview到IDE環境中去,設定將其與sqldatasource綁定。由於我們要在gridview中顯示的是實際的圖片,因此我們首先選gridview的smart tag標記,在彈出的菜單中選擇"edit columns",之後將pictureurl綁定欄位移除,添加一個ImageField綁定欄位,並且將ImageField欄位的dataimageurlfield屬性設定為PictureURL欄位,用來顯示圖片的路徑,如所示:
下面是相關HTML部分的代碼:
<asp:GridView ID="GridView1" Runat="server" DataSource=’<%# GetData() %>’ AutoGenerateColumns="False" BorderWidth="1px" BackColor="White" CellPadding="3" BorderStyle="None" BorderColor="#CCCCCC" Font-Names="Arial"> <FooterStyle ForeColor="#000066" BackColor="White"></FooterStyle> <PagerStyle ForeColor="#000066" HorizontalAlign="Left" BackColor="White"></PagerStyle> <HeaderStyle ForeColor="White" Font-Bold="True" BackColor="#006699"></HeaderStyle> <Columns> <asp:BoundField HeaderText="Picutre ID" DataField="PictureID"> <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle> </asp:BoundField> <asp:BoundField HeaderText="Title" DataField="Title"></asp:BoundField> <asp:BoundField HeaderText="Date Added" DataField="DateAdded" DataFormatString="{0:d}"> <ItemStyle HorizontalAlign="Center"></ItemStyle> </asp:BoundField> <asp:ImageField DataImageUrlField="PictureURL"></asp:ImageField> </Columns> <SelectedRowStyle ForeColor="White" Font-Bold="True" BackColor="#669999"></SelectedRowStyle> <RowStyle ForeColor="#000066"></RowStyle> </asp:GridView> |
我們並且通過手動編寫代碼的方式,建立資料表,如下代碼所示:
DataTable GetData() { // This method creates a DataTable with four rows. Each row has the // following schema: // PictureID int // PictureURL string // Title string // DateAdded datetime DataTable dt = new DataTable(); // define the table’s schema dt.Columns.Add(new DataColumn("PictureID", typeof(int))); dt.Columns.Add(new DataColumn("PictureURL", typeof(string))); dt.Columns.Add(new DataColumn("Title", typeof(string))); dt.Columns.Add(new DataColumn("DateAdded", typeof(DateTime))); // Create the four records DataRow dr = dt.NewRow(); dr["PictureID"] = 1; dr["PictureURL"] = ResolveUrl("~/DisplayingImages/Images/Blue hills.jpg"); dr["Title"] = "Blue Hills"; dr["DateAdded"] = new DateTime(2005, 1, 15); dt.Rows.Add(dr); dr = dt.NewRow(); dr["PictureID"] = 2; dr["PictureURL"] = ResolveUrl("~/DisplayingImages/Images/Sunset.jpg"); dr["Title"] = "Sunset"; dr["DateAdded"] = new DateTime(2005, 1, 21); dt.Rows.Add(dr); dr = dt.NewRow(); dr["PictureID"] = 3; dr["PictureURL"] = ResolveUrl("~/DisplayingImages/Images/Water lilies.jpg"); dr["Title"] = "Water Lilies"; dr["DateAdded"] = new DateTime(2005, 2, 1); dt.Rows.Add(dr); dr = dt.NewRow(); dr["PictureID"] = 4; dr["PictureURL"] = ResolveUrl("~/DisplayingImages/Images/Winter.jpg"); dr["Title"] = "Winter"; dr["DateAdded"] = new DateTime(2005, 2, 18); dt.Rows.Add(dr); return dt; } |
程式運行後,結果如所示