GridView、DataList、Repeater三者之间的区别.doc

1GridView表格控件

       可以启用自动分页。

图例

 

源代码

<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>

 

   

2DataList  列表控件。

       在每一行中可以添加复杂的表格。

       不能自动分页,需要自己编写代码实现分页显示。

图例

 

源代码

前台页面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>定价:&yen;<%# 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>

&nbsp;&nbsp;<asp:Button ID="btnPrev" runat="server" onclick="btnPrev_Click" CssClass="btn"  Text="上一页" />

&nbsp;

<asp:Button ID="btnNext" runat="server" onclick="btnNext_Click"  CssClass="btn" Text="下一页" />

&nbsp;

<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();

    }

}

3Repeater

       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();

    }

}

 

总结

       GridViewDataListRepeater三者都可以展示数据记录。如果仅以简单的表格形式展示数据可以采用GridView控件,但若想以比较精细的方式展示数据,易采用DataListRepeater,从执行效率上讲使用Repeater控件是最佳解决方案,因为该控件本身不会产生HTML代码,从而可以减小页面文件的大小,减少网络带宽资源的占用。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值