.net中有很多分页的控件,不过用起来感觉很不舒服,今天不用控件简单的写一个,聊以自慰。
.aspx页面中添加一个<asp:Label runat="server" ID="pContent"></asp:Label>
.aspx.cs页面中写如下代码
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack){ my.ConnOpen(); //打开数据库 setPageList(); //这是分页代码 my.ConnClose(); //关闭数据库 } }
public void setPageList() { DateTime startTime = DateTime.Now;
double pageConfig = 10; //每页多少条 double infoCount = 0; //共有多少条记录 infoCount = my.GetDataCount("select count(*) as num from [info] where Info_NoRecycleBin=1", my.Conn); // 自定义函数,求有多少条记录 double lastly = infoCount / pageConfig; // 求分页数,共有多少页
int page = Convert.ToInt16(Request.QueryString["page"]); // 当前第几页 if (page == 0) { page = 1; }
int first = 1; int last = page - 1; // 上一页 int nextpage = page + 1; // 下一页 做翻页用
if (lastly == 1) {
} else { if (Convert.ToInt16(lastly.ToString().Split('.').Length) != 1) { lastly = Convert.ToInt16(lastly.ToString().Split('.')[0]) + 1; //分页数如果不是整数那么加1 } }
/* -----------------------------------------------------------------
如何确定分页的sql语句?
infoCount 共有多少条记录 pageConfig 每页多少条记录 page 当前第几页 lastly 共有多少页 -------------------------------------------------------------------- 【代码1】 sql = "select top " + pageConfig + " * from (select top " + pageConfig + " * from (select top " + pageConfig * page + " [Info_Title],[Info_ID],[Info_Type] from Info where Info_NoRecycleBin=1 order by Info_ID desc) as a order by Info_ID asc) as b order by Info_ID desc"; 当前为第一页的时候,从后先取10条,再取10条;第二页的时候先取20条,再取10条;第三页的时候先取30条,再取10条;依此类推,当当前为1000多页的时候,第一次需要保存1W多条记录,那效率也太低了。 -------------------------------------------------------------------- 【代码2】 修正 1,求第一页末尾id。例如:共36条记录,每页显示10条,当前为第1页,这个时侯末尾id为26。 sql1 = select top 10 info_id from info order by info_id desc 从后到前取10条记录,返回一个新表,例如36,35,34,33,32……26。 sql2 = select top 1 * from [sql1] order by info_id desc sql2中查询表的时候直接查询sql1生成出的新表,倒序第1位就是26了。 2,其他页大于id的条件查询。 sql3 = select top 10 info_id from info where info_id>[sql2] order by info_id asc 结果为 26,27……36。 sql4 = select top 10 info_id from [sql3] order by info_id desc 结果为 36,35……26。 string sql = "select * from (select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [info_id]>=(select top 1 * from (select top " + pageConfig * page + " [info_id] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc) as a order by [info_id] asc) and [Info_NoRecycleBin]=1 order by [info_id] asc) as b order by [info_id] desc"; 仔细一看,末页条数永远为10条,这个是不是问题呢,就看作者的心态了。我认为这算瑕疵,那我就修正它。 -------------------------------------------------------------------- 【代码3】 修正 * 假设数据库里有36条记录,每页10条,共4页,第4页显示6条 * 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 * ----------------------------------------------------------------------------------------------------------------------------------------------------------------- * 【第四页】 | 【第三页】 | 【第二页】 | 【第一页】 * 这是正确的分页,最后一页6条记录 * -------------------------------------------------------------------------------------------------------------------------------------------------- * |重复的记录| | | * 这是【代码2】的分页,第1页、第2页、第3页正常,第4页因为不足10条记录,所以用第3页的记录补充了,所以末页永远为10条。 * -------------------------------------------------------------------------------------------------------------------------------------------------- * 当page=1时,直接取10条,否则条件按id小于计算,这样当最后一页记录不足10条时,就不会取上一页的记录补充了。 select top 10 [info_id], [info_title] from [info] where [info_id] < (select top 1 * from (select top 20 [info_id] from [info] order by [info_id] desc) as a order by [info_id] asc) order by [info_id] desc 这段sql取出的是第4页,结果为1,2,3,4,5,6。 在top20那的意思为第3页,30代表第4页,10代表第2页,依此类推。 注意,上面那个依此类推只能向上算,第2页,第3页,第4页……第n页,如果想取第1页,那么得另行编写。 -------------------------------------------------------------------- 【代码4】 修正 if(page == 1) { select top 10 * from [info] order by [info_id] desc } else { 执行【代码3】 }
=================================================================== */
string sql = ""; if (page == 1) { sql = "select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc"; } else { sql = "select top " + pageConfig + " [info_id], [info_title], [info_type] from [info] where [info_id] < (select top 1 * from (select top " + pageConfig * (page-1) + " [info_id] from [info] where [Info_NoRecycleBin]=1 order by [info_id] desc) as a order by [info_id] asc) and [Info_NoRecycleBin]=1 order by [info_id] desc"; }
DataSet md = my.getDataSet(sql, "tb", my.Conn);
pContent.Text = "<table style='BORDER-COLLAPSE: collapse' borderColor='#f5f5f5' width='100%' border='1' cellspacing='0' cellpadding='2'>"; if (md.Tables["tb"].Rows.Count == 0) { pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\"><td colspan=5>对不起,当前没有符合条件的记录。</td></tr>"; } else { pContent.Text += "<tr class='pl1'><td>编号</td><td>标题</td><td>类别</td><td>修改</td><td>删除</td></tr>";
for (int i = 0; i < md.Tables["tb"].Rows.Count; i++) { pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\">"; pContent.Text += "<td>" + md.Tables["tb"].Rows[i]["Info_ID"].ToString() + "</td>"; pContent.Text += "<td>" + md.Tables["tb"].Rows[i]["Info_Title"].ToString() + "</td>"; pContent.Text += "<td><a href='article_type_list.aspx?t; }
pContent.Text += "<tr class='pl0' onmouseout=\"this.className='pl0'\" onmouseover=\"this.className='pl1'\"><td colspan=2>页数:"; for (int i = 1; i <= lastly; i++) { if (page == i) { pContent.Text += "<b>[" + i.ToString() + "]</b> "; } else { pContent.Text += "<a href='?page=" + i.ToString() + "'>" + i.ToString() + "</a> "; } } pContent.Text += "</td>"; DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; pContent.Text += "<td colspan=2 align=right color=gray>页面执行时间: " + ts.TotalMilliseconds.ToString() + " 毫秒</td>"; pContent.Text += "<td><input type='button' name='Submit' value='删除' onclick='deleteArticle()' /></td></tr>"; } pContent.Text += "</table>";
}
// 蓝色部分为sql的分析,红色部分为页面内容显示部分。
|
请发表评论