EasyUI Datagrid 分页显示(服务端)

本文详细介绍了如何在EasyUIDatagrid中实现服务端分页显示,包括设置datagrid的初始化、获取数据加载以及优化查询效率的方法。通过实例展示了如何根据用户操作动态获取和展示数据,并提供了分页搜索语句的优化策略,以减少大数据量查询的开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyUI Datagrid 分页显示(服务端)

By ZYZ

         为了解决大数据量下显示数据的问题,我们需要这样的一个效果:用户每次操作分页工具栏的时候向数据库获取新的数据,服务器根据传递回的参数确定需要获取的数据段,然后查询数据库获取指定若干行的数据,再传递给前台由Datagrid显示出来。

首先,设置datagrid的初始化

$(function() {
$('#tableTrainee').datagrid('getPager').pagination({
                pageSize: 10, //每页显示的记录条数,默认为10  
                pageList: [10, 15, 20, 25], //可以设置每页记录条数的列表
                onSelectPage: function(pageNumber, pageSize) {
                SearchTrainee();//每次更换页面时触发更改 
               }
            });
   });
其中的SearchTrainee()方法在每次更新页面的时候都会被加载一次。

其次,获取数据并加载      

 function SearchTrainee() {
            functionSearchTrainee() {
            var companyCode =$('#hiddenCompanyCode').val(); 
            var name = $('#txtName').val();
            if (companyCode== "") companyCode = "000";
            var dg =$('#tableTrainee');
            var opts =dg.datagrid('options');
            var pager =dg.datagrid('getPager');
            var _pageNumber =opts.pageNumber;
            var _pageSize =opts.pageSize;
            //异步获取数据到javascript对象,入参为查询条件和页码信息
            $.post('Ajax/GetTraineeHandler.ashx', {
                Name: name,
                CompanyCode:companyCode,
                pageNumber:_pageNumber,
                pageSize:_pageSize
            }, function(data) {
            //注意此处从数据库传来的data数据有记录总行数的total列
               var total = JSON.parse(data).rows[0].total;
               $('#tableTrainee').datagrid('loadData', JSON.parse(data));
               pager.pagination({
               //更新pagination的导航列表各参数
               total:total,//总数
               pageSize: _pageSize,//行数
               pageNumber: _pageNumber//页数
                });
   });
        }
下面的工作就是使用服务器获取数据库的数据了。

按照以上要求的话,数据库的查询语句就不能使用 count(*),select * 类似需要全局搜索的语句了,因为其太耗时了。

网上牛人关于分页搜索语句的帖子非常的多,搜索方法多种多样,这里我采用了以下这个:

select top 页大小 * from id 
where id  not in
( 
select top 页大小*(页数-1) id  from table  order by id  asc
)  

这个语句的优点是不用查询所有行,缺点是页码越大,查询的效率越低。例如,一次测试中获取一千万行后的10行数据,约需要1分钟。


现在的主要问题基本是解决了,但是还是存在不少问题:

1. 从服务器中获取数据总条数的时候是使用的select count(*)语句,这样的语句和select * 类似,都是需要搜索全部数据的,会导致大数据的情况下变得很慢。

2. 不止可以从查询语句方面提高查询效率,如果可以的话,应该给数据库表添加索引,如果可以添加存储过程的话就更好了。


2013.12.30补充

在查询数据库的时候,也可以采用下面这条语句

SELECT TOP 页大小 *
FROM table1
WHERE id >
          (
          SELECT ISNULL(MAX(id),0) 
          FROM 
                (
                SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                ) A
          )
ORDER BY id

比较下来,这个语句比上面使用not in语句的查询效率更高,但仍无法避免页码增大会导致效率变差的情况,获取1千万行以后的10行数据仍然需要1分钟以上。

获取datagrid右下角那里的总页数,不可避免的需要使用count语句,这会出现查询语句的短板,无奈~~

如果不带条件的获取总行数的话,可以使用下面这条语句

SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('tableName') AND INDID = 1

注意其获取的并非精确值,而是服务器隔一段时间更新的数据库表总行数。


参考:

再次谈谈easyui datagrid 的数据加载:

http://www.easyui.info/archives/204.html

jqueryeasyui datagrid分页显示数据:

http://blog.youkuaiyun.com/metal1/article/details/17040379

EasyUI官方demo:

http://www.jeasyui.com/demo/main/index.php?plugin=DataGrid&theme=default&dir=ltr&pitem=


### 实现EasyUI DataGrid组件的完全自定义分页 为了实现EasyUI DataGrid组件中的完全自定义分页,在前端页面布局方面,需要设置`pagination:true`属性来启用分页条目,并配置分页器的相关参数。对于后端数据处理逻辑,则需确保服务器能够接收来自客户端的分页请求并返回相应范围内的记录集。 #### 前端页面布局 在HTML结构中,按照给定样式初始化一个带有两个区域(北区用于放置查询条件;中心区显示表格)的整体布局[^1]: ```html <body style="padding: 0px;"> <div class="easyui-layout" style="width:99%;height:95%;"> <!-- 查询部分 --> <div id="search" region="north" split="true" style="width: 100%; height:100px;" title="查询"> 查询组件 </div> <!-- 显示datagrid的部分 --> <div id="content" region="center" split="true" style="width: 100%; height:80%;"> <table id="dg"></table> <!-- 这里是实际渲染DataGrid的地方 --> </div> </div> </body> ``` 接着利用JavaScript代码片段初始化DataGrid实例时指定其具备分页能力以及一些其他必要的选项[^2]: ```javascript $('#dg').datagrid({ url:'serverUrl', // 后端接口地址 method: 'get', pagination: true, // 开启分页支持 pageSize: 10, pageList: [10, 20, 30], // 可选每页大小列表 }); ``` #### 后端数据处理逻辑最佳实践 当涉及到后端服务端响应时,应该设计API以便于接受如下几个重要参数:当前页码(`page`)、每页项数(`rows`)以及其他可能影响筛选结果的因素。基于接收到的信息执行数据库查询操作,仅获取特定区间的数据行,并计算总共有多少条符合条件的结果以供前端展示总的页数信息[^3]。 假设采用Python Flask框架为例说明如何编写这样的RESTful API: ```python from flask import request, jsonify import sqlite3 as sql @app.route('/api/data') def get_data(): conn = sql.connect('example.db') try: cur = conn.cursor() # 获取URL参数 page = int(request.args.get('page')) rows_per_page = int(request.args.get('rows')) offset = (page - 1) * rows_per_page count_query = "SELECT COUNT(*) FROM users" data_query = f""" SELECT * FROM users LIMIT {rows_per_page} OFFSET {offset} """ total_items = cur.execute(count_query).fetchone()[0] items = cur.execute(data_query).fetchall() response = { "total": total_items, "rows": items } return jsonify(response) finally: conn.close() ``` 此段脚本展示了怎样根据传入的分页参数动态调整SQL语句中的LIMIT子句和OFFSET值,从而达到按需加载的目的。同时还将总数一并发回给调用者,方便前端构建完整的分页导航栏[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值