专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > ASP

【asp.net】asp分页<牛腩>

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
【asp.net】asp分页<牛腩>

前言

        在我们平时浏览网页时,都会遇到样式各异的分页,这样做既美观,又减少了系统的压力,一举多得。鉴于牛腩新闻发布系统中,牛腩老师只讲了分页的方法,并举了个例子,并没有真正将分页融合到系统中,今天我就将分页融合到系统的方法分享给大家。

假分页

        顾名思义,这个不是真正的分页,而是先选择出所有的记录后在进行分页。如下:

首先,我们打开gridview控件的属性,将gridview的AllowPaging属性改为True,然后,可以更改的它的PageSize属性,来控制每页显示的数据。最后,打开该控件的事件,找到PageIndexChanging方法,双击进入。如下图:


        在PageIndexChanging事件方法下:

gvNewNews.PageIndex = e.NewPageIndex;
gvNewNews.DataSource=new NewsManager().SelectAll();
gvNewNews.DataBind();
        这一步的操作就是将页数的索引传入gridview中,然后根据索引完成页数的点选。

优缺点:

优:操作简单,容易实现,对于小批量的数据操作得心应手。

缺:每次翻页执行的都是SelectAll方法,也就是说,每次翻页都会将数据库中所有的新闻重新选出来一次,影响系统速度,如果数据量大到一定程度,时间超慢不说,还可能引起系统崩溃。

真分页

        刚说了假分页,肯定就会有一个真分页,真分页的意思就是只从数据库中选择当前页的记录,也就是说,这个页有多条记录,就从数据库取相应的多少条,相比之下,这样做的执行效率要高出假分页太多。以新闻管理页面为例,下面来看实现步骤。

        首先,这个是用了一个asp.net的控件,叫做Aspnetpager,我们先把这个控件引入到系统中,具体引入方法就不必多说。直接分析,首先,根据牛腩老师给我们的例子,我们需要两个方法,一个方法取出我们需要区间的新闻,一个方法需要知道新闻总条数。这两个方法的如下:

        /// <summary>
        /// 全部新闻分页设计
        /// </summary>
        /// <param name="startindex">开始条数</param>
        /// <param name="endindex">结束条数</param>
        /// <returns></returns>
        public DataTable SelectAllNewsPage(int startindex, int endindex)
        {
            SqlParameter[] paras ={
                                    new SqlParameter("@startindex",startindex),
                                    new SqlParameter("@endindex",endindex)
                                };
            string sql = "news_SelectAllNewsPage";
            DataTable dt = sqlhelper.ExecuteReader(sql, CommandType.StoredProcedure, paras);
            return dt;
        }

        /// <summary>
        /// 查询全部新闻条数
        /// </summary>
        /// <returns></returns>
        public string CountAllNews()
        {
            SqlParameter[] paras = { };
            string sql = @"select count(*) from news";
            DataTable dt = sqlhelper.ExecuteReader(sql, CommandType.Text, paras);
            string count = dt.Rows[0][0].ToString();
            return count;
        }

相应存储过程:

USE [newssystem]
GO
/****** Object:  StoredProcedure [dbo].[news_SelectAllNewsPage]    Script Date: 05/05/2016 16:33:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[news_SelectAllNewsPage]
	@startindex int,
	@endindex int
AS
BEGIN
	with temptbl as (
		select ROW_NUMBER() over(order by id desc)as Row,* from news)
		select * from temptbl where Row between @startindex and @endindex
END

        方法我们写完了,现在我们开始构造U层。首先,将aspnetpager控件拖到设计器中,如图,

        然后,在相应的后台设计中就会出现如下字段:


        稍微做一下命名:


        这样我们的控件就算是添加成功了。接下来我们要在左下角的设计视图中,双击该控件,显示出该控件的PageChanged方法。在该方法下:

        /// <summary>
        /// 分页设计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void anp_PageChanged(object sender, EventArgs e)
        {
            int startindex = anp.StartRecordIndex;
            int endindex = anp.EndRecordIndex;
            DataTable dt = new NewsManager().SelectAllNewsPage(startindex, endindex);
            //绑定新闻列表
            repNews.DataSource = dt;
            repNews.DataBind();
        }
        然后,在该页面的Page_Load中写:

anp.RecordCount = int.Parse(new NewsManager().CountAllNews());//获取新闻总数
        这样,我们的新闻分页就做好了。等下,是不是发现如果点击页数,分页能正常显示,但是在页面第一次加载的时候,却发现还是长长的一条,没有分页,这是我们的SelectAll方法在作怪(Page_Load中绑定的是SelectAll方法),该方法选取了全部的新闻,为了使界面完美,我对该方法做了修改:

        /// <summary>
        /// 选择全部新闻
        /// </summary>
        /// <returns></returns>
        public DataTable SelectAll()
        {
            SqlParameter[] paras = { };
            DataTable dt = new DataTable();
            string sql = @"with temptbl as (
		select ROW_NUMBER() over(order by id desc)as Row,* from news)
		select * from temptbl where Row between 1 and 7";

            dt = new SQLHelper().ExecuteReader(sql, CommandType.Text, paras);
            return dt;
        }
(跟存储过程类似,只不过是将开始条数和结束条数固定化,默认第一页)

        这样,我的牛腩新闻发布系统分页设计就算做完了。

总结

        很多知识,很多技术,我们只是感觉会,看了懂,真正做起来却并不是那么如意,这个分页我做了一天多,深刻体会了纸上得来终觉浅,绝知此事要躬行的道理。在下篇博客中,我将总结list页面中添加分页以及遇到的问题。欢迎大家提出宝贵的意见或建议。

2楼binggetong4天前 06:36
如果不是亲眼看到这篇博客是如何产生的,我也就不会知道这里面的耐心和坚持。
1楼u0130306015天前 17:20
恩,看来你在渐渐上道哦,很优秀的博文,加油O(∩_∩)O~
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ASP怎么隐藏表单

    ASP如何隐藏表单 <%if Cookies_Toy ="" then response.write "<a href='login.asp'>登录</a> <a href='reg.asp'>注册</a>" ...

  • 为何js调用css脚本后没效果

    为什么js调用css脚本后没效果 这个是css的脚本代码: body,ul,li{margin: 0; padding: 0; border: 0;} body {background: #f5f...

  • 怎么伪造post请求,求指点。

    如何伪造post请求,求指点。。。 要查询大批(也就几万个)运单的状态,那查询网站一次最多查24个,这一个个搞会搞死人的。。 有...

  • Asp.net_简略代码设置GridView自适应列宽不变形

    Asp.net_简单代码设置GridView自适应列宽不变形 动态绑定的GridView由于列数不固定,而列又太多(博主做的这个项目有150个左右的字段...

  • ASP.NET上实现AJAX注册提醒

    ASP.NET下实现AJAX注册提醒 Ajax全称是,主要是利用JavaScript实现异步的数据传输,首先说异步,异步是当前操作进行的时候,用...

  • aspnet_regiis装配出错:0x80070005 拒绝访问

    aspnet_regiis安装出错:0x80070005 拒绝访问 点击右边红色标题查看本文完整版:aspnet_regiis安装出错:0x80070005 拒绝访问安装...

  • 关于网站边框解决方法

    关于网站边框 像hao123这样的网站上的边框是着么弄的?背景图片吗?http://www.hao123.com 另外哪个素材网站有实用的这内素材 -----...

  • ! 多表分组查询统计

    求助!! 多表分组查询统计 高手们,帮帮忙! 用户表 D_user 为 ID Username GroupID 1 张三 2 2 李四 2 3 王五 ...

  • 在Paypal交付的同时,把表单的数据提交给数据库

    在Paypal提交的同时,把表单的数据提交给数据库 本帖最后由 liuyang2708 于 2012-11-20 23:14:54 编辑 在提交这个支付...

  • 虚拟目录上JavaScript不能正常执行

    虚拟目录下JavaScript不能正常执行 各位大侠好,我在同一台服务器上用两种方式部署同一个网站。 第一种方法:在IIS下直接建一个网站...

热门推荐: