源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载

  • 时间:2022-01-04 11:32 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载
之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码。 分页显示信息的实体类:
[u]复制代码[/u] 代码如下:
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代码的拼接方法:
[u]复制代码[/u] 代码如下:
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;         }     }
最精简必要的几个参数传进去就能显示分页效果了:
[u]复制代码[/u] 代码如下:
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的分页的效果图 [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100104_0_78576.jpg[/img] 供测试的css:
[u]复制代码[/u] 代码如下:
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转泛型列表的一个方法和一个分页存储过程。 此转换方法需配合相应的实体类,并且实体类中需对象相应表的字段名,不区分大小写。
[u]复制代码[/u] 代码如下:
 #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
分页存储过程。
[u]复制代码[/u] 代码如下:
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)
以上是全部代码,由于本人还是新手,请大家查找问题并指导,谢谢。 有些朋友需要源码的再此下载,方便测试
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部