1、GridView表格控件
可以启用自动分页。
图例
源代码 <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="odsBooks"> <Columns> <asp:TemplateField HeaderText="Id" SortExpression="Id"> <EditItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("Id") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label3" runat="server" Text='<%# Eval("Id") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> <asp:TemplateField HeaderText="PublishDate" SortExpression="PublishDate"> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Eval("PublishDate","{0:dd/MM/yyyy}") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="ISBN" HeaderText="ISBN" SortExpression="ISBN" /> <asp:TemplateField HeaderText="TOC" SortExpression="TOC"> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("Category.Name") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:HyperLinkField DataNavigateUrlFields="Id" DataNavigateUrlFormatString="DetailBooks.aspx?id={0}" Text="详细" /> </Columns> </asp:GridView> <asp:ObjectDataSource ID="odsBooks" runat="server" SelectMethod="GetAllBooks" TypeName="BLL.BookManager"></asp:ObjectDataSource> 2、DataList 列表控件。 在每一行中可以添加复杂的表格。 不能自动分页,需要自己编写代码实现分页显示。 图例
源代码 前台页面BookList.aspx <asp:Label ID="lblOrder" runat="server" Text="排序方式:">排序方式:</asp:Label> <asp:Button ID="btnOrderByDate" CssClass="btn" runat="server" Text="出版日期" onclick="btnOrderByDate_Click" /> <asp:Button ID="btnOrderByPrice" CssClass="btn" runat="server" Text="价格" onclick="btnOrderByPrice_Click" /> <br /> <asp:Repeater ID="Repeater1" runat="server" DataSourceID="odsBooks"> <HeaderTemplate> <asp:Image ID="Image1" runat="server" ImageUrl="~/Image/byxcb.gif" /> </HeaderTemplate> <ItemTemplate> <table width="900px"> <tr> <td rowspan="4"> <a href="BookDetail.aspx?id=<%# Eval("Id") %>"><img src="../Image/<%# Eval("ISBN") %>.jpg" width="95" height="121" /></a> </td> <td align="center"><a href="BookDetail.aspx?id=<%# Eval("Id") %>"><%# Eval("Title") %></a></td> </tr> <tr> <td><%# Eval("Author") %></td> </tr> <tr> <td><%# EnCode(Eval("ContentDescription"))%></td> </tr> <tr> <td align="right"><strong>定价:¥<%# Eval("UnitPrice")%></strong></td> </tr> </table> </ItemTemplate> <SeparatorTemplate> <hr /> </SeparatorTemplate> </asp:Repeater> <asp:ObjectDataSource ID="odsBooks" runat="server" SelectMethod="GetOrderedSmallBooksByCategoryId" TypeName="BLL.BookManager"> <SelectParameters> <asp:Parameter DefaultValue="-1" Name="categoryId" Type="Int32" /> <asp:Parameter DefaultValue="" Name="order" Type="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:Label ID="lblPages" runat="server"></asp:Label> <asp:Button ID="btnPrev" runat="server" onclick="btnPrev_Click" CssClass="btn" Text="上一页" /> <asp:Button ID="btnNext" runat="server" onclick="btnNext_Click" CssClass="btn" Text="下一页" /> <br /> 后台代码BookList.aspx.cs public partial class 作业_BookList : System.Web.UI.Page { //创建分页对象 PagedDataSource psdBooks = new PagedDataSource(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ViewState["Page"] = 0;//分页号码 ViewState["Order"] = "";//排序条件 try { //分类ID ViewState["CategoryId"] = Convert.ToInt32(Request.QueryString["CategoryId"]); } catch { ViewState["CategoryId"] = -1; } Databind(); } } /// <summary> /// 分页 /// </summary> private void Databind() { psdBooks.DataSource = BookManager.GetOrderedSmallBooksByCategoryId((int)ViewState["CategoryId"], ViewState["Order"].ToString()); psdBooks.AllowPaging = true; psdBooks.CurrentPageIndex = Pager; psdBooks.PageSize = 4; lblPages.Text = string.Format("第{0}页 共{1}页",psdBooks.CurrentPageIndex+1,psdBooks.PageCount); Repeater1.DataSourceID = ""; Repeater1.DataSource = psdBooks; Repeater1.DataBind(); SetEnable(); } /// <summary> /// 置按钮是否可显示 /// </summary> private void SetEnable() { btnPrev.Enabled = true; btnNext.Enabled = true; if (psdBooks.IsFirstPage) { btnPrev.Enabled = false; } if (psdBooks.IsLastPage) { btnNext.Enabled = false; } } /// <summary> /// 对字符串进行HTML编码并返回已编码的字符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> public string EnCode(object obj) { return Server.HtmlEncode(obj as string); } /// <summary> /// 页码 /// </summary> private int Pager { get { return (int)ViewState["Page"]; } set { ViewState["Page"] = value; } } /// <summary> /// 上一页按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnPrev_Click(object sender, EventArgs e) { Pager--; Databind(); } /// <summary> /// 下一页按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnNext_Click(object sender, EventArgs e) { Pager++; Databind(); } /// <summary> /// 按日期排序按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOrderByDate_Click(object sender, EventArgs e) { ViewState["Order"] = "PublishDate"; Databind(); } /// <summary> /// 按价格排序按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOrderByPrice_Click(object sender, EventArgs e) { ViewState["Order"] = "UnitPrice"; Databind(); } } 3、Repeater Repeater控件专门用于精确内容的显示,它也是基于模板的方式,不过它不会自动生成任何用于布局的代码。Repeater控件甚至没有一个默认的外观,它完全是通过模板来控制。而且也只能通过源代码视图进行模板的编辑。 与DataList相比可使用的模板更少。 Repeater控件由于不自动生成任何HTML代码,所以带来了效率上的提升。 不能自动分页,需要自己编写代码实现分页显示。 图例
源代码 前台页面RepeaterPage.aspx <dl> <dt> <asp:Label ID="lblSort" runat="server" Text="排序方式:"></asp:Label> <asp:Button ID="btnSortByDate" runat="server" Text="出版日期" onclick="btnSortByDate_Click" /> <asp:Button ID="btnOrderByPrice" runat="server" Text="价格" onclick="btnOrderByPrice_Click" /> </dt> <dt> <ul class="title_ul1"> <li class="title_booklist0">书名</li> <li class="title_booklist1">作者</li> <li class="title_booklist2">出版社</li> <li class="title_booklist3">出版日期</li> <li class="title_booklist4">价格</li> </ul> <asp:Repeater ID="rpBookList" runat="server"> <ItemTemplate> <ul class="title_ul2"> <li class="title_booklist0"><%# Eval("Title")%></li> <li class="title_booklist1"><%# Eval("Author") %></li> <li class="title_booklist2"><%# Eval("Publisher.Name") %></li> <li class="title_booklist3"><%# Eval("PublishDate")%></li> <li class="title_booklist4"><%# Eval("UnitPrice")%></li> </ul> </ItemTemplate> <AlternatingItemTemplate> <ul class="title_ul3"> <li class="title_booklist0"><%# Eval("Title")%></li> <li class="title_booklist1"><%# Eval("Author") %></li> <li class="title_booklist2"><%# Eval("Publisher.Name") %></li> <li class="title_booklist3"><%# Eval("PublishDate")%></li> <li class="title_booklist4"><%# Eval("UnitPrice")%></li> </ul> </AlternatingItemTemplate> </asp:Repeater> <li> <br /> <asp:Label ID="lblPages" runat="server"></asp:Label> <asp:Button ID="btnPrev" runat="server" onclick="btnPrev_Click" Text="上一页" /> <asp:Button ID="btnNext" runat="server" onclick="btnNext_Click" Text="下一页" /> </li> </dt> </dl> 后台代码 public partial class RepeaterPage : System.Web.UI.Page { /// <summary> /// 分页对象 /// </summary> PagedDataSource psdPage = new PagedDataSource(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ViewState["Page"] = 0;//页数 ViewState["Order"] = "";//排序条件 try { ViewState["typeid"] = Convert.ToInt32(Request.QueryString["typeid"]); } catch { ViewState["typeid"] = -1; } Databind(); } } /// <summary> /// 数据绑定 /// </summary> private void Databind() { psdPage.AllowPaging = true; psdPage.PageSize = 20; psdPage.CurrentPageIndex = (int)ViewState["Page"]; psdPage.DataSource = BookManager.GetOrderedSmallBooksByCategoryId((int)ViewState["typeid"],ViewState["Order"].ToString()); lblPages.Text = "第" + (psdPage.CurrentPageIndex+1) + "页 共" + psdPage.PageCount + "页"; rpBookList.DataSource = psdPage; rpBookList.DataBind(); SetEnable(); } /// <summary> /// 页码 /// </summary> public int Pager { get { return (int)ViewState["Page"]; } set { ViewState["Page"] = value; } } /// <summary> /// 置控件的使用状态 /// </summary> private void SetEnable() { btnNext.Enabled = true; btnPrev.Enabled = true; if (psdPage.IsFirstPage) btnPrev.Enabled = false; if (psdPage.IsLastPage) { btnNext.Enabled = false; } } /// <summary> /// 上一页按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnPrev_Click(object sender, EventArgs e) { Pager--; Databind(); } /// <summary> /// 下一页按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnNext_Click(object sender, EventArgs e) { Pager++; Databind(); } /// <summary> /// 按日期排序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnSortByDate_Click(object sender, EventArgs e) { ViewState["Order"] = "PublishDate"; Pager = 0; btnSortByDate.Enabled = false; btnOrderByPrice.Enabled = true; Databind(); } /// <summary> /// 按价格排序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOrderByPrice_Click(object sender, EventArgs e) { ViewState["Order"] = "UnitPrice"; Pager = 0; btnSortByDate.Enabled = true; btnOrderByPrice.Enabled = false; Databind(); } } 总结 GridView、DataList、Repeater三者都可以展示数据记录。如果仅以简单的表格形式展示数据可以采用GridView控件,但若想以比较精细的方式展示数据,易采用DataList或Repeater,从执行效率上讲使用Repeater控件是最佳解决方案,因为该控件本身不会产生HTML代码,从而可以减小页面文件的大小,减少网络带宽资源的占用。