在处理大量数据时,分页技术是提高Web应用程序性能的关键。本文将介绍如何在ASP.NET应用程序中实现自定义分页技术。分页技术能够高效地从数据库中检索特定行的数据,避免将成百上千的结果拉回到Web服务器。本文将展示如何实现自定义分页技术,以提高应用程序的性能(包括延迟和吞吐量),并减轻数据库的负载。
背景 GridView控件内置了分页支持,但在处理大量数据时,其性能表现并不理想。开发自定义分页技术的想法来源于Stack Overflow网站,该网站使用自定义分页技术将大量数据平滑地分成多个页面。
使用代码 首先,SQL查询是实现分页的关键。使用了NorthWind数据库的Orders表,该表包含超过800条记录。Index和Size是两个整数变量,它们来自查询字符串。 Index是当前页码,Size是每页显示的记录数。
SQL += "select * from (SELECT ROW_NUMBER() OVER (ORDER BY CustomerID asc) as row,* FROM Orders) tblTemp WHERE row between (" + index + " - 1) * " + size + " + 1 and " + index + " * " + size + "";
SQL += "select COUNT(*) from Orders";
当页面首次加载时,没有查询字符串值,因此默认Index为1,Size为10。稍后可以更改页面大小,有每页显示10条记录和15条记录的选项。尝试在代码中解释所有必要的点。
C#代码:
void BindGrid(int size, int index)
{
string url = ConfigurationManager.AppSettings["URL"].ToString();
string link = "";
string link_pre = "";
string link_next = "";
try
{
String ConnStr = ConfigurationManager.ConnectionStrings["myConnection"].ToString();
String SQL = @"
select * from (SELECT ROW_NUMBER() OVER (ORDER BY CustomerID asc) as row,* FROM Orders) tblTemp
WHERE row between (" + index + " - 1) * " + size + " + 1 and " + index + " * " + size + "";
SQL += "select COUNT(*) from Orders";
SqlDataAdapter ad = new SqlDataAdapter(SQL, ConnStr);
DataSet ds = new DataSet();
ad.Fill(ds);
this.gvPaging.DataSource = ds.Tables[0];
this.gvPaging.DataBind();
Double n = Convert.ToDouble(Convert.ToInt32(ds.Tables[1].Rows[0][0]) / size);
if (index != 1)
{
lblpre.Text = link_pre.Replace("##Size##", size.ToString()).Replace("##Index##", (index - 1).ToString()).Replace("##Text##", "prev");
}
else
{
lblpre.Text = "prev";
}
if (index != Convert.ToInt32(n))
{
lblnext.Text = link_next.Replace("##Size##", size.ToString()).Replace("##Index##", (index + 1).ToString()).Replace("##Text##", "next");
}
else
{
lblnext.Text = "next";
}
int start;
if (index <= 5) start = 1;
else start = index - 4;
for (int i = start; i < start + 7; i++)
{
if (i > n) continue;
HyperLink lnk = new HyperLink();
lnk.ID = "lnk_" + i.ToString();
if (i == index)
{
lnk.CssClass = "page-numbers current";
lnk.Text = i.ToString();
}
else
{
lnk.Text = i.ToString();
lnk.CssClass = "page-numbers";
lnk.NavigateUrl = url + "?Index=" + i + "&Size=" + size + "";
}
this.pl.Controls.Add(lnk);
}
if (n > 7)
{
if (index <= Convert.ToInt32(n / 2))
{
lblLast.Visible = true;
lblIst.Visible = false;
lblLast.Text = link.Replace("##Index##", n.ToString()).Replace("##Size##", size.ToString()).Replace("##Text##", n.ToString());
spDot2.Visible = true;
spDot1.Visible = false;
}
else
{
lblLast.Visible = false;
lblIst.Visible = true;
lblIst.Text = link.Replace("##Index##", (n - n + 1).ToString()).Replace("##Size##", size.ToString()).Replace("##Text##", (n - n + 1).ToString());
spDot2.Visible = false;
spDot1.Visible = true;
}
}
}
catch (Exception ee)
{
}
}
在上述方法中,需要更改Web.config文件中的配置设置,例如连接字符串和页面URL。
在aspx页面上有六个标签: 上一页链接 第一页链接 第一页链接前的点 下一页链接 最后一页链接 最后一页链接前的点 以及一个占位符,用于其他页码。
HyperLinks是动态创建的,并在页面加载时设置其链接和css,并添加到占位符中。 另一个重要的点是替换SQL查询中的表名和order by语句中的列名。
要更改页面大小,页面右侧有两个选项(html锚标签)。可以设置每页显示10条记录或15条记录。使用JQuery,捕获了这两个html锚的点击事件,并将当前设置的页面大小存储在HiddenField中,并通过查询字符串传递Index和Size重新加载当前页面。
jQuery Code: