DataList的分页方法

来源:互联网 发布:mysql配置向导 编辑:程序博客网 时间:2024/05/16 14:06

 Asp.net 1.1开始,我们就开始使用DataGrid、DataList、Repeater控件,到了Asp.net 2.0又增加了GridView控件。GridView控件在DataGrid上做

了优化和改进,功能很强大,但是自定义性不够强。Repeater自定义性非常高。而DataList则兼而有之,其他方面本文不谈。这里就说下怎么给

DataList分页。
我的DataList分页方法的核心原理是利用PagedDataSource对象,PagedDataSource类封装了DataGrid 控件的属性,这些属性使 DataGrid 可以执

行分页,下面是PagedDataSource的公共属性:
AllowCustomPaging 获取或设置指示是否启用自定义分页的值。
AllowPaging 获取或设置指示是否启用分页的值。
Count 获取要从数据源使用的项数。
CurrentPageIndex 获取或设置当前页的索引。
DataSource 获取或设置数据源。
DataSourceCount 获取数据源中的项数。
FirstIndexInPage 获取页中的第一个索引。
IsCustomPagingEnabled 获取一个值,该值指示是否启用自定义分页。
IsFirstPage 获取一个值,该值指示当前页是否是首页。
IsLastPage 获取一个值,该值指示当前页是否是最后一页。
IsPagingEnabled 获取一个值,该值指示是否启用分页。
IsReadOnly 获取一个值,该值指示数据源是否是只读的。
IsSynchronized 获取一个值,该值指示是否同步对数据源的访问(线程安全)。
PageCount 获取显示数据源中的所有项所需要的总页数。
PageSize 获取或设置要在单页上显示的项数。
VirtualCount 获取或设置在使用自定义分页时数据源中的实际项数。

第一步 对PagedDataSource对象初始化
第二步,取出数据到dataset,付给PagedDataSource对象
第三步 添加相应的的控制按钮

示例代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    static string strconn = "server=.;uid=sa;pwd=;database=StudentSystem";
    SqlConnection conn = new SqlConnection(strconn);                        //连接字符串一般定义为全局的
       
    PagedDataSource ps = new PagedDataSource();
    static int count;          //用来表示总页数,一定要定义为全局的                                            

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)    //假如是页面首次加载
        {
            ViewState["PageIndex"] = "0";   //ViewState["pageindex"] 是用来控制PagedDataSource的当前页的,用来表示当前显示页的

索引号,也可以用一个全局变量来指示当前页的索引
            BindData();
        }

    }
  
    private void BindData()
    {
       
ps.AllowPaging = true;
        ps.PageSize = 5;                                    //定义分页的初始化状态
        ps.CurrentPageIndex = int.Parse(ViewState["PageIndex"].ToString());

        conn.Open();
        DataSet ds = CreateDataSet();
        ps.DataSource = ds.Tables[0].DefaultView;           //把数据源交给PagedDataSource对象,让它完成分页
        DataList1.DataSource = ps;
        DataList1.DataBind();
        conn.Close();

        count = int.Parse(ps.PageCount.ToString());          //注意一定要写在这个位置,即在PagedDataSource有数据之后,千万别写

在初始化状态时

        Label6.Text = count.ToString();                     //显示总页数
        Label5.Text = Convert.ToInt32((ps.CurrentPageIndex+1)).ToString();  //显示当前页

        if (ps.CurrentPageIndex == 0)
        {
            Lnkbtn_Prev.Enabled = false;
            Lnkbtn_Next.Enabled = true;
        }                                                       //控制显示按钮,最好写在加载数据的bind函数里面
       else if (ps.CurrentPageIndex == count - 1)
        { Lnkbtn_Prev.Enabled = true;
          Lnkbtn_Next.Enabled = false;
        }
        else
        {
            Lnkbtn_Prev.Enabled = true;
            Lnkbtn_Next.Enabled = true;
        }
    }

    protected void IndexChanging(object sender, EventArgs e)
   
{/*  假如在你的一个页面中有100个LinkButton,那么在服务器端要判断到底
      * 是哪个LinkButton被按动了。如果没有这二个属性,可以通过给每一个LinkButton的Text属性赋值,
      * 然后通过检测Text属性值,来判断到底是哪个LinkButton被按动了。当然你也可以通过给每一个
      * LinkButton命不同的名(当然你就是想命同样的名,在ASP.NET中也是不可以的),然后在事件处理函
      * 数中,通过检测Sender属性值来判断哪个LinkButton被按动。虽然上述这些方法都是可行的,但无一不繁琐
      * 。有了CommandName属性和CommandArgument属性就可以方便的解决这些问题。在程序中给LinkButton的
      * CommandName属性和CommandArgument属性赋值 不过要在设计界面时加上CommandArgument="首页"   例子:<asp:LinkButton

ID="Lnkbtn_Top" runat="server" OnClick="IndexChanging" CommandArgument="首页">首页</asp:LinkButton>
      把这几个LinkButton共用一段代码需要把他们的OnClick后面修改为同样的函数例如本例中的 OnClick="IndexChanging"*/
        string strCommand = ((LinkButton)sender).CommandArgument.ToString();
       
        int pageindex = int.Parse(ViewState["PageIndex"].ToString());//当前页

        if (strCommand == "上")  
           pageindex = pageindex - 1;
        else if (strCommand == "下")
           pageindex = pageindex + 1;       //判断是哪个LinkButton被触发
        else if (strCommand == "首页")
             pageindex = 0;
        else if  (strCommand == "末页")
             pageindex = count-1;
 
        ViewState["PageIndex"] = pageindex; //重新把修改了的页码付给当前页,必不可少
         BindData();
    }

    private DataSet CreateDataSet()
    {
        string strsql = "select * from studentinfo";
        SqlCommand cmd = new SqlCommand(strsql, conn);
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;
        DataSet ds = new DataSet();
        da.Fill(ds);
        return ds;
    }
}
LinkButton 的一些页面代码:
   <asp:LinkButton ID="Lnkbtn_Top" runat="server" OnClick="IndexChanging" CommandArgument="首页">首页</asp:LinkButton>
        <asp:LinkButton ID="Lnkbtn_Prev" runat="server" CommandArgument="上" OnClick="IndexChanging">上</asp:LinkButton>
        <asp:LinkButton ID="Lnkbtn_Next" runat="server" OnClick="IndexChanging" CommandArgument="下">下</asp:LinkButton>
        <asp:LinkButton ID="Lnkbtn_Last" runat="server" CommandArgument="末页" OnClick="IndexChanging">末页</asp:LinkButton>


总结一下,我们在前台写好DataList等待数据,而数据是由PagedDataSource提供的,分页通过我们新加的两个ImageButton来控制ViewState进而达

到控制PagedDataSource的CurrentPageIndex来实现的。所以,其实DataList也没干啥事,就是显示了每一页的数据而已。有一点需要说明,

PagedDataSource的CurrentPageIndex是从0开始的,这也是为什么在Page_load事件中要讲ViewState置为0而不是1的缘故。