asp.net 中DataGrid自定义分页(简单,实用,易懂)

时间:2021-03-07 16:14:30
在asp.net 中,DataGrid自定义分页是个常见的问题.在项目中,很多人采用aspnetpage控件结合高效SQL存储过程分页.本文将采用简单、易懂的方式来实现项目中的分页要求.项目中数据表记录为80000,0条.分页速度很快的.本人对照了下,在如此记录情况下,使用DataGrid自带的分页功能,在切换到下一页时,cpu有使用100% 的过程;而使用本文的方法自定义分页,cpu使用只有百分之几哦..... asp.net 中DataGrid自定义分页(简单,实用,易懂)using System;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Collections;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.ComponentModel;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Data;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Drawing;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Web;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Web.SessionState;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Web.UI;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Web.UI.WebControls;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Web.UI.HtmlControls;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Data.SqlClient;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
using System.Configuration;
asp.net 中DataGrid自定义分页(简单,实用,易懂)
namespace WS.Webs
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)    
/// <summary>
asp.net 中DataGrid自定义分页(简单,实用,易懂)    
/// WebForm1 的摘要说明。
asp.net 中DataGrid自定义分页(简单,实用,易懂)    
/// </summary>

asp.net 中DataGrid自定义分页(简单,实用,易懂)    public class WebForm1 : System.Web.UI.Page
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)    
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.DataList datalist1;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.Label LPageCount;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.Label LRecordCount;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.LinkButton Fistpage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.LinkButton Prevpage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.LinkButton Nextpage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.LinkButton Lastpage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.Label LCurrentPage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
protected System.Web.UI.WebControls.TextBox gotoPage;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
//自定义分页码记录
asp.net 中DataGrid自定义分页(简单,实用,易懂)
        const int PageSize=20;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
int PageCount,RecCount,CurrentPage,Pages,JumpPage;//定义几个保存分页参数变量
asp.net 中DataGrid自定义分页(简单,实用,易懂)

asp.net 中DataGrid自定义分页(简单,实用,易懂)    
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
private void Page_Load(object sender, System.EventArgs e)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
if(!Page.IsPostBack)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                RecCount 
= Calc();//通过Calc()函数获取总记录数
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                PageCount = RecCount/PageSize + OverPage();//计算总页数(加上OverPage()函数防止有余数造成显示数据不完整)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                ViewState["PageCounts"= RecCount/PageSize - ModPage();//保存总页参数到ViewState(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                ViewState["PageIndex"= 0;//保存一个为0的页面索引值到ViewState
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                ViewState["JumpPages"= PageCount;//保存PageCount到ViewState,跳页时判断用户输入数是否超出页码范围
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
//显示LPageCount、LRecordCount的状态
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                LPageCount.Text = PageCount.ToString();
asp.net 中DataGrid自定义分页(简单,实用,易懂)                LRecordCount.Text 
= RecCount.ToString();
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
//判断跳页文本框失效
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                if(RecCount <= 20)
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    gotoPage.Enabled 
= false;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                TDataBind();
//调用数据绑定函数TDataBind()进行数据绑定运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)

asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
//计算余页
asp.net 中DataGrid自定义分页(简单,实用,易懂)
        public int OverPage()
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
int pages = 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
if(RecCount%PageSize != 0)
asp.net 中DataGrid自定义分页(简单,实用,易懂)                pages 
= 1;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
else
asp.net 中DataGrid自定义分页(简单,实用,易懂)                pages 
= 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
return pages;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
//计算余页,防止SQL语句执行时溢出查询范围
asp.net 中DataGrid自定义分页(简单,实用,易懂)
        public int ModPage()
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
int pages = 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
if(RecCount%PageSize == 0 && RecCount != 0)
asp.net 中DataGrid自定义分页(简单,实用,易懂)                pages 
= 1;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
else
asp.net 中DataGrid自定义分页(简单,实用,易懂)                pages 
= 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
return pages;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
/*
asp.net 中DataGrid自定义分页(简单,实用,易懂)   *计算总记录的静态函数
asp.net 中DataGrid自定义分页(简单,实用,易懂)   *本人在这里使用静态函数的理由是:如果引用的是静态数据或静态函数,连接器会优化生成代码,去掉动态重定位项(对
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)海量数据表分页效果更明显)。
asp.net 中DataGrid自定义分页(简单,实用,易懂)   *希望大家给予意见、如有不正确的地方望指正。
asp.net 中DataGrid自定义分页(简单,实用,易懂)  
*/

asp.net 中DataGrid自定义分页(简单,实用,易懂)        
public static int Calc()
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
int RecordCount = 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            SqlCommand MyCmd 
= new SqlCommand("select count(*) as co from fdcproject",MyCon());
asp.net 中DataGrid自定义分页(简单,实用,易懂)            SqlDataReader dr 
= MyCmd.ExecuteReader();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
if(dr.Read())
asp.net 中DataGrid自定义分页(简单,实用,易懂)                RecordCount 
= Int32.Parse(dr["co"].ToString());
asp.net 中DataGrid自定义分页(简单,实用,易懂)            MyCmd.Connection.Close();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
return RecordCount;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
//数据库连接语句(从Web.Config中获取)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
        public static SqlConnection MyCon()
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            SqlConnection MyConnection 
= new SqlConnection(ConfigurationSettings.AppSettings["DSN2"]);
asp.net 中DataGrid自定义分页(简单,实用,易懂)            MyConnection.Open();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
return MyConnection;
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
private void TDataBind()
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            CurrentPage 
= (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行按钮失效运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数进行按钮失效运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
//判断四个按钮(首页、上一页、下一页、尾页)状态
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            if (CurrentPage + 1 > 1)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Fistpage.Enabled 
= true;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Prevpage.Enabled 
= true;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)            
else
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Fistpage.Enabled 
= false;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Prevpage.Enabled 
= false;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)            
if (CurrentPage == Pages)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Nextpage.Enabled 
= false;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Lastpage.Enabled 
= false;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)            
else
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Nextpage.Enabled 
= true;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Lastpage.Enabled 
= true;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)            
//数据绑定到DataList控件
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            DataSet ds = new DataSet();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
//核心SQL语句,进行查询运算(决定了分页的效率:))
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            SqlDataAdapter MyAdapter = new SqlDataAdapter("Select Top "+PageSize+" * from fdcproject where projid not in(select top "+PageSize*CurrentPage+" projid from fdcproject order by projid asc) order by projid asc",MyCon());
asp.net 中DataGrid自定义分页(简单,实用,易懂)             MyAdapter.Fill(ds,
"news");
asp.net 中DataGrid自定义分页(简单,实用,易懂)            datalist1.DataSource 
= ds.Tables["news"].DefaultView;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            datalist1.DataBind();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
//显示Label控件LCurrentPaget和文本框控件gotoPage状态
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            LCurrentPage.Text = (CurrentPage+1).ToString();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            gotoPage.Text 
= (CurrentPage+1).ToString();
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
//释放SqlDataAdapter
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            MyAdapter.Dispose();
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
Web 窗体设计器生成的代码
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
private void gotoPage_TextChanged(object sender, System.EventArgs e)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
try
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)          
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)           JumpPage 
= (int)ViewState["JumpPages"];//从ViewState中读取可用页数值保存到JumpPage变量中
asp.net 中DataGrid自定义分页(简单,实用,易懂)           
//判断用户输入值是否超过可用页数范围值
asp.net 中DataGrid自定义分页(简单,实用,易懂)
           if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)
asp.net 中DataGrid自定义分页(简单,实用,易懂)            Response.Write(
"<script>alert('页码范围越界!');location.href='WebForm8.aspx'</script>");
asp.net 中DataGrid自定义分页(简单,实用,易懂)           
else
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                 
int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//转换用户输入值保存在int型InputPage变量中
asp.net 中DataGrid自定义分页(简单,实用,易懂)
                 ViewState["PageIndex"= InputPage;//写入InputPage值到ViewState["PageIndex"]中
asp.net 中DataGrid自定义分页(简单,实用,易懂)
               TDataBind();//调用数据绑定函数TDataBind()再次进行数据绑定运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)           }

asp.net 中DataGrid自定义分页(简单,实用,易懂)             
//捕获由用户输入不正确数据类型时造成的异常
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            catch(Exception exp)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)            
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)                Response.Write(
"<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
asp.net 中DataGrid自定义分页(简单,实用,易懂)        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)        
private void Page_OnClick(object sender, System.EventArgs e)
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)        
{
asp.net 中DataGrid自定义分页(简单,实用,易懂)            CurrentPage 
= (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行参数运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数运算
asp.net 中DataGrid自定义分页(简单,实用,易懂)

asp.net 中DataGrid自定义分页(简单,实用,易懂)            
string cmd = ((LinkButton)sender).CommandName;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            
switch(cmd)//筛选CommandName
asp.net 中DataGrid自定义分页(简单,实用,易懂)asp.net 中DataGrid自定义分页(简单,实用,易懂)
            {
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
case "next":
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    CurrentPage
++;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    
break;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
case "prev":
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    CurrentPage
--;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    
break;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
case "last":
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    CurrentPage 
= Pages;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    
break;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                
default:
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    CurrentPage 
= 0;
asp.net 中DataGrid自定义分页(简单,实用,易懂)                    
break;
asp.net 中DataGrid自定义分页(简单,实用,易懂)            }

asp.net 中DataGrid自定义分页(简单,实用,易懂)            ViewState[
"PageIndex"= CurrentPage;//将运算后的CurrentPage变量再次保存至ViewState
asp.net 中DataGrid自定义分页(简单,实用,易懂)
            TDataBind();//调用数据绑定函数TDataBind()
asp.net 中DataGrid自定义分页(简单,实用,易懂)
        }

asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)
asp.net 中DataGrid自定义分页(简单,实用,易懂)    }

asp.net 中DataGrid自定义分页(简单,实用,易懂)}