文章目录

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

分页显示信息的实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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代码的拼接方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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;
}

}

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

1
2
3
4
5
6
7
8
9
10
11
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:

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

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

1
#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

分页存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)

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

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

注:此文来自我的博客园


本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言

文章目录