今天我们项目遇到个问题,查询数据用的分页控件和分页存储过程,但是查询很慢,数据只有50几万条,我很奇怪。我先用存储过程在数据库里测试,发现存储过程执行起来一点也不慢,就是程序慢,我觉得肯定是程序那里有问题,然后我就调试了一下程序,这不看不知道,一看吓一跳,我勒个去,我们这个分页控件的显示页数的下拉列表会显示所有的页数,数据有50几万条,每页10条,一共5万多页,这个下拉列表竟然一下子添加了50几万个选项,可想而知这压力有多大了,怪不得每次浏览浏览器老是要死掉。我决心要改掉这个问题,一次性加载肯定不行,那我就分多次加载,和分页的原理是一样,首次先显示10个选项,即1-10页,然后给他添加一个下十页选项,当他选择上十页的时候再添加下十页的选项,然后自动跳到下一页选项,再添加个上十页的选项,当他选择上十页这个选项时,才添加上十页的选项,然后自动跳到前面一页,这样就解决了一下子加载那么选项导致浏览器崩溃的问题了,下面来看代码,有不足请大家指出,谢谢了
【处理大数据分页下拉列表显示方式】首先,是前台页面,首页比较简单
无标题页 - 锐客网
然后是后台代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class TestForWithForeach : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ViewState["CurrentNum"] = "0";
}
protected void btnFor_Click(object sender, EventArgs e)
{
//每次进去清楚选项
drpPage.Items.Clear();
//获取数量
int pageTotal = 0;
pageTotal = int.Parse(txtNum.Text);
//判断选项是否选择的为第一项
if (ViewState["CurrentNum"] == "0")
{
//判断数量是否大于10,如果大于10就添加下十页这个选项,并循环到10就好了
if (pageTotal / 10 >= 1)
{
for (int j = 0;
j < 10;
j++)
{
drpPage.Items.Add(new ListItem((j + 1).ToString(), j.ToString()));
}
drpPage.Items.Add(new ListItem("下十页", "next"));
drpPage.SelectedValue = https://www.it610.com/article/ViewState["CurrentNum"].ToString();
}
else
{
//如果不大于10直接循环到底,不用加下十页
for (int j = 0;
j < pageTotal;
j++)
{
drpPage.Items.Add(new ListItem((j + 1).ToString(), j.ToString()));
}
drpPage.SelectedValue = https://www.it610.com/article/ViewState["CurrentNum"].ToString();
}
}
else if (ViewState["CurrentNum"].ToString().Split(',').Length > 1)//判断是否点击下十页,或者上十页,因为下面下拉列表如果点击上十页或者下十页会传字符和选项值,用逗号分开
{
string[] tValues = ViewState["CurrentNum"].ToString().Split(',');
//将传过来的值分割获取
int currentNum = int.Parse(tValues[0]);
//获取起始选项值
if (tValues[1] == "next")//根据获取的值来判断是点击了上十页还是下十页
{
drpPage.Items.Add(new ListItem("上十页", "previous"));
//因为是点击的下十页,所以肯定有上十页,所以直接加上上十页选项
if (currentNum + 10 < pageTotal)//判断选项值加上10是否超过了最大
{
for (int i = currentNum + 1;
i <= currentNum + 10;
i++)
{
drpPage.Items.Add(new ListItem(i.ToString(), (i - 1).ToString()));
}
drpPage.Items.Add(new ListItem("下十页", "next"));
//因为末尾选项值没有超过最大数,所以要加上下十页这个选项
}
else
{
for (int i = currentNum + 1;
i <= pageTotal;
i++)
{
drpPage.Items.Add(new ListItem(i.ToString(), (i - 1).ToString()));
}
}
drpPage.SelectedIndex = 1;
}
else if (tValues[1] == "previous")//选择了上十页
{
if (currentNum - 10 != 1)//判断是否在第一个十页选项,即1-10这个段
{
drpPage.Items.Add(new ListItem("上十页", "previous"));
//因为不是第一个十页选项所以加上上十页选项
}
if (currentNum - 10 >= 1)//如果选项起点值在第一个或者不是第一个添加选项,因为有上十页所以肯定有下下十页
{
for (int i = currentNum - 10;
i <= currentNum - 1;
i++)
{
drpPage.Items.Add(new ListItem(i.ToString(), (i - 1).ToString()));
}
drpPage.Items.Add(new ListItem("下十页", "next"));
}
drpPage.SelectedValue = https://www.it610.com/article/(currentNum - 2).ToString();
}
}
else
{
//通过模10和除10来确定有多少个10页段
int currentNum = int.Parse(ViewState["CurrentNum"].ToString());
int a = currentNum / 10;
//获取相除结果
int b = currentNum % 10;
//获取模后的余数
int begin = 0;
int end = 0;
if (b == 0)
{
if (a > 1)//判读是否大于10页
{
drpPage.Items.Add(new ListItem("上十页", "previous"));
}
begin = a * 10 - 9;
end = a * 10;
for (int i = begin;
i <= end;
i++)
{
drpPage.Items.Add(new ListItem(i.ToString(), (i - 1).ToString()));
}
if (pageTotal > end)
{
drpPage.Items.Add(new ListItem("下十页", "next"));
}
}
else
{
if (a >= 1)//判读是否大于10页
{
drpPage.Items.Add(new ListItem("上十页", "previous"));
}
begin = (a + 1) * 10 - 9;
end = (a + 1) * 10;
if (end > pageTotal)
{
end = pageTotal;
}
for (int i = begin;
i <= end;
i++)
{
drpPage.Items.Add(new ListItem(i.ToString(), (i - 1).ToString()));
}
if (pageTotal > end)
{
drpPage.Items.Add(new ListItem("下十页", "next"));
}
}
drpPage.SelectedValue = https://www.it610.com/article/(currentNum-1).ToString();
}
}
protected void drpPage_SelectedIndexChanged(object sender, EventArgs e)
{
if (drpPage.SelectedValue =="next")
{
ViewState["CurrentNum"] = drpPage.Items[drpPage.SelectedIndex - 1].Text+","+"next";
btnFor_Click(null, null);
}
else if (drpPage.SelectedValue =https://www.it610.com/article/="previous")
{
ViewState["CurrentNum"] = drpPage.Items[drpPage.SelectedIndex + 1].Text + "," + "previous";
btnFor_Click(null, null);
}
else
{
ViewState["CurrentNum"] = drpPage.SelectedItem.Text;
btnFor_Click(null, null);
}
}
}
推荐阅读
- Asp.net|System.Globalization.DateTimeFormatInfo.InvariantInfo
- asp.net|c#文件写入与获取post请求数据
- .NET+C#|掌握 ASP.NET 之路(自定义实体类简介(Microsoft))
- .NET+C#|ASP.NET 2.0中Theme、MasterPage和代码国际化
- .NET导出Excel遇到的错误的解决方法
- .net|利用MSXML2.XMLHTTP的无刷新技术
- 快速理解ASP.NET Core的认证与授权
- asp.net|asp.net错误急警
- 工具|调试、部署Oxite 开源系统
- asp.net|在ASP中读取数字证书(ASP.NET)