• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netc#不用控件的分页效果

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

.net中有很多分页的控件,不过用起来感觉很不舒服,今天不用控件简单的写一个,聊以自慰。

.aspx页面中添加一个<asp:Label runat="server" ID="pContent"></asp:Label>

.aspx.cs页面中写如下代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack){
        my.ConnOpen(); //打开数据库
        setPageList();      //这是分页代码
        my.ConnClose(); //关闭数据库
    }
}

    public void setPageList()
    {
        DateTime startTime = DateTime.Now;

        double pageConfig = 10;      //每页多少条
        double infoCount = 0;        //共有多少条记录
        infoCount = my.GetDataCount("select count(*) as num from [info] where Info_NoRecycleBin=1", my.Conn);   // 自定义函数,求有多少条记录
        double lastly = infoCount / pageConfig; // 求分页数,共有多少页


        int page = Convert.ToInt16(Request.QueryString["page"]);   // 当前第几页
        if (page == 0)
        {
            page = 1;
        }


        int first = 1;
        int last = page - 1;     // 上一页
        int nextpage = page + 1; // 下一页 做翻页用

        if (lastly == 1)
        {

        }
        else
        {
            if (Convert.ToInt16(lastly.ToString().Split('.').Length) != 1)
            {
                lastly = Convert.ToInt16(lastly.ToString().Split('.')[0]) + 1; //分页数如果不是整数那么加1
            }
        }


        /* -----------------------------------------------------------------

        如何确定分页的sql语句?

        infoCount      共有多少条记录
        pageConfig    每页多少条记录
        page            当前第几页
        lastly              共有多少页 
  
        --------------------------------------------------------------------
        【代码1】
         
        sql = "select top " + pageConfig + " * from (select top " + pageConfig + " * from (select top " + pageConfig * page + " [Info_Title],[Info_ID],[Info_Type] from Info where Info_NoRecycleBin=1 order by Info_ID desc) as a order by Info_ID asc) as b order by Info_ID desc";
        当前为第一页的时候,从后先取10条,再取10条;第二页的时候先取20条,再取10条;第三页的时候先取30条,再取10条;依此类推,当当前为1000多页的时候,第一次需要保存1W多条记录,那效率也太低了。
  
        --------------------------------------------------------------------
   【代码2】
         
        修正
        1,求第一页末尾id。例如:共36条记录,每页显示10条,当前为第1页,这个时侯末尾id为26。
          sql1 = select top 10 info_id from info order by info_id desc       从后到前取10条记录,返回一个新表,例如36,35,34,33,32……26。
          sql2 = select top 1 * from [sql1] order by info_id desc            sql2中查询表的时候直接查询sql1生成出的新表,倒序第1位就是26了。
    
        2,其他页大于id的条件查询。 
          sql3 = select top 10 info_id from info where info_id>[sql2] order by info_id asc       结果为 26,27……36。
    sql4 = select top 10 info_id from [sql3] order by info_id desc                         结果为 36,35……26。
          
         
        string sql = "select * from (select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [info_id]>=(select top 1 * from (select top " + pageConfig * page + " [info_id] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc) as a order by [info_id] asc) and [Info_NoRecycleBin]=1 order by [info_id] asc) as b order by [info_id] desc"; 
        
        仔细一看,末页条数永远为10条,这个是不是问题呢,就看作者的心态了。我认为这算瑕疵,那我就修正它。
       
        --------------------------------------------------------------------
        【代码3】 
         
        修正
         * 假设数据库里有36条记录,每页10条,共4页,第4页显示6条
         * 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
         * -----------------------------------------------------------------------------------------------------------------------------------------------------------------
         *      【第四页】 |                   【第三页】                  |                      【第二页】                    |                   【第一页】              
         *       这是正确的分页,最后一页6条记录
         * --------------------------------------------------------------------------------------------------------------------------------------------------
         *                            |重复的记录|                                    |                                                              | 
         *      这是【代码2】的分页,第1页、第2页、第3页正常,第4页因为不足10条记录,所以用第3页的记录补充了,所以末页永远为10条。
         * --------------------------------------------------------------------------------------------------------------------------------------------------
         * 当page=1时,直接取10条,否则条件按id小于计算,这样当最后一页记录不足10条时,就不会取上一页的记录补充了。
         
         select top 10 [info_id], [info_title] from [info] where [info_id] < (select top 1 * from (select top 20 [info_id] from [info] order by [info_id] desc) as a order by [info_id] asc) order by [info_id] desc    这段sql取出的是第4页,结果为1,2,3,4,5,6。
         
         在top20那的意思为第3页,30代表第4页,10代表第2页,依此类推。
         注意,上面那个依此类推只能向上算,第2页,第3页,第4页……第n页,如果想取第1页,那么得另行编写。
         
        --------------------------------------------------------------------
        【代码4】
          
        修正
         
         if(page == 1)
         {
             select top 10 * from [info] order by [info_id] desc
         }
         else
         {
             执行【代码3】
         }
         

       ===================================================================
       */

        string sql = "";
        if (page == 1)
        {
            sql = "select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc";
        }
        else
        {
            sql = "select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [info_id] < (select top 1 * from (select top " + pageConfig * (page-1) + " [info_id] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc) as a order by [info_id] asc) and [Info_NoRecycleBin]=1 order by [info_id] desc";
        }


        DataSet md = my.getDataSet(sql, "tb", my.Conn);

        pContent.Text = "<table style='BORDER-COLLAPSE: collapse' borderColor='#f5f5f5' width='100%' border='1' cellspacing='0' cellpadding='2'>";
        if (md.Tables["tb"].Rows.Count == 0)
        {
            pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\"><td colspan=5>对不起,当前没有符合条件的记录。</td></tr>";
        }
        else
        {
            pContent.Text += "<tr class='pl1'><td>编号</td><td>标题</td><td>类别</td><td>修改</td><td>删除</td></tr>";

            for (int i = 0; i < md.Tables["tb"].Rows.Count; i++)
            {
                pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\">";
                pContent.Text += "<td>" + md.Tables["tb"].Rows[i]["Info_ID"].ToString() + "</td>";
                pContent.Text += "<td>" + md.Tables["tb"].Rows[i]["Info_Title"].ToString() + "</td>";
                pContent.Text += "<td><a href='article_type_list.aspx?t;
            }


            pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\"><td colspan=2>页数:";
            for (int i = 1; i <= lastly; i++)
            {
                if (page == i)
                {
                    pContent.Text += "<b>[" + i.ToString() + "]</b> ";
                }
                else
                {
                    pContent.Text += "<a href='?page=" + i.ToString() + "'>" + i.ToString() + "</a> ";
                }
            }
            pContent.Text += "</td>";
            DateTime endTime = DateTime.Now;
            TimeSpan ts = endTime - startTime;
            pContent.Text += "<td colspan=2 align=right color=gray>页面执行时间:&nbsp;" + ts.TotalMilliseconds.ToString() + "&nbsp;毫秒</td>";
            pContent.Text += "<td><input type='button' name='Submit' value='删除' onclick='deleteArticle()' /></td></tr>";
        }
        pContent.Text += "</table>";

    }

// 蓝色部分为sql的分析,红色部分为页面内容显示部分。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap