ASP.NET DataList通过PageDataSource类实现分页功能


DataList控件中没有像GridView控件那样通过设置AllowPaging、PageSize等属性来实现分页的功能( 了解GridView的分页实现点这里~),我们可以通过PageDataSource类来实现DataList控件的分页功能,该类封装了数据绑定控件以及分页相关的属性,来执行分页操作。

PageDataSource的使用

下面代码为后台进行数据绑定的方法

//声明一个分页数据源对象的全局变量
protected static PagedDataSource ps = new PagedDataSource();
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Bind(0); //初始化DataList数据,默认为第1页
    }
}
/// <summary>
/// 进行数据绑定的方法
/// </summary>
/// <param name="CurrentPage">要显示数据页的页数</param>
private void Bind(int CurrentPage)
{
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = "server=主机名\\实例名;uid=用户名;pwd=密码;database=数据库";
    string sqlStr = "select * from tb_login";
    SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn);
    DataSet ds = new DataSet();
    sda.Fill(ds, "tb_Login");
    //利用PageDataSource类来实现DataList分页
    ps.DataSource = ds.Tables["tb_Login"].DefaultView;
    ps.AllowPaging = true;
    ps.PageSize = 3;
    ps.CurrentPageIndex = CurrentPage;	//将当前页数设置为要显示的页数

    DataList1.DataSource = ps;
    DataList1.DataKeyField = "id";
    DataList1.DataBind();
}

前台页面DataList模板编写

关于ItemTemplate及页眉Header编写这边不作阐述,没有思路的读者可参考另一篇文章《ASP.NET DataList控件的了解与使用》。这里只对页脚关键部分进行说明,代码如下:

<FooterTemplate>
    共有<asp:Label ID="labCount" runat="server" Text="" />&nbsp;
    当前<asp:Label ID="labNowPage" runat="server" Text="" />&nbsp;
    <asp:LinkButton ID="lnkbtnFirst" runat="server" Text="首页" CommandName="first"/>&nbsp;
    <asp:LinkButton ID="lnkbtnFront" runat="server" Text="上一页" CommandName="pre"/>&nbsp;
    <asp:LinkButton ID="lnkbtnNext" runat="server" Text="下一页" CommandName="next"/>&nbsp;
    <asp:LinkButton ID="lnkbtnLast" runat="server" Text="尾页" CommandName="last"/> &nbsp; 
    跳转至:<asp:TextBox ID="txtPage" runat="server" Width="30px" />&nbsp;
    <asp:Button ID="btnGo" runat="server" Text="GO" CommandName="search"/>
    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
            ControlToValidate="txtPage" ErrorMessage="请输入数字(除了数值0)" 
            ValidationExpression="[1-9]+(\d)*"></asp:RegularExpressionValidator>
</FooterTemplate>

编写DataList的ItemCommand事件

根据在模板中设置四个LinkButton以及跳转按钮的CommandName的值,,在ItemCommand事件中设置单击“首页”、“上一页”、“下一页”、“尾页”按钮时,通过响应的command设置当前页索引及绑定当前页,并实现单击跳转按钮时跳转到指定页码的功能。代码如下:

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    switch (e.CommandName)
    {
        case "first":
            ps.CurrentPageIndex = 0;
            Bind(ps.CurrentPageIndex);
            break;
        case "pre":
            ps.CurrentPageIndex = ps.CurrentPageIndex - 1;
            Bind(ps.CurrentPageIndex);
            break;
        case "next":
            ps.CurrentPageIndex = ps.CurrentPageIndex + 1;
            Bind(ps.CurrentPageIndex);
            break;
        case "last":
            ps.CurrentPageIndex = ps.PageCount - 1;
            Bind(ps.CurrentPageIndex);
            break;
        case "search":
            if (e.Item.ItemType == ListItemType.Footer)	//判断控件类型是否为列表控件底部类型
            {
                int PageCount = int.Parse(ps.PageCount.ToString());
                TextBox txtPage = e.Item.FindControl("txtPage") as TextBox;
                int MyPageNum = 0;
                if (!txtPage.Text.Equals(""))
                {
                    MyPageNum = Convert.ToInt32(txtPage.Text.ToString());
                    if (MyPageNum <= 0 || MyPageNum > PageCount)
                    {
                        Response.Write("<script>alert('请输入页数并确定没有超出总页数!')</script>");
                    }
                    else
                    {
                        Bind(MyPageNum - 1);
                    }
                }
            }
            break;
        default:
            break;
    }
}

编写DataList的ItemDataBound事件

在ItemDataBound事件中处理各个按钮的显示状态以及Label控件的显示内容,代码如下:

protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Footer)
    {
        //获取模板中控件的引用
        Label CurrentPage = e.Item.FindControl("labNowPage") as Label;
        Label PageCount = e.Item.FindControl("labCount") as Label;
        LinkButton FirstPage = e.Item.FindControl("lnkbtnFirst") as LinkButton;
        LinkButton PrePage = e.Item.FindControl("lnkbtnFront") as LinkButton;
        LinkButton NextPage = e.Item.FindControl("lnkbtnNext") as LinkButton;
        LinkButton LastPage = e.Item.FindControl("lnkbtnLast") as LinkButton;
        CurrentPage.Text = (ps.CurrentPageIndex + 1).ToString();//绑定显示当前页
        PageCount.Text = ps.PageCount.ToString();//绑定显示总页数
        if (ps.IsFirstPage)//如果是第一页,首页和上一页按钮
        {
            FirstPage.Enabled = false;
            PrePage.Enabled = false;
        }
        if (ps.IsLastPage)//如果是最后一页"下一页"和"尾页"按钮不能用
        {
            NextPage.Enabled = false;
            LastPage.Enabled = false;
        }
    }
}

效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值