在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前自己一直用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 class=\"{0}\">\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 class=\"" + pager.SpanTextClass + "\">共{0}页,每页{1}条记录 \n", pageNum, pager.PageSize); sb.AppendFormat("到第<input type=\"input\" id=\"jumpNum\" style=\"width:20px;\" name=\"jump\" value=\"{0}\" />页", pager.PageIndex == pageNum ? pageNum : pager.PageIndex + 1); sb.AppendFormat("<a href=\"#\" style=\"float:none;\" 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+"\" style=\"margin-right:5px;\">"+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 class=\"" + 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) 以上是全部代码,由于本人还是新手,请大家查找问题并指导,谢谢。 有些朋友需要源码的再此下载,方便测试 |
请发表评论