ListView高效分页
使用控件自带的分页功能时,会先将所查询的数据全部加载出来,若数据量较大,则造成浏览器端等待时间过长。
然而在庞大的数据量,用户所需要的不过是那么几条,甚至只要其中的一条数据,所以,为了减少开销,每次只从数据库中读取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" />
<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高效分页的更多相关文章
- Android中使用ListView实现分页刷新(线程休眠模拟)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- T-SQL 使用WITH高效分页
一.WITH AS 含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...
- Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- Android基本控件之listView(三)<用ListView实现分页加载>
我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...
- android UI进阶之实现listview的分页加载
上篇博文和大家分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一 下子全部加载用户未读的微薄这将耗费比较长的时间,造成 ...
- C#高效分页代码(不用存储过程)
首先创建一张表(要求ID自动编号): create table redheadedfile ( id ,), filenames ), senduser ), primary key(id) ) 然后 ...
- 基于Jquery+Ajax+Json+存储过程 高效分页
在做后台开发中,都会有大量的列表展示,下面给大家给大家分享一套基于Jquery+Ajax+Json+存储过程高效分页列表,只需要传递几个参数即可.当然代码也有改进的地方,如果大家有更好的方法,愿留下宝 ...
- Access大数据高效分页语句
Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...
- My Sql 高效分页
/* *普通分页 *在数据文件上偏移1000000查出10条 */ select * from zoldesk_92game_net_ecms_bj where classid=303 ORDER B ...
随机推荐
- 面向对象之static关键字
static概念 static它是静态修饰符,一般用来修饰类中的成员. static特点 1.多个对象共享一个static成员变量.一个对象将static成员变量值修改了,其他对象中的static成员 ...
- 基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
- 微信支付JsApi 40163错误
微信支付JsApi 40163错误错误:未定义数组索引:openid .经过检查发现是 :微信支付授权获取 openId {“errcode”:40163,“errmsg”:“code been us ...
- 评价指标1--F1值和MSE
1,F1=2*(准确率*召回率)/(准确率+召回率) F1的值是精准率与召回率的调和平均数.F1的取值范围从0到1的数量越大,表明实现越理想. Precision(精准率)=TP/(TP+FP) Re ...
- I NETWORK [thread1] waiting for connections on port 27017
小技巧:mongodb安装完之后可以将安装目录的/bin添加到系统环境变量 一.问题 windows上安装完mongodb之后,设置完dbpath,一直卡在这里 二.解决办法 别关这个终端,再开个终端 ...
- 有关onpropertychange事件
<div style="border:1px solid #fc0;height:24px;width:300px;" id="target">&l ...
- c# table 怎么在前台循环展示 ViewBag
后台 public ActionResult DoctorEvaluation()//前台页面 { HE_Department HE_dt = new HE_Department(); DataTab ...
- express的web server设置流程
对于express的设置,一直是拿来就用,只知其然,今天查了一下文档,记录详细过程如下. 1.实现基本常用功能需要的模块path 用来处理路径字符串拼接,设置模板路径和静态资源路径时使用cookie- ...
- linux设置禁止ping
linux禁止ping为了服务器的安全, 防止网络攻击(DOS 攻击消耗网络宽带,CPU资源), 需要服务器设置 禁止ping通常有两种方式第一种是通过防火墙 iptables 设置第二种是内核设置 ...
- 《图解 HTTP 》阅读 —— 第一章
第1章 了解web及网络基础 计算机与网络设备相互通信的规则称为协议,比如:如何探测到通信目标.由哪一边发起通信.使用那种语言进行通信.怎么结束通信等. TCP/IP 协议族按照层次分为以下四层:应用 ...