您的位置:首页 > 编程语言 > ASP

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

2006-07-18 12:18 330 查看
在asp.net 中,DataGrid自定义分页是个常见的问题.在项目中,很多人采用aspnetpage控件结合高效SQL存储过程分页.本文将采用简单、易懂的方式来实现项目中的分页要求.项目中数据表记录为80000,0条.分页速度很快的.本人对照了下,在如此记录情况下,使用DataGrid自带的分页功能,在切换到下一页时,cpu有使用100% 的过程;而使用本文的方法自定义分页,cpu使用只有百分之几哦.....


using System;


using System.Collections;


using System.ComponentModel;


using System.Data;


using System.Drawing;


using System.Web;


using System.Web.SessionState;


using System.Web.UI;


using System.Web.UI.WebControls;


using System.Web.UI.HtmlControls;


using System.Data.SqlClient;


using System.Configuration;


namespace WS.Webs






{




/**//// <summary>


/// WebForm1 的摘要说明。


/// </summary>


public class WebForm1 : System.Web.UI.Page






{


protected System.Web.UI.WebControls.DataList datalist1;


protected System.Web.UI.WebControls.Label LPageCount;


protected System.Web.UI.WebControls.Label LRecordCount;


protected System.Web.UI.WebControls.LinkButton Fistpage;


protected System.Web.UI.WebControls.LinkButton Prevpage;


protected System.Web.UI.WebControls.LinkButton Nextpage;


protected System.Web.UI.WebControls.LinkButton Lastpage;


protected System.Web.UI.WebControls.Label LCurrentPage;


protected System.Web.UI.WebControls.TextBox gotoPage;


//自定义分页码记录


const int PageSize=20;


int PageCount,RecCount,CurrentPage,Pages,JumpPage;//定义几个保存分页参数变量







private void Page_Load(object sender, System.EventArgs e)






{


if(!Page.IsPostBack)






{


RecCount = Calc();//通过Calc()函数获取总记录数


PageCount = RecCount/PageSize + OverPage();//计算总页数(加上OverPage()函数防止有余数造成显示数据不完整)


ViewState["PageCounts"] = RecCount/PageSize - ModPage();//保存总页参数到ViewState(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句)


ViewState["PageIndex"] = 0;//保存一个为0的页面索引值到ViewState


ViewState["JumpPages"] = PageCount;//保存PageCount到ViewState,跳页时判断用户输入数是否超出页码范围


//显示LPageCount、LRecordCount的状态


LPageCount.Text = PageCount.ToString();


LRecordCount.Text = RecCount.ToString();


//判断跳页文本框失效


if(RecCount <= 20)


gotoPage.Enabled = false;


TDataBind();//调用数据绑定函数TDataBind()进行数据绑定运算




}


}




//计算余页


public int OverPage()






{


int pages = 0;


if(RecCount%PageSize != 0)


pages = 1;


else


pages = 0;


return pages;


}




//计算余页,防止SQL语句执行时溢出查询范围


public int ModPage()






{


int pages = 0;


if(RecCount%PageSize == 0 && RecCount != 0)


pages = 1;


else


pages = 0;


return pages;


}






/**//*


*计算总记录的静态函数


*本人在这里使用静态函数的理由是:如果引用的是静态数据或静态函数,连接器会优化生成代码,去掉动态重定位项(对




海量数据表分页效果更明显)。


*希望大家给予意见、如有不正确的地方望指正。


*/


public static int Calc()






{


int RecordCount = 0;


SqlCommand MyCmd = new SqlCommand("select count(*) as co from fdcproject",MyCon());


SqlDataReader dr = MyCmd.ExecuteReader();


if(dr.Read())


RecordCount = Int32.Parse(dr["co"].ToString());


MyCmd.Connection.Close();


return RecordCount;


}




//数据库连接语句(从Web.Config中获取)


public static SqlConnection MyCon()






{


SqlConnection MyConnection = new SqlConnection(ConfigurationSettings.AppSettings["DSN2"]);


MyConnection.Open();


return MyConnection;


}




private void TDataBind()






{


CurrentPage = (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行按钮失效运算


Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数进行按钮失效运算


//判断四个按钮(首页、上一页、下一页、尾页)状态


if (CurrentPage + 1 > 1)






{


Fistpage.Enabled = true;


Prevpage.Enabled = true;


}


else






{


Fistpage.Enabled = false;


Prevpage.Enabled = false;


}


if (CurrentPage == Pages)






{


Nextpage.Enabled = false;


Lastpage.Enabled = false;


}


else






{


Nextpage.Enabled = true;


Lastpage.Enabled = true;


}


//数据绑定到DataList控件


DataSet ds = new DataSet();


//核心SQL语句,进行查询运算(决定了分页的效率:))


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());


MyAdapter.Fill(ds,"news");


datalist1.DataSource = ds.Tables["news"].DefaultView;


datalist1.DataBind();


//显示Label控件LCurrentPaget和文本框控件gotoPage状态


LCurrentPage.Text = (CurrentPage+1).ToString();


gotoPage.Text = (CurrentPage+1).ToString();


//释放SqlDataAdapter


MyAdapter.Dispose();


}


























Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码


override protected void OnInit(EventArgs e)






{


//


// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。


//


InitializeComponent();


base.OnInit(e);


}







/**//// <summary>


/// 设计器支持所需的方法 - 不要使用代码编辑器修改


/// 此方法的内容。


/// </summary>


private void InitializeComponent()






{


this.Fistpage.Click += new System.EventHandler(this.Page_OnClick);


this.Prevpage.Click += new System.EventHandler(this.Page_OnClick);


this.Nextpage.Click += new System.EventHandler(this.Page_OnClick);


this.Lastpage.Click += new System.EventHandler(this.Page_OnClick);


this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged);


this.Load += new System.EventHandler(this.Page_Load);




}


#endregion




private void gotoPage_TextChanged(object sender, System.EventArgs e)






{


try






{


JumpPage = (int)ViewState["JumpPages"];//从ViewState中读取可用页数值保存到JumpPage变量中


//判断用户输入值是否超过可用页数范围值


if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)


Response.Write("<script>alert('页码范围越界!');location.href='WebForm8.aspx'</script>");


else






{


int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//转换用户输入值保存在int型InputPage变量中


ViewState["PageIndex"] = InputPage;//写入InputPage值到ViewState["PageIndex"]中


TDataBind();//调用数据绑定函数TDataBind()再次进行数据绑定运算


}


}


//捕获由用户输入不正确数据类型时造成的异常


catch(Exception exp)






{


Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");


}











}




private void Page_OnClick(object sender, System.EventArgs e)






{


CurrentPage = (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行参数运算


Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数运算




string cmd = ((LinkButton)sender).CommandName;


switch(cmd)//筛选CommandName






{


case "next":


CurrentPage++;


break;


case "prev":


CurrentPage--;


break;


case "last":


CurrentPage = Pages;


break;


default:


CurrentPage = 0;


break;


}


ViewState["PageIndex"] = CurrentPage;//将运算后的CurrentPage变量再次保存至ViewState


TDataBind();//调用数据绑定函数TDataBind()


}






}


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: