asp.net c# 不用控件的分页效果
.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?tid=" + md.Tables["tb"].Rows[i]["Info_Type"].ToString() + "'>" + my.getTypeItem(Convert.ToInt16(md.Tables["tb"].Rows[i]["Info_Type"])) + "</a></td>";
pContent.Text += "<td><a href='article_update.aspx?id=" + md.Tables["tb"].Rows[i]["Info_ID"].ToString() + "'>修改</a></td>";
pContent.Text += "<td><input type='checkbox' name='delid' id='delid' value='" + md.Tables["tb"].Rows[i]["Info_ID"].ToString() + "'></td>";
pContent.Text += "</tr>";
}
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的分析,红色部分为页面内容显示部分。


浙公网安备 33010602011771号