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代码,从而可以减小页面文件的大小,减少网络带宽资源的占用。