引言:
最近的做的积分系统中加载所有的用户时需要进行分页显示,以前在牛腩的时候接触过,在ITOO里面也见过,但是自己去写还是不太会,那就查呗,有两种方式可以实现:真分页、假分页。
假分页:
假分页比较容易实现,代码都写在了js里。
初始化表格显示:
function initTable() {
//把搜素框里的内容提交到后台对数据进行过滤。
$('#dg').datagrid({
url: '/frmManageUser/QueryUser',
width: "100%",
striped: true, //行背景交换
fitColumns: true,
idField: 'AssignmentID',
loadMsg: '正在加载用户的信息...',
pagination: true,
singleSelect: false,
pageList: [10, 20, 30, 40, 50], //每页多少条数据
pageSize: 10, //默认每页显示10条
pageNumber: 1, //默认为第一页
rowNumbers:true,
queryParams: {
searchName: $("#searchName").val()
},
columns: [[
{ field: 'ck', checkbox: true, align: 'left', width: 50 },
{ field: 'UserId', title: 'userId', width: 500, hidden: true },
{ field: 'UserName', title: '期数', width: 50, editor: 'text' },
{ field: 'PassWord', title: '姓名', width: 50, editor: 'text' },
{ field: 'TeamNum', title: '小区号', width: 50, editor: 'text' },
]]
});
}
// 分页数据的操作
function pagerfilter(data) {
if (typeof data.length == 'number' && typeof data.splice == 'function') { // is array
data = {
total: data.length,
rows: data
}
}
var dg = $(this);
var opts = dg.datagrid('options');
var pager = dg.datagrid('getpager');
pager.pagination({
//选择每页显示多少条数据,从第几页开始
onselectpage: function (pagenum, pagesize) {
opts.pagenumber = pagenum;
opts.pagesize = pagesize;
pager.pagination('refresh', {
pagenumber: pagenum,
pagesize: pagesize
});
dg.datagrid("unselectall");
dg.datagrid('loaddata', data);
}
});
if (!data.originalrows) {
data.originalrows = (data.rows);
}
//从第几条数据开始显示
var start = (opts.pagenumber - 1) * parseint(opts.pagesize);
//显示到那条数据
var end = start + parseint(opts.pagesize);
data.rows = (data.originalrows.slice(start, end));
return data;
}
真分页:
js代码里初始化表格,和上面一样
Controller中查询数据的方法:
/// <summary>
/// 查询所有所有的用户
/// </summary>
/// <returns>序列化对象</returns>
public ActionResult QueryUser()
{
ManageUserBLL userBll = new ManageUserBLL();
//获得从前台传过来的页数和每页的数量
int pageSize = Request["rows"] == null ? 10 : int.Parse(Request["rows"]);
int pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]);
初始设定总页数为0,进行页码总行数查询,查询出来的数据需要赋给total
int total = 0;
//定义用户的实体集合
List<t_user> listUser = new List<t_user>();
listUser = userBll.QueryUser(pageSize, pageIndex, out total);
return Json(new
{
rows = listUser,
total = total,
});
}
D层查询:
/// <summary>
/// 查询所有的用户
/// </summary>
/// <returns>用户泛型集合</returns>
public List<t_user> QueryUser(int pagesize, int pagenum,out int total)
{
string sqlSearch = "select * from t_user order by userId limit @start,@number ";
MySqlParameter[] pars = new MySqlParameter[]
{
new MySqlParameter("@number",pagesize*pagenum),
new MySqlParameter("@start",(pagenum-1)*pagesize),
};
DataTable dt = MySQLHelper.ExecuteDataTable(sqlSearch,pars);
List<t_user> list = MySQLHelper.ConvertToList<t_user>(dt);
string sql = "select count(*) from t_user ";
total = int.Parse(MySQLHelper.ExecuteScalar(sql).ToString());
return list;
}
区别:
真分页: 需要多少数据从数据库中取多少,会多次从库中取。
假分页:一次性从库中取完,再按条件查询。
优缺点:
假分页,如果数据量较多,在首次页面加载的时候会比较慢,严重影响用户体
验,Web开发和搜索引擎优化。
真分页的效率无疑是最高的,它还有很多的优点:
1.每次点击下一页,客户端访问服务器的时间基本一样,提高用户体验,更加的人性化。
2.对于大数据量可以从容的面对。
缺点:与后台的交互次数增多。