• 这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程 带源码下载


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

    分页显示信息的实体类:

    View Code
    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代码的拼接方法:

    View Code
    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=\"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;
    }

    }

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

    View Code
    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转泛型列表的一个方法和一个分页存储过程。

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

    View Code
     #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

    分页存储过程。

    View Code
    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)

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

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

  • 相关阅读:
    操作系统简介
    计算机基础
    Django之form
    CMDB资产采集
    Git
    User model
    多级评论
    个人主页
    media路径设置
    Web框架
  • 原文地址:https://www.cnblogs.com/yyl8781697/p/aspnetpager.html
Copyright © 2020-2023  润新知