使用控件自带的分页功能时,会先将所查询的数据全部加载出来,若数据量较大,则造成浏览器端等待时间过长。

然而在庞大的数据量,用户所需要的不过是那么几条,甚至只要其中的一条数据,所以,为了减少开销,每次只从数据库中读取10条数据。

以下是我做过的一个例子,该数据库表中有101万行数据,只要将数据库连接修改一下,即可复制,粘贴使用。

以下是aspx中的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<link rel="stylesheet" type="text/css" href="../Styles/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="../Styles/admin-all.css" />
<link rel="stylesheet" type="text/css" href="../Styles/ui-lightness/jquery-ui-1.8.22.custom.css" />
<link rel="stylesheet" type="text/css" href="../Styles/web.css" />
<script type="text/javascript" src="../Scripts/jquery-1.7.2.js"></script>
<script type="text/javascript" src="../Scripts/jquery-ui-1.8.22.custom.min.js"></script>
<script type="text/javascript" src="../Scripts/My97DatePicker/WdatePicker.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table id="Search" class="table table-striped table-bordered table-condensed">
<thead>
<tr>
<td colspan="6">
患者管理查询
</td>
</tr>
</thead>
<tr>
<td rowspan="2">
精确查找
</td>
<td>
编号:
</td>
<td>
<asp:TextBox ID="TextBoxIDNumber" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
姓名:
</td>
<td>
<asp:TextBox ID="TextBoxName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td rowspan="2">
模糊查询:
</td>
<td>
编号:
</td>
<td>
<asp:TextBox ID="TextBoxNumberx" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
姓名:
</td>
<td>
<asp:TextBox ID="TextBoxNamex" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td> </td>
<td>
排列方式
</td>
<td>
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem Value="1">按ID正序</asp:ListItem>
<asp:ListItem Value="2">按ID倒序</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td colspan="3">
<asp:Button ID="ButtonSearch" runat="server" Text="查询" OnClick="ButtonSearch_Click" />
&nbsp;&nbsp;
<asp:Button ID="ButtonExcel" runat="server" Text="导出" OnClick="ButtonExcel_Click" />
</td>
</tr> </table>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td style="width:50px;">
ID
</td>
<td style="width:150px;">
编号
</td>
<td style="width:100px;">
姓名
</td>
</tr> </HeaderTemplate>
<ItemTemplate>
<tr>
<td style=" color:Green;">
<%#Eval("ID")%>
</td>
<td style="color:Blue;">
<%#Eval("Number")%>
</td>
<td style="color:Red;">
<%#Eval("Name")%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate> </asp:Repeater>
<table>
<tr >
<td>
<asp:LinkButton ID="LinkButtonFirst" runat="server" onclick="LinkButtonFirst_Click">首页</asp:LinkButton></td>
<td>
<asp:TextBox ID="TextBoxGo" runat="server" Width="29px"></asp:TextBox></td> <td>
<asp:LinkButton ID="LinkButtonGo" runat="server" onclick="LinkButtonGo_Click">前往</asp:LinkButton></td>
<td>
<asp:Label ID="Label1" runat="server" Text="第"></asp:Label></td>
<td>
<asp:Label ID="index" runat="server" Text="1"></asp:Label></td>
<td>
<asp:Label ID="Label3" runat="server" Text="页"></asp:Label></td>
<td>
<asp:Label ID="Label2" runat="server" Text="共"></asp:Label></td>
<td>
<asp:Label ID="labcount" runat="server" Text=""></asp:Label></td>
<td>
<asp:Label ID="Label5" runat="server" Text="页"></asp:Label></td>
<td>
<asp:LinkButton ID="LinkButtonBefore" runat="server" onclick="LinkButtonBefore_Click">上一页</asp:LinkButton></td>
<td>
<asp:LinkButton ID="LinkButtonAfter" runat="server" onclick="LinkButtonAfter_Click">下一页</asp:LinkButton></td>
<td>
<asp:LinkButton ID="LinkButtonLast" runat="server" onclick="LinkButtonLast_Click">尾页</asp:LinkButton></td>
</tr>
</table>
</div>
</form>
</body>
</html>

下面是后台cs代码:

public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.shuju();
} } /// <summary>
/// 获取数据,并设置页数
/// </summary>
/// <param name="pagenumber"></param> public void GetData(int pagenumber)
{
string str_sql1 = "select id,number,name from dbo.test ";
string str_sql2 = "select count(*) from dbo.test "; //获得数据总行数
if (ViewState["where"] != null)
{
str_sql2 += ViewState["where"].ToString();
str_sql1 += ViewState["where"].ToString();
}
if (ViewState["order"] != null)
{
str_sql1 += ViewState["order"].ToString();
}
else
{
str_sql1 += " order by id ";
}
str_sql1 += " offset " + pagenumber + " rows fetch next 10 rows only ";
string rowsNumber = MySql.GetSingleStr(str_sql2); //获得数据总行数
DataTable dt = MySql.GetDataTable(str_sql1);
if (Convert.ToInt32(rowsNumber) % != )
{
labcount.Text = (Convert.ToInt32(rowsNumber) / + ).ToString(); //返回总页数,不能被10整除则加一页
}
else
{
labcount.Text = (Convert.ToInt32(rowsNumber) / ).ToString(); //返回总页数
}
this.Repeater1.DataSource = dt;
this.Repeater1.DataBind();
} /// <summary>
/// 初始化数据
/// </summary>
public void shuju()
{
GetData();
index.Text = ""; //当前页为1 //把首页和上一页设置为不可操作
if (index.Text == "")
{
LinkButtonFirst.Enabled = false;
LinkButtonBefore.Enabled = false;
}
if (index.Text == labcount.Text)
{
LinkButtonAfter.Enabled = false;
LinkButtonLast.Enabled = false;
}
else
{
LinkButtonAfter.Enabled = true;
LinkButtonLast.Enabled = true;
}
} /// <summary>
/// 首页按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButtonFirst_Click(object sender, EventArgs e)
{ GetData();
index.Text = ""; //当前页为1 //把首页和上一页设置为不可操作
if (index.Text == "")
{
LinkButtonFirst.Enabled = false;
LinkButtonBefore.Enabled = false;
}
if (index.Text == labcount.Text)
{
LinkButtonAfter.Enabled = false;
LinkButtonLast.Enabled = false;
}
else
{
LinkButtonAfter.Enabled = true;
LinkButtonLast.Enabled = true;
}
} /// <summary>
/// Go按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButtonGo_Click(object sender, EventArgs e)
{
if (TextBoxGo.Text != "")
{
string pageindex = TextBoxGo.Text; //获取要前往的页数
int intpageindex = Convert.ToInt32(pageindex); //转为整型 int pagecount = Convert.ToInt32(labcount.Text);
if (intpageindex > pagecount&&intpageindex<=) //判断,如果输入的数字大于总页数就返回
{
return;
}
else
{
int pageNumber = Convert.ToInt32(TextBoxGo.Text)*-;
GetData(pageNumber);
if (TextBoxGo.Text == "") //判断如果输入1,首页和上一页不可操作,但是尾页和下一页可以操作
{
LinkButtonFirst.Enabled = false;
LinkButtonBefore.Enabled = false; LinkButtonAfter.Enabled = true;
LinkButtonLast.Enabled = true;
}
else if (TextBoxGo.Text == labcount.Text) //判断如果输入的数等于总页数,首页和第一页可以操作,但是尾页和下一页不可操作
{
LinkButtonAfter.Enabled = false;
LinkButtonLast.Enabled = false; LinkButtonFirst.Enabled = true;
LinkButtonBefore.Enabled = true;
}
else //如果是其他情况,首页和下一页,尾页和下一页都可操作
{
LinkButtonAfter.Enabled = true;
LinkButtonLast.Enabled = true; LinkButtonFirst.Enabled = true;
LinkButtonBefore.Enabled = true;
}
} index.Text = TextBoxGo.Text; //设置当前页数等于输入的页数
}
else
{
return;
}
} /// <summary>
/// 上一页按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButtonBefore_Click(object sender, EventArgs e)
{ string pageindex = index.Text; //获取当前页数
int pageNumber = Convert.ToInt32(pageindex) * - ; //获取上一页之前的总行数
GetData(pageNumber); int intindex = Convert.ToInt32(index.Text);
index.Text = (intindex - ).ToString(); //当前页-1 LinkButtonAfter.Enabled = true;
LinkButtonLast.Enabled = true; if (index.Text == "")
{
LinkButtonFirst.Enabled = false;
LinkButtonBefore.Enabled = false;
} } /// <summary>
/// 下一页按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButtonAfter_Click(object sender, EventArgs e)
{
string pageindex = index.Text; //获取当前页数
int pageNumber = Convert.ToInt32(pageindex)*; //获取下一页之前的总行数
GetData(pageNumber); int intindex = Convert.ToInt32(index.Text);
index.Text = (intindex + ).ToString(); //当前页+1 LinkButtonFirst.Enabled = true;
LinkButtonBefore.Enabled = true; if (index.Text == labcount.Text)
{
LinkButtonAfter.Enabled = false;
LinkButtonLast.Enabled = false;
}
} /// <summary>
/// 尾页按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void LinkButtonLast_Click(object sender, EventArgs e)
{ int pageNumber = (Convert.ToInt32(labcount.Text) - ) * ; //获取最后一页之前的总行数
GetData(pageNumber); index.Text = labcount.Text; LinkButtonFirst.Enabled = true;
LinkButtonBefore.Enabled = true; LinkButtonAfter.Enabled = false;
LinkButtonLast.Enabled = false;
}
protected void ButtonSearch_Click(object sender, EventArgs e)
{
string strWhere = " where ";
string strOrder = " order by ID ";
if (TextBoxIDNumber.Text != "") //填写编号
{
strWhere += "Number='" + TextBoxIDNumber.Text + "' and ";
}
if (TextBoxName.Text != "") //填写姓名
{
strWhere += "Name='" + TextBoxName.Text + "' and ";
}
if (TextBoxNumberx.Text != "") //填写模糊编号
{
strWhere += "Number like '" + TextBoxNumberx.Text + "%' and ";
}
if (TextBoxNamex.Text != "") //编写模糊姓名
{
strWhere += "Name like '" + TextBoxNamex.Text + "%' and ";
}
strWhere += " 1=1 ";
if (DropDownList1.SelectedValue == "") //选择倒序
{
strOrder += " desc";
}
ViewState["where"] = strWhere;
ViewState["order"] = strOrder;
shuju(); } protected void ButtonExcel_Click(object sender, EventArgs e)
{
string sql = "select id,number,name from dbo.test ";
if(ViewState["where"]!=null)
{
sql += ViewState["where"].ToString();
}
if (ViewState["order"] != null)
{
sql += ViewState["order"].ToString();
}
DataTable dtexcel = MySql.GetDataTable(sql);
Random ran = new Random();
string temp = ran.Next(, ).ToString();
string excel = "Excel-" + DateTime.Now.ToString("yyyyMMdd") + temp;
CreateExcel(dtexcel, "application/ms-excel", excel);
} /// <summary>
/// 导出excel
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="FileType">文件类型</param>
/// <param name="FileName">文件名</param>
public void CreateExcel(DataTable dt, string FileType, string FileName)
{
Response.Clear();
Response.Charset = "UTF-8";
Response.Buffer = true;
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls\"");
Response.ContentType = FileType;
string colHeaders = string.Empty;
string ls_item = string.Empty;
ls_item += "ID\t编号\t姓名\n";
DataRow[] myRow = dt.Select();
int i = ;
int cl = dt.Columns.Count;
foreach (DataRow row in myRow)
{
for (i = ; i < cl; i++)
{
if (i == (cl - ))
{
ls_item += row[i].ToString() + "\n";
}
else
{
ls_item += row[i].ToString() + "\t";
}
}
Response.Output.Write(ls_item);
ls_item = string.Empty;
}
Response.Output.Flush();
Response.End();
}
}

附带excel导出功能。

ListView高效分页的更多相关文章

  1. Android中使用ListView实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  2. T-SQL 使用WITH高效分页

    一.WITH AS 含义     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...

  3. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  4. Android基本控件之listView(三)<用ListView实现分页加载>

    我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...

  5. android UI进阶之实现listview的分页加载

    上篇博文和大家分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一 下子全部加载用户未读的微薄这将耗费比较长的时间,造成 ...

  6. C#高效分页代码(不用存储过程)

    首先创建一张表(要求ID自动编号): create table redheadedfile ( id ,), filenames ), senduser ), primary key(id) ) 然后 ...

  7. 基于Jquery+Ajax+Json+存储过程 高效分页

    在做后台开发中,都会有大量的列表展示,下面给大家给大家分享一套基于Jquery+Ajax+Json+存储过程高效分页列表,只需要传递几个参数即可.当然代码也有改进的地方,如果大家有更好的方法,愿留下宝 ...

  8. Access大数据高效分页语句

    Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...

  9. My Sql 高效分页

    /* *普通分页 *在数据文件上偏移1000000查出10条 */ select * from zoldesk_92game_net_ecms_bj where classid=303 ORDER B ...

随机推荐

  1. iOS字体相关

    1.使用自定义字体 (1)将字体文件导入项目 (2)在info.plist文件中添加 Fonts provided by application (3)获取字体在项目中的名称 for fontFami ...

  2. mapreduce二次排序详解

    什么是二次排序 待排序的数据具有多个字段,首先对第一个字段排序,再对第一字段相同的行按照第二字段排序,第二次排序不破坏第一次排序的结果,这个过程就称为二次排序. 如何在mapreduce中实现二次排序 ...

  3. Ghostscript远程代码执行漏洞利用方法

    昨天爆出来的Ghostscript远程代码执行漏洞,复现过程如下 1.确认系统是否安装了gs 执行命令 gs -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/ ...

  4. C语言学习记录_2019.02.23

    char类型的输出: scanf("%d",&i);//i=49; char x=i; printf("x=%d\n",x); printf(" ...

  5. PostgreSQL内存使用增长观察

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

  6. BZOJ2539 Spoj 10707 Count on a tree II

    题面 题解 因为这道题目我也不太会做,所以借鉴了一下大佬heyujun的博客 如果不强制在线,这道题目是树上莫队练手题 我们知道莫队是离线的,但是万一强制在线就凉凉了 于是我们就需要一些操作:树分块 ...

  7. cogs1885 [WC2006]水管局长数据加强版

    BZOJ卡不过灰常蛋疼(毕竟人蠢自带巨大常数 这和动态维护最小生成树很像,但加边变成了删边,似乎没法做了. 然后根据之前的套路离线做,删边变成加边,就可以做了orz 二分查找的:(慢 // It is ...

  8. Linux命令速记

    apropos 通过命令描述,找到匹配的所有命令 ZSH 包含了自动纠错机制,可以用来来替代 Bash 作为你的命令行 shell. 速记表 https://www.maketecheasier.co ...

  9. Python面向过程、模块的使用

    一.Python面向过程 ''' 面向过程编程 核心过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.然后干什么... 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式 优点 ...

  10. 对大表进行全表更新,导致 Replication 同步数据的过程十分缓慢

    在Publisher database中更新一个big table,数据行数是3.4亿多.由于没有更新 clustered Index key,因此,只产生了3.4亿多个Update Commands ...