一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载_asp.net教程-查字典教程网
一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载
一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载
发布时间:2016-12-29 来源:查字典编辑
摘要:之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写...

之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码。

分页显示信息的实体类:

复制代码 代码如下:

public class Pager

{

private string _firstPageText;

/// <summary>

/// 最前一页文字显示 默认显示为"首页"

/// </summary>

public string FirstPageText

{

get {

return string.IsNullOrEmpty(_firstPageText)? "首页" : _firstPageText;

}

set {

_firstPageText = value;

}

}

private string _prePageText;

/// <summary>

/// 上一页文字显示 默认显示为"上一页"

/// </summary>

public string PrePageText

{

get

{

return string.IsNullOrEmpty(_prePageText) ? "上一页" : _prePageText;

}

set

{

_prePageText = value;

}

}

private string _nextPageText;

/// <summary>

/// 下一页文字显示 默认显示为"下一页"

/// </summary>

public string NextPageText

{

get

{

return string.IsNullOrEmpty(_nextPageText) ? "下一页" : _nextPageText;

}

set

{

_nextPageText = value;

}

}

private string _lastPageText;

/// <summary>

/// 末页文字显示 默认显示为"末页"

/// </summary>

public string LastPageText

{

get

{

return string.IsNullOrEmpty(_lastPageText) ? "末页" : _lastPageText;

}

set

{

_lastPageText = value;

}

}

/// <summary>

/// 总记录数

/// </summary>

public int RecordCount { get; set; }

private int _pagesize=15;

/// <summary>

/// 每页分页尺寸 默认为15

/// </summary>

public int PageSize {

get {

return _pagesize == 0 ? 15 : _pagesize;

}set{

_pagesize = value;

}

}

private int _pageIndex=1;

/// <summary>

/// 当前页码

/// </summary>

public int PageIndex {

get {

return _pageIndex == 0 ? 1 : _pageIndex;

}

set {

_pageIndex = value;

}

}

private int _maxShowPageSize = 10;

/// <summary>

/// 显示页码列表的最大个数 默认为10

/// </summary>

public int MaxShowPageSize {

get {

return _maxShowPageSize;

}

set {

_maxShowPageSize = value;

}

}

private string _queryStringName;

/// <summary>

/// 页码在浏览器中传值的名称 默认为page

/// </summary>

public string QueryStringName {

get {

return string.IsNullOrEmpty(_queryStringName)? "page" : _queryStringName;

}

set {

_queryStringName = value;

}

}

/// <summary>

/// 页面的URL

/// </summary>

public string URL {

get {

string url = HttpContext.Current.Request.Url.AbsoluteUri;//当前页面绝对路径

if (EnableUrlRewriting)//使用url重写

{

url=url.Substring(0, url.LastIndexOf("/") + 1);//获取当前页面的目录路径

url += UrlRewritePattern;

}

else {//普通带问号的页面传值

//demo.aspx

//demo.aspx?a=1

//demo.aspx?page=1

//demo.aspx?a=2&page=1

if (url.Contains("aspx?"))

{

if (Regex.IsMatch(url,@"page=[0-9]*$",RegexOptions.IgnoreCase))//如果存在page=*的字符串

{

url = Regex.Replace(url, @"page=[0-9]*$", "", RegexOptions.IgnoreCase);//替换掉page=*的字符串

}

url += QueryStringName + "={0}";

}

else {

url += "?" + QueryStringName + "={0}";

}

}

return url;

}

}

private bool _enableUrlRewriting;

/// <summary>

/// URL是否重写 默认为flase

/// </summary>

public bool EnableUrlRewriting {

get {

return (object)_enableUrlRewriting == null ? false : _enableUrlRewriting;

}

set {

_enableUrlRewriting = value;

}

}

/// <summary>

/// 页面URL重写规则,将页码传值用{0}来代替 比如list-1-{0}.html,启用该功能需要将EnableUrlRewriting属性设为true

/// </summary>

public string UrlRewritePattern { get; set; }

private string _className;

/// <summary>

/// 分页容器的css名称

/// </summary>

public string ClassName {

get {

return string.IsNullOrEmpty(_className) ? "paginator" : _className;

}set{

_className = value;

}

}

private string _currentPageCss;

/// <summary>

/// 当前页面按钮css

/// </summary>

public string CurrentPageButtonCss {

get {

return string.IsNullOrEmpty(_currentPageCss) ? "cpb" : _currentPageCss;

}set{

_currentPageCss = value;

}

}

private bool _showSpanText;

/// <summary>

/// Span 标签中文字信息是否显示 默认为false不显示

/// </summary>

public bool ShowSpanText {

get {

return (object)_showSpanText == null ? false : _showSpanText;

}

set {

_showSpanText = value;

}

}

private string _spanTextClass;

/// <summary>

/// 分页文字描述span标签css

/// </summary>

public string SpanTextClass {

get {

return string.IsNullOrEmpty(_spanTextClass) ? "stc" : _spanTextClass;

}

set {

_spanTextClass = value;

}

}

private string _submitButtonText;

/// <summary>

/// 确定按钮文字显示 默认显示"确定"

/// </summary>

public string SubmitButtonText {

get {

return string.IsNullOrEmpty(_submitButtonText) ? "确定" : _submitButtonText;

}

set {

_submitButtonText = value;

}

}

}

分页显示html代码的拼接方法:

复制代码 代码如下:

public class SplitManager

{

public static string AspNetPagers(Pager pager)

{

StringBuilder sb = new StringBuilder();

string attr="";

int pagecount = 0;//当前页面的总层数

int floorcount = 0;//分页的总层数

int currentLastPage = 0;//当前最后一页的页码

int pageNum = pager.RecordCount / pager.PageSize + 1;//总页数 1~24

sb.AppendFormat("<div>n", pager.ClassName);

attr=pager.PageIndex==1?"disabled=disabled":"";//标志当前页第一页是否相等 来控制前俩个按钮的有效性

sb.AppendFormat(GetAHtml(attr,string.Format(pager.URL,1),pager.FirstPageText));//添加最前一页的代码

sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex-1), pager.PrePageText));//添加上一页的代码

pagecount = pager.PageIndex/pager.MaxShowPageSize;//当前页数 0~1~2

pagecount = pager.PageIndex % pager.MaxShowPageSize == 0 ? pagecount - 1 : pagecount;//清除当 当前页数为分页页码数的整数倍页时除数多一的状况

floorcount = pageNum / pager.MaxShowPageSize;//页面层数 0~1~2

currentLastPage=pageNum<pager.MaxShowPageSize * (pagecount + 1)?pageNum:pager.MaxShowPageSize * (pagecount + 1);

if (pager.PageIndex > pager.MaxShowPageSize)//当当前序号大于每页页码个数时显示再前端...

{

sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * pagecount), "..."));

}

for (int i = pager.MaxShowPageSize * pagecount + 1; i <= currentLastPage; i++)

{

if (i == pager.PageIndex)//判断循环页面是否为当前页

{

sb.AppendFormat(GetSpanHtml(i, pager.CurrentPageButtonCss));

}

else {

sb.AppendFormat(GetAHtml("", string.Format(pager.URL, i),i.ToString()));

}

}

if (pager.PageIndex <= pager.MaxShowPageSize * floorcount)//当当前序号小于倒数第二页页码时显示在后端...

{

sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * (pagecount + 1) + 1), "..."));

}

attr = pager.PageIndex == pageNum ? "disabled=disabled" : "";//标志当前页最后一页是否相等 来控制后俩个按钮的有效性

sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex+1), pager.NextPageText));//添加后一页的代码

sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pageNum), pager.LastPageText));//添加最后一页的代码

if (pager.ShowSpanText)//是否显示分页文字span标签显示

{

sb.AppendFormat("<span + pager.SpanTextClass + "">共{0}页,每页{1}条记录 n", pageNum, pager.PageSize);

sb.AppendFormat("到第<input type="input" id="jumpNum" name="jump" value="{0}" />页", pager.PageIndex == pageNum ? pageNum : pager.PageIndex + 1);

sb.AppendFormat("<a href="#" onclick="javascript:jump();">" + pager.SubmitButtonText + "</a></span>n");

sb.Append(GetJumpScript(pager.URL));//添加按钮跳转的javascript代码

}

sb.AppendFormat("</div>");//

return sb.ToString();

}

/// <summary>

/// get the html of a label

/// </summary>

/// <param name="title">a's title</param>

/// <param name="url">the url of a</param>

/// <param name="attr">the attribute</param>

/// <returns>return html string</returns>

private static string GetAHtml(string attr,string url,string title)

{

return "<a " + attr + " href=""+url+"">"+title+"</a>n";

}

/// <summary>

/// get the html of a label

/// </summary>

/// <param name="num">the content of span</param>

/// <param name="className">Class style Name</param>

/// <returns>return html string </returns>

private static string GetSpanHtml(int num, string className)

{

return "<span + className + "">" + num + "</span>n";

}

/// <summary>

/// 获取跳转的javascript代码

/// </summary>

/// <param name="url">当前分页的url规则</param>

/// <returns>返回一个javascript代码</returns>

private static string GetJumpScript(string url)

{

string scriptstr = "<script type="text/javascript">n" +

"function jump(){n" +

"var jnum=document.getElementById("jumpNum").value;n" +

"if(isNaN(jnum)){n"+

"alert("在跳转框中请输入数字!");n" +

"}n"+

"else{n"+

//"alert(jnum);n" +

"location.href=String.format("" + url + "",jnum);n" +

"}n"+

"}n"+

"String.format = function() {n"+

"if( arguments.length == 0 )n"+

"return null; n"+

"var str = arguments[0]; n"+

"for(var i=1;i<arguments.length;i++) {n"+

"var re = new RegExp('{' + (i-1) + '}','gm');n"+

"str = str.replace(re, arguments[i]);n"+

"}n"+

"return str;n"+

"}n"+

"</script>n";

return scriptstr;

}

}

最精简必要的几个参数传进去就能显示分页效果了:

复制代码 代码如下:

protected string str = "";

protected void Page_Load(object sender, EventArgs e)

{

Pager pager = new Pager() { RecordCount = 350,

PageSize = 15,

MaxShowPageSize=10,

PageIndex = Convert.ToInt32(Request.QueryString["page"]),

ShowSpanText=true};

str = SplitManager.AspNetPagers(pager);

}

仿csdn的分页的效果图

供测试的css:

复制代码 代码如下:

View Code

<style type="text/css">

/*分页样式控制的开始*/

.paginator { font: 12px Arial, Helvetica, sans-serif;

padding:10px 20px 10px 0;

margin: 0px;}

.paginator a {border:solid 1px #ccc;

color:#0063dc;

cursor:pointer;

text-decoration:none;}

.paginator a:visited {padding: 1px 6px;

border: solid 1px #ddd;

background: #f0f1f1;

text-decoration: none;}

.paginator .cpb {border:1px solid #14316b;

font-weight:700;

color:#f0f1f1;

background-color:#1f3d76;}

.paginator a:hover {border:solid 1px #14316b;

color:#14316b;

text-decoration:none;}

.paginator a,.paginator a:visited,.paginator .cpb,.paginator a:hover{float:left;

height:16px;

line-height:16px;

min-width:10px;_width:10px;

margin-right:5px;

text-align:center;

white-space:nowrap;

font-size:12px;

font-family:

Arial,SimSun;

padding:0 3px;}

.paginator .stc{color:#999;margin-left:20px;}

.paginator .stc a{margin-left:10px;}

/*分页样式控制的结束*/

</style>

同时配合为了配合分页,再给出一个DataTable转泛型列表的一个方法和一个分页存储过程。

此转换方法需配合相应的实体类,并且实体类中需对象相应表的字段名,不区分大小写。

复制代码 代码如下:

#region DataTable To List/Model

/// <summary>

/// DataTable To List

/// </summary>

/// <typeparam name="TType">object type</typeparam>

/// <param name="dt">DataTable</param>

/// <returns>return a List Model type</returns>

public static List<T> DataTableToObjectList<T>(DataTable dt) where T : new()

{

DataRowCollection drc = dt.Rows;

int columncount = drc.Count;

List<T> result = new List<T>(); //declare the generic type of return

Type type = typeof(T);

PropertyInfo[] propertys = type.GetProperties(BindingFlags.IgnoreCase|BindingFlags.Instance|BindingFlags.Public|BindingFlags.SetProperty); //get the collections of the model

foreach (DataRow r in drc)

{

result.Add(DataRowToObjectModel<T>(r, propertys));

}

return result;

}

/// <summary>

/// DataRow To a Model

/// </summary>

/// <typeparam name="T">the type of Model</typeparam>

/// <param name="r">DataRow</param>

/// <param name="propertys">the object to Model</param>

/// <returns>return a Model Type</returns>

private static T DataRowToObjectModel<T>(DataRow r, PropertyInfo[] propertys) where T : new()

{

T t = new T();

for (int i = 0; i < propertys.Length; i++)

{

object obj = r[propertys[i].Name];

if (obj != null)

{

if (propertys[i].PropertyType == typeof(int))

propertys[i].SetValue(t, PublicMethod.GetInt(obj), null);

if (propertys[i].PropertyType == typeof(string))

propertys[i].SetValue(t, obj.ToString(), null);

if (propertys[i].PropertyType == typeof(DateTime))

propertys[i].SetValue(t, PublicMethod.GetDateTime(obj), null);

}

}

return t;

}

#endregion

分页存储过程。

复制代码 代码如下:

CREATE PROCEDURE [dbo].[proc_SplitPage]

-- Add the parameters for the stored procedure here

@tblName varchar(255), -- 表名

@strFields varchar(1000) = '*', -- 需要返回的列,默认*

@strOrder varchar(255)='', -- 排序的字段名,必填

@strOrderType varchar(10)='ASC', -- 排序的方式,默认ASC

@PageSize int = 10, -- 页尺寸,默认10

@PageIndex int = 1, -- 页码,默认1

@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000)

if @strWhere !=''

set @strWhere=' where '+@strWhere

set @strSQL=

'SELECT '+@strFields+' FROM ('+

'SELECT ROW_NUMBER() OVER (ORDER BY '+@strOrder+' '+@strOrderType+') AS pos,'+@strFields+' '+

'FROM '+@tblName+' '+@strWhere+

') AS sp

WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)

exec (@strSQL)

以上是全部代码,由于本人还是新手,请大家查找问题并指导,谢谢。

有些朋友需要源码的再此下载,方便测试

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新asp.net教程学习
    热门asp.net教程学习
    编程开发子分类