DataList或Repeater控件的分页

 

Asp.net提供了三个功能强大的列表控件:DataGrid、DataList和Repeater控件,但其中只有DataGrid控件提供分页功能。相对DataGrid,DataList和Repeater控件具有更高的样式自定义性,所以很多时候我们喜欢使用DataList或Repeater控件来显示数据。

 

 

 实现DataList或Repeater控件的分页显示有几种方法:

 1、写一个方法或存储过程,根据传入的页数返回需要显示的数据表(DataTable)

 2、使用PagedDataSource类

 

     本篇文章主要说怎么使用PagedDataSource类实现DataList和Repeater控件的分页显示。DataGrid控件内部也使用了PagedDataSource类,PagedDataSource 类封装 DataGrid 控件的属性,这些属性使 DataGrid 可以执行分页。

 

 PagedDataSource 类的部分公共属性:

 AllowCustomPaging  获取或设置指示是否启用自定义分页的值。

 AllowPaging   获取或设置指示是否启用分页的值。

 Count    获取要从数据源使用的项数。

 CurrentPageIndex   获取或设置当前页的索引。

 DataSource   获取或设置数据源。

 DataSourceCount   获取数据源中的项数。

 FirstIndexInPage   获取页中的第一个索引。

 IsCustomPagingEnabled  获取一个值,该值指示是否启用自定义分页。

 IsFirstPage   获取一个值,该值指示当前页是否是首页。

 IsLastPage   获取一个值,该值指示当前页是否是最后一页。

 IsPagingEnabled   获取一个值,该值指示是否启用分页。

 IsReadOnly   获取一个值,该值指示数据源是否是只读的。

 IsSynchronized   获取一个值,该值指示是否同步对数据源的访问(线程安全)。

 PageCount   获取显示数据源中的所有项所需要的总页数。

 PageSize   获取或设置要在单页上显示的项数。

 VirtualCount   获取或设置在使用自定义分页时数据源中的实际项数。

 

      这些属性是否和DataGrid的属性很相似?没错,DataGrid控件就是使用PagedDataSource类来实现数据分页显示的 。下面举个使用PagedDataSource类实现DataList和Repeater控件的分页显示的例子:

 

public void Page_Load(Object src,EventArgs e)

{

OleDbConnection objConn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\test.mdb");

OleDbDataAdapter objCommand=new OleDbDataAdapter("select * from Users",objConn);

DataSet ds=new DataSet();

objCommand.Fill(ds);

 

//对PagedDataSource 对象的相关属性赋值

PagedDataSource objPds = new PagedDataSource();

objPds.DataSource = ds.Tables[0].DefaultView;

objPds.AllowPaging = true;

objPds.PageSize = 5;

int CurPage;

 

//当前页面从Page查询参数获取

if (Request.QueryString["Page"] != null)

  CurPage=Convert.ToInt32(Request.QueryString["Page"]);

else

  CurPage=1;

 

objPds.CurrentPageIndex = CurPage-1;

lblCurrentPage.Text = "Page: " + CurPage.ToString();

 

if (!objPds.IsFirstPage)

  lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);

 

if (!objPds.IsLastPage)

  lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);

 

//把PagedDataSource 对象赋给Repeater控件

Repeater1.DataSource=objPds;

Repeater1.DataBind();

}

 

这样就可以很简单的实现DataList和Repeater控件的分页显示。但这样做有个缺点,就是每次都要把所有页的数据Select出来,DataGrid也是这样,这样会降低一点效率(大多时候体会不出来差别);如果使用第一种方法就可以只Select出当前页的数据(实现方法请查看有关文章)

 

 

 

 

 

//分页操作
    int currentPage=Convert.ToInt32(this.lblPage.Text);
    System.Web.UI.WebControls.PagedDataSource ps=new PagedDataSource();
    ps.DataSource=ds.Tables["booktype"].DefaultView;
    ps.AllowPaging=true;
    ps.PageSize=2;
    ps.CurrentPageIndex=currentPage-1;
    this.ibtnfirst.Enabled=true;
    this.ibtnNext.Enabled=true;
    this.ibtnprevious.Enabled =true;
    this.ibtnlast.Enabled=true;
    count=ps.PageCount;
    this.lblPageTotal.Text=count.ToString();
    if(ps.IsLastPage)
    {
     this.ibtnlast.Enabled=false;
     this.ibtnNext.Enabled=false;
    }
    if(ps.IsFirstPage)
    {
     this.ibtnprevious.Enabled=false;
     this.ibtnfirst.Enabled=false;
    }
    this.MyList.DataSource=ps;
    this.MyList.DataBind();

 

 

 

重点:DataList的分页技巧:
绑定数据显示,这里只是简单写以下操作步骤,详细信息请参考dataList基本内容,这里主要写分页的几种方法。
准备工作:
1.把DataList控件拖到页面中
2.使用Dreamweaver生成个种模板的表格,以及其样式
3.复制table代码粘贴到相应的模版中
4.在bf层添加返回相应信息的方法
绑定数据:
5.在dataList代码中,使用《%# Eval() %》的方法绑定数据,此时若 需要AJXA就添加进去既可。注意 绑定数据时,牵扯到主外键的调用,和不同数据类型的转换可用以下方法解决:
主外键调用:((强转类型)(Eval("字段名"))).字段名
类型转换:((强转类型)(Eval("字段名")).toString(参数)

分页方法一:使用DropDownList实现分页效果
分页思想:要显示第几页,我们就查询出第几页相对应的信息,进行显示
1.添加DropDownList控件
2.在DA层里写查询第几页信息的方法,需要传入参数:第几页(PageSize,显示行数(Pageindex)
需要拼接字符串:查询tno不在pagesize*pageindex中的前pageindex条数据的信息: string sql = "select top "+pageSize+" * from Teacher where tno not in(select top " + pageSize * pageIndex + " tno from teacher)";
3.在DA里写查询共有多少行的方法,用来设定一共多少页,
  小方法:去首行首页:int count=(int)cmd.ExacuteScalar();
4.在BF层里调用DA的总行数方法,写设定总行数的方法,
  计算总行数的方法:(int)Math.Ceiling(count/(pageSize*1.0));
   解释:这个pageSize*1.0是把整数转换成double型,此方法是取大于当前数的最小整数。
5.往dropDownList中添加页的项:fillPage()方法,需要使用循环添加
  创建每一项:ListItem item=new ListItem(text,value);
   添加项方法:dropDownList.Item.add(item);
6.在页面添加事件中,调用数据加载方法(数据绑定方法)FillTeacher(),传入参数0显示第一页,不再鳌述。
    在dropDownList的改变事件(双击进去)中调用加载项的方法(fillPage)

分页方法二:使用超链接实现分页
1.
添加一个Lable控件
2.同上方法添加页的每一项在lable的Text中
3.在把他的每一项写成一个个的超链接<a></a>,此时需要使用i指定一个第几页的参数

分页方法三:使用placeholder控件(位置预留器)
1.
添加placeholder控件
2.在添加页的项的方法(fillPage)中,动态添加linkbutton到placeholder中。方法:placeholder.Controls(button);
3.写button事件,由于这里的button时动态生成的,所以在这里我们没有办法双击进去写代码,怎样解决这个问题呢?分析:实际上,   所有的事件都时代理,所以我们可以考虑用事件代理处理这个问题,解决方法:button.Click+=new EventHandler(指向代理的方法   (Button_Click)),意思时   为每个按钮制定代理的处理方法,那么我们就可以在Button_Click方法中写代码,实现对每一页的查询   加载,这里给出相应源码,助于理解:
      void btn_Click(object sender, EventArgs e)
       {
            //找出事件源对应的按钮对象
            LinkButton btn = sender as LinkButton;
            //找出按钮的CommandArgument(按钮的预留参数相当于value,代表的是页号)
            int pageIndex = int.Parse(btn.CommandArgument);
            //分页查询
            FillTeacher(pageIndex);
            //刷新UpdatePanel1
            UpdatePanel1.Update();
        }
4.这样按照第一个的书写方法就可以实现分页查询了,但是有一个问题就是每一次点击按钮时页面总是刷新,为什么会这样呢?明明我们使用了AJXA啊,怎么还实现不了一部刷新呢?因为当运行程序,先加载defult页面,在加载ScriptManager再加载显示的数据   ,在动态加载按钮,那么这时ScriptManager不认识按钮,所以他不会异步刷新,就早成了这样的效果,怎么解决呢?指定按钮页作 为一部刷新控件就可以了:ScriptManager1.RegisterAsyncPostBackControl(btn);
分页方法四:按钮实现的分页方式
     那么我们现在说的这种分页方式是,现在很流行的分页方式之一,也是这里我所说到的相对比较难的方法之一,及其这两点大家一定要把这种方法学好了如果你想学好.NET的话,其实呢,前边我们只要都掌握了,其实这种就能迎刃而解了!
号,我们就正式进入这种分页方式的学习,这种方式就是:按钮和下拉列表实现的,就时上一页,下一页,跳转到第几页的方式,那么我们做出来后大家就会觉得很熟悉了!
那好就让我们来做一下先:
1.如同前边的分页方式一样我们把数据加载上第一页的信息,fillNote()方法,
2.在页面中添加首页,上一页,下一页,尾页(按钮),跳转到第x(下拉列表)页,共x(label)页,当前第X(label)页,等选项同时设置其属性ID)我这里时这样设置的:首页:btFirst
上一页:ID=btPre
下一页:ID=btNext
尾页:ID=btRtern
Label(共多少页):ID=all
Label(当前页):ID=nonce
3.那我们在写个方法把下拉列表的项加载,我想通过上边的讲解,我们应该都能做出来,我就不详细的跟大家讲了,如果有不会的,那么还请在会到第一种方法就开始信息的学习吧!
4.那么我们的页页面就做好了,我们分析操作的流程
   a.页面加载时,一般要默认显示第一页,那么我们在第一步就固定了其显示第一页,这时的页面应该显示第一页,下拉列表选项已经添加完成,共几页第页1页已经完成他它的显示工作。那么此时的首页和第一页应该不可用。
   b.当点击尾页时,尾页和下一页就不会用。
   c.当点击上一页,只要没到第一页,那么所有按钮都可用,要到了第一页,那么第一页和首页不可用。
   d.当点击下一页,只要没到最后一页,那么所有按钮都可用,要是到了最后一夜,那么下一页和尾页就不可用。
   e.当我们选择下拉列表显示第几页时同样以上的逻辑,那么下拉列表中的选中值页应该随我们选中而改变其显示值
   f.所有的页面改变时,第几页的值和下拉列表的值都应随之改变
通过以上的逻辑分析,我们在写代码,那么我们的思路就清晰多了,那好,详细的代码还是有由我的it虫虫的>demo去做解释吧!在那里,上边的方法我都由实例,注释页非常详细了,希望对大家由所帮助!

这里的代码不全详细的代码请参考我做的例题一起理解,这是对它的一些主要步骤,以及方法作了必要的解释,dataList的分页方法还很多,大家有好的方法不妨拿出来大家一起分享!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值