【jqgrid】简单封装


如果要实现上图的grid,使用原始的jqgrid,代码如下:

 1     function initGrid(){
 2         $("#gridId").jqGrid({
 3             datatype: "json",
 4             mtype:'POST',
 5             url:"<%=request.getContextPath()%>/gridServer!server.do",
 6                colNames:['编号','用户名', '密码'],
 7                colModel:[
 8                    {name:'id',index:'id', width:100,editable:true,edittype:'text'},
 9                    {name:'userName',index:'userName', width:100,editable:true,sorttype:'date'},
10                    {name:'password',index:'password', width:100,editable:true,edittype:'text'}
11                ],
12                viewrecords:true,
13                rowNum:10,
14                rowList:[10,20,30],
15                sortname: 'id',
16             sortorder: "asc",
17             viewrecords: true,
18             autowidth:true,
19             height:'auto',
20             caption:"用户信息",
21             pager:'pageDiv',
22             altRows:true,
23             altclass:'gridAltclass',
24             prmNames:{
25                 page:"pageNum",
26                 rows:"pageSize", 
27                 sort: "sordCol",
28                 order: "orderRule", 
29                 search:"_search"
30             }
31             ,jsonReader:{
32                 total:'pageTotal',
33                 page:'pageNum',
34                 records:'totalSize',
35                 rows:'rows'
36             },
37             beforeRequest:function(){
38                 $("#gridId").jqGrid('setGridParam',{
39                     postData:{
40                         gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
41                         userName:$("#userName").val()
42                         }
43                 });
44             }
45         });
46     }

如果要实现多个这样的grid,其实很多类似datatype、mtype、viewrecords、autowidth、height等等这样的配置信息是重复的,而且每次修改配置文件的时候必须要保证colNames、colModel的长度必须一致,为了让datatype等公共配置信息不分布在各个地方,我在jqgrid上做了简单的包装。虽有很多配置信息修改jqgrid源代码会更佳快捷,但我不建议这样做。如果修改了源代码,以后想通过升级jqgrid版本来引进新功能的时候我们不得不重修对新版本的源码做一次同样的修改,稍有不慎漏改或者改错了某个地方可能会导致不可预知的错误。

jquery.jqGrid.extend.js

  1 if( Array.prototype.indexOf==undefined ){
  2     Array.prototype.indexOf = function(el){
  3         return $.inArray(el,this);
  4     };
  5 }
  6 function isEmptyString( str ){
  7     return str==undefined || $.trim(str)=='';
  8 }
  9 function queryGridData(gridId){
 10     $("#"+gridId).trigger("reloadGrid",[{page:1}]);
 11 }
 12 function exportGridExcel(gridId){
 13     extJqGrid.exportGridExcel(gridId);
 14 }
 15 var extJqGridObjects = {};
 16 var extJqGrid ={
 17     defaultConfig:{
 18         datatype:'json',
 19         mtype:'POST',
 20         url:contextPath+"/gridServer!server.do",
 21         rowNum:10,
 22         rowList:[10,15,20],
 23         altRows:true,
 24         altclass:'gridAltclass',
 25         autowidth:true,
 26         height:'auto',
 27         scrollOffset:0,
 28         forceFit:true,
 29         viewrecords:true,
 30         toolbar:[true,'top'],
 31         //pgbuttons:true,
 32         pageMultiselect:false,
 33         rownumbers:true,
 34         showPager:true,
 35         loadDataFlag:true,
 36         useColSpanStyle:false,
 37         excelDataFrom:'server',
 38         'emptyrecords':'没有符合条件的记录',
 39         prmNames:{
 40             page:"pageNum",
 41             rows:"pageSize", 
 42             sort: "sordCol",
 43             order: "orderRule", 
 44             search:"_search"
 45         }
 46         ,jsonReader:{
 47             total:'pageTotal',
 48             page:'pageNum',
 49             records:'totalSize',
 50             rows:'rows'
 51         }
 52     },
 53     GridHeader:function(colModel){
 54         if( colModel.colspan!=undefined&&colModel.colspan>1 ){
 55             this.colName = isEmptyString(colModel.colspanTitle)?colModel.colName : colModel.colspanTitle;
 56             if( isEmptyString(this.colName) ){
 57                 this.colName = '';
 58             }
 59         }else{
 60             this.colName = colModel.colName;
 61         }
 62         this.name = colModel.name;
 63         this.isParent = false;
 64         this.countFlag=colModel.countFlag; 
 65     },
 66     /**
 67      * MergeHeader extends GridHeader
 68      */
 69     MergeHeader:function(colModels,colIndex){
 70         var colModel = colModels[colIndex];
 71         extJqGrid.GridHeader.call(this,colModel);
 72         if(  colModel.colspan!=undefined&&colModel.colspan>1 ){
 73             var subHeaders = [];
 74             for( var i=colIndex;i<(colIndex+colModel.colspan);i++ ){
 75                 subHeaders.push( new extJqGrid.GridHeader(colModels[i]));
 76             }
 77             this.subHeaders = subHeaders;
 78             this.isParent = true;
 79         }
 80     },
 81     /**
 82      * 初始化grid表头信息,如果isParent为true,则表示该表头为合并单元格
 83      */
 84     initGridHeaders:function(config){
 85         var colModels =config.colModel;
 86         var gridHeaders = [];
 87         for( var i=0;i<colModels.length;i++ ){
 88             if(colModels[i].hidden||isEmptyString(colModels[i].name)) continue;
 89             gridHeaders.push(new extJqGrid.MergeHeader(colModels,i));
 90             i+= colModels[i].colspan==undefined ? 0 : (colModels[i].colspan-1);
 91         }
 92         config.gridHeaders = gridHeaders;
 93     },
 94     /**
 95      * 合并表头信息
 96      */
 97     GroupHeader:function(gridHeader){
 98         this.startColumnName = gridHeader.name;
 99         this.numberOfColumns = gridHeader.subHeaders.length;
100         this.titleText = gridHeader.colName;
101     },
102     /**
103      *合并表头 
104      */
105     setGroupHeaders:function(config){
106         if(!config.useColSpanStyle)
107             return;
108         var groupHeaders = [];
109         $(config.gridHeaders).each(function(index,gridHeader){
110             if( gridHeader.isParent ){
111                 groupHeaders.push(new extJqGrid.GroupHeader(gridHeader));
112             }
113         });
114         $("#"+config.gridId).jqGrid('setGroupHeaders', {
115               useColSpanStyle: true, 
116               groupHeaders:groupHeaders    
117             });
118     },
119     initColModel:function(config){
120         var undefinedColNames = false;
121         if( config.colNames==undefined ){
122             undefinedColNames = true;
123             config.colNames=[];
124         }
125         var colModels = config.colModel;
126         $.each(colModels,function(index,colModel){
127             if( colModel.key===true&&config.keyName==undefined ){
128                 config.keyName = colModel.name;
129             }
130             if( !config.useColSpanStyle&&colModel.colspan!=undefined&&colModel.colspan>1 ){
131                 config.useColSpanStyle = true;
132             }
133             if( colModel.index==undefined&&colModel.name!=undefined ){
134                 colModel.index = colModel.name;
135             }
136             if(undefinedColNames){
137                 if(colModel.colName==undefined){
138                     colModel.colName = colModel.name==undefined ? "" : colModel.name;
139                 }
140                 config.colNames.push(colModel.colName);
141             }
142         });
143         extJqGrid.initGridHeaders(config);
144     }
145     ,init:function(gridId,userConfig){
146         userConfig.gridId = gridId;
147         var config = extJqGrid.initGridConfig(userConfig);
148         extJqGrid.initGridEvent(config);
149         return config;
150     }
151     ,initGridConfig:function(userConfig){
152         var config = {};
153         $.extend(true,config,extJqGrid.defaultConfig,userConfig);
154         extJqGrid.initColModel(config);
155         if(config.rowNum==undefined){
156             config.rowNum = rowList[0];
157         }
158         if(config.loadAll==true){
159             config.rowNum = -1;
160         }
161         if(config.showPager==true&&config.pager==undefined){
162             if( $("#extJqGrid_page_"+config.gridId).length==0 ){
163                 $("#"+config.gridId).after('<div id="extJqGrid_page_'+config.gridId+'"></div>');
164             }
165             config.pager = 'extJqGrid_page_'+config.gridId;
166         }
167         config.pagerId = config.pager; 
168         if( config.cellEdit&&config.cellsubmit==undefined ){
169             config.cellsubmit='clientArray';
170         }
171         if( config.exportExcel==true ){
172             if(isEmptyString(config.exportExcelName)){
173                 config.exportExcelName = isEmptyString(config.caption) ? 'gridExportExcel.xls' : config.caption;
174             }
175             if( $("#_gridExportExcelForm").length==0 ){
176                 $("body").prepend('<form action="'+contextPath+'/gridServer!export.do" id="_gridExportExcelForm" style="display: none;" method="post">'+
177                     "<input type='hidden' id='_exportExcelName' name='exportGridParam.exportExcelName' >"+
178                     "<input type='hidden' id='_gridHeadStr' name='exportGridParam.gridHeadStr' >"+
179                     "<input type='hidden' id='_gridSql' name='exportGridParam.gridSql' >"+
180                     "<input type='hidden' id='_excelDataSql' name='exportGridParam.excelDataSql' >"+
181                     "<input type='hidden' id='_datasourceClass' name='exportGridParam.datasourceClass' >"+
182                     "<input type='hidden' id='_queryParamStr' name='exportGridParam.queryParamStr' >"+
183                     "<input type='hidden' id='_gridLocalDatas' name='gridLocalDatas' >"+
184                     '</form>');
185             }
186         }
187         return config;
188     }
189     ,exportGridExcel:function(gridId){
190         var config = extJqGridObjects[gridId];
191         if(config==undefined){
192             return;
193         }
194         var gridExportExcelForm = $("#_gridExportExcelForm");
195         $(gridExportExcelForm).find("input").val('');
196         $("#_exportExcelName").val(config.exportExcelName);
197         $("#_gridHeadStr").val(JSON.stringify(config.gridHeaders));
198         if(config.excelDataFrom==='server'){
199             extJqGrid.exportGridExcelFromServer(config,gridExportExcelForm);
200         }else if(config.excelDataFrom==='local'){
201             extJqGrid.exportGridExcelFromLocal(config,gridExportExcelForm);
202         }
203         $("#_gridExportExcelForm").submit();
204     }
205     ,exportGridExcelFromServer:function(config,gridExportExcelForm){
206         queryGridData(config.gridId);
207         $(gridExportExcelForm).attr('action',(contextPath+'/gridServer!export.do?timeStap='+new Date().getTime()));
208         if(!isEmptyString(config.gridSql)){
209             $("#_gridSql").val(config.gridSql);
210         }
211         if(!isEmptyString(config.excelDataSql)){
212             $("#_excelDataSql").val(config.excelDataSql);
213         }
214         if(!isEmptyString(config.datasourceClass)){
215             $("#_datasourceClass").val(config.datasourceClass);
216         }
217         var postData = $("#"+config.gridId).jqGrid('getGridParam','postData');
218         if(postData!=undefined){
219             $("#_queryParamStr").val(JSON.stringify(postData));
220         }
221         
222     }
223     ,exportGridExcelFromLocal:function(config,gridExportExcelForm){
224         $(gridExportExcelForm).attr('action',(contextPath+'/gridServer!exportFromLocal.do?timeStap='+new Date().getTime()));
225         var datas = extJqGrid.getAllLocalDatas(config.gridId);
226         $("#_gridLocalDatas").val(JSON.stringify(datas));
227     }
228     ,getAllLocalDatas:function(gridId){
229         var config = extJqGridObjects[gridId];
230         var rowDatas = [];
231         if(config.multiselect){
232             if(config.loadonce){ //一次性加载:所有的数据 在页面保存
233                 $(config.selectIds).each(function( index,rowId ){
234                     rowDatas.push( $("#"+gridId).getLocalRow(rowId));
235                 });
236             }else{ //非一次性加载:在服务器端分页的
237                 $($("#"+gridId).jqGrid('getGridParam','selarrrow')).each(function( index,rowId ){
238                     rowDatas.push( $("#"+gridId).getRowData(rowId));
239                 });
240             }
241         }else{
242             if(config.loadonce){ // 一次性加载:所有的数据 在页面保存
243                 rowDatas =  $("#"+gridId).getGridParam('data');
244             }else{ // 非一次性加载:在服务器端分页的
245                 rowDatas = $("#"+gridId).getRowData();
246             }
247         }
248         return rowDatas;
249     }
250     ,initGridEvent:function(config){
251         extJqGrid.initBeforeRequestEvent(config);
252         extJqGrid.initGridCompleteEvent(config);
253         if( config.cellEdit==true ){
254             extJqGrid.initEditEvent(config);
255         }
256         extJqGrid.initSelectEvent(config);
257     }
258     ,initEditEvent:function(config){
259         extJqGrid.initAfterEditCell(config);
260         extJqGrid.initBeforeSaveCell(config);
261         extJqGrid.initAfterSaveCell(config);
262     }
263     ,initSelectEvent:function(config){
264         //extJqGrid.initBeforeSelectRow(config);//解决最新版本cellEdit和mutilselect同时为true不能选择的问题
265         extJqGrid.initSelectLocalAllRow(config);
266         extJqGrid.initOnSelectRow(config);
267         extJqGrid.initOnSelectAll(config);
268     }
269     ,initOnSelectRow:function(config){
270         if(typeof config.onSelectRow ==='function'){
271             config.customOnSelectRow = config.onSelectRow;
272         }
273         config.onSelectRow = function(rowid,status,e){
274             if(config.customOnSelectRow!=undefined){
275                 config.customOnSelectRow.apply(this,arguments);
276             }
277             if( config.selectIds!=undefined ){
278                 extJqGrid.modifySelectIds(config,rowid,status);
279             }
280         };
281     }
282     ,initSelectLocalAllRow:function(config){//初始化一次性加载时选择本地所有文件的事件
283         if(config.multiselect===true&&config.pageMultiselect===true&&config.loadonce===true){
284             config.selectIds=[];
285         }
286     }
287     ,initOnSelectAll:function(config){
288         if( typeof config.onSelectAll ==='function' ){
289             config.customOnSelectAll = config.onSelectAll;
290         }
291         config.onSelectAll = function(rowids,status){
292             if(config.customOnSelectAll!=undefined){
293                 config.customOnSelectAll.apply(this,arguments);
294             }
295             if(config.selectIds!=undefined){
296                 $(rowids).each(function(index,rowid){
297                     extJqGrid.modifySelectIds(config,rowid,status);
298                 });
299             }
300         };
301     }
302     ,modifySelectIds:function( config,rowid,status ){
303         if( status ){
304             if($.inArray(rowid,config.selectIds)==-1 ){
305                 config.selectIds.push(rowid);
306             }
307         }else{
308             config.selectIds = $.grep(config.selectIds,function(_rowid,index){
309                 return  _rowid!=rowid;
310             });
311             /*
312             if(config.selectAllLocalRows){
313                 $('#'+config.gridId+"SelectAllLocalRows").attr('checked', false);
314             }
315             */
316         }
317     }
318     ,initBeforeSelectRow:function(config){
319         if( typeof config.beforeSelectRow !='function'&&config.cellEdit==true&&config.multiselect==true ){
320             config.beforeSelectRow = function(rowid, e){
321                 $(this).restoreRow(rowid);
322                 return false;
323             };
324         }
325     }
326     ,initAfterEditCell:function(config){
327         if(typeof config.afterEditCell =='function'){
328             config.customAfterEditCell = config.afterEditCell;
329         }
330         config.afterEditCell = function(rowid, cellname, value, iRow, iCol){//注册焦点离开保存单元格事件
331             if(config.customAfterEditCell!=undefined){
332                 config.customAfterEditCell.apply(this,arguments);
333             }
334             if( !(config.customAfterEditCell!=undefined&&config.customAfterEditCell.toString().indexOf("saveCell")!=-1)){
335                 $("#"+iRow+"_"+cellname,"#"+config.gridId).blur(function(){
336                     $('#'+config.gridId).jqGrid('saveCell',iRow, iCol);
337                 });
338             }
339             extJqGridObjects[config.gridId].editCellOldValue =value;
340         };
341     }
342     ,initBeforeSaveCell:function(config){
343         if(typeof config.beforeSaveCell =='function'){
344             config.customBeforeSaveCell = config.beforeSaveCell;
345         }
346         config.beforeSaveCell = function(rowid, cellname, value, iRow, iCol){
347             if( config.customBeforeSaveCell!=undefined ){
348                 var returnValue = config.customBeforeSaveCell.apply(this,arguments);
349                 if( returnValue==false ){
350                     return extJqGridObjects[config.gridId].editCellOldValue;
351                 }
352             }
353         };
354     }
355     ,initAfterSaveCell:function(config){
356         if( typeof config.afterSaveCell =='function' ){
357             config.customAfterSaveCell=config.afterSaveCell;
358         }
359         config.afterSaveCell=function(rowid, cellname, value, iRow, iCol){
360             if(config.customAfterSaveCell!=undefined){
361                 config.customAfterSaveCell.apply(this, arguments);
362             }
363             if( value!=extJqGridObjects[config.gridId].editCellOldValue ){
364                 $("#"+config.gridId+" tr td.edit-cell").css({background:'#55C8FC',color:'red'});
365             }
366         };
367     }
368     ,initBeforeRequestEvent:function(config){
369         if(typeof config.beforeRequest =='function'){
370             config.customBeforeRequest = config.beforeRequest;
371         }
372         config.beforeRequest = function(){
373             if(config.loadDataFlag==false){
374                 config.loadDataFlag=true;
375                 return false;
376             }
377             config.loadDataFlag = false;
378             if( config.customBeforeRequest!=undefined ){
379                 var requestFlag = config.customBeforeRequest.apply(this,arguments);
380                 if( requestFlag==false ){
381                     return false;
382                 }
383             }
384             if(config.defaultRequestParamNames==undefined){//初始化默认的参数名称
385                 config.defaultRequestParamNames = [];
386                 for( var i in config.prmNames ){
387                     config.defaultRequestParamNames.push(config.prmNames[i]);
388                 }
389             }
390             var postData = $("#"+config.gridId).jqGrid('getGridParam','postData');
391             if(postData==undefined){
392                 postData = {};
393             }else{
394                 for(var item in postData){
395                     if($.inArray(item,config.defaultRequestParamNames)==-1){
396                         postData[item]= undefined;
397                     }
398                 }
399             }
400             if( config.postData!=undefined ){
401                 $.extend(postData,config.postData);
402             }
403             postData['loadonce'] = config.loadonce;
404             postData['gridSql'] = config.gridSql;
405             postData['countSql'] = config.countSql;
406             postData['datasourceClass'] = config.datasourceClass;
407             if( !config.loadDataFlag ){
408                 config.loadDataFlag = true;
409             }
410             if( config.loadAll||config.loadonce ){
411                 jQuery.extend(postData, {loadAll:true});
412             }
413             if( config.postParamFields!=undefined ) {
414                 $.each(config.postParamFields,function(index, _paramName){
415                     var _paramValue = $("#"+_paramName).val();
416                     if(_paramValue!=null&& $.trim(_paramValue)!=''){
417                         postData[_paramName] = $.trim(_paramValue);
418                     }else{
419                         postData[_paramName] = '';
420                     }
421                 });
422             }
423             if( $.isFunction(config.preparePostData) ){
424                 var _postData = config.preparePostData.apply(this,arguments);
425                 if( _postData!=undefined&&_postData!=null ){
426                     jQuery.extend(postData, _postData);
427                 }
428             }
429             $("#"+config.gridId).jqGrid('setGridParam',{
430                 postData:postData,
431                 url:(contextPath+"/gridServer!server.do?timeStamp="+new Date().getTime())
432             });
433         };
434     }
435     ,initGridCompleteEvent:function(config){
436         if( typeof config.gridComplete == 'function' ){
437             config.customGridComplete = config.gridComplete;
438         }
439         config.gridComplete = function(){//如果beforeRequest返回false,则不会触发该事件
440             var gridObject = extJqGridObjects[config.gridId];
441             gridObject.loadDataFlag = true;
442             if( config.customGridComplete!=undefined ){
443                 config.customGridComplete.apply(this,arguments);
444             }
445             //本地分页且多选的时候使用
446             if(config.multiselect===true&&config.pageMultiselect===true
447                     &&config.loadonce===true&&config.keyName!=undefined){
448                 $("#"+config.gridId).resetSelection();
449                 var currentPageDatas = $("#"+config.gridId).jqGrid("getRowData");
450                 $(currentPageDatas).each(function(index,data){
451                     if($.inArray(data[config.keyName],config.selectIds)!=-1){
452                         $("#"+config.gridId).setSelection(data[config.keyName],false);
453                     }
454                 });
455             }
456         };
457     }
458     ,selectLocalAllRow:function(gridId){
459         extJqGridObjects[gridId].selectIds = extJqGrid.getAllLocalRowIds(gridId);
460         extJqGrid.selectAllRow(gridId);
461     }
462     ,deSelectLocalAllRow:function(gridId){
463         extJqGridObjects[gridId].selectIds = [];
464         extJqGrid.selectAllRow(gridId, false);
465     }
466     ,selectAllRow:function(gridId,checked){
467         $("#"+gridId).trigger("jqGridSelectAll",!(checked===false));
468         /*
469         $('#cb_'+gridId).attr('checked', (checked===false));
470         $("#cb_"+gridId).trigger("click");
471         $('#cb_'+gridId).attr('checked', !(checked===false));
472         */
473     }
474     ,deselectAllRow:function(gridId){
475         extJqGrid.selectAllRow(gridId, false);
476     }
477     ,getAllLocalRowIds:function( gridId ){
478         var config = extJqGridObjects[gridId];
479         if( config.allLocalRowIds==undefined||config.allLocalRowIds==null||config.allLocalRowIds.length==0 ){
480             var allLocalRowIds = [];
481             var allLocalRowDatas = $("#"+config.gridId).getGridParam('data');
482             $(allLocalRowDatas).each(function( index,rowData ){
483                 allLocalRowIds.push(rowData._id_);
484             });
485             config.allLocalRowIds = allLocalRowIds;
486         }
487         return  config.allLocalRowIds;
488     }
489 };
490 $.fn.extJqGrid = function(userConfig){
491     var gridId = $(this).attr('id');
492     var config = extJqGrid.init(gridId, userConfig);
493     extJqGridObjects[config.gridId] = config;
494     $("#"+gridId).jqGrid(config);
495     extJqGrid.setGroupHeaders(config);
496     $(this).bind('jqGridSelectAll',function(e,checkFlag){
497         if(e.isTrigger===2){
498             return;
499         }
500         $('#cb_'+gridId).attr('checked', (checkFlag===false));
501         $("#cb_"+gridId).trigger("click");
502         $('#cb_'+gridId).attr('checked', !(checkFlag===false));
503     });
504 };

引用jquery.jqGrid.extend.js文件,还是实现上图一样的功能,代码如下:

 1     $("#gridId").extJqGrid({
 2            colModel:[
 3                {name:'id',colName:'编号',key:true,width:100},
 4                {name:'userName',colName:'用户名',width:100},
 5                {name:'password',colName:'密码', width:100}    
 6         ],
 7            gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
 8            postParamFields:["userName"],
 9            caption:"用户信息"
10     });

相对使用原始的jqgrid来说是不是简单了不少?

在jquery.jqGrid.extend.js中把colNames和colModel合并成colModel,这样避免了因colNames和colModel长度不同而报错的情况。在系统中大部分的表格只需要一个sql语句就能把表格中所有的数据都查询出来,所以在extJqGrid中添加了gridSql(查询grid数据sql语句)这个配置,这里默认向后台服务器传递的参数为gridSql、pageSize、pageNum、sordCol、orderRule、_search,如果需要向后台传递额外的参数,则可以使用postParamFields配置,也可以使用原始的jqgrid一样通过配置beforeRequest方法来传递参数。postParamFields表示需要传值给后台的input 输入域的id数组。

我在后台用统一的Action、Service、Dao对jqgrid的请求做了相应的封装,因为涉及到的东西太多,后台代码这里就不再给出了,我只分享一下大概的思路。

  1、获取jqgrid请求参数(如上面的gridSql、pageSize等等),将请求参数存放到map中

  2、根据gridSql在系统中获取对应的sql语句,假设这个sql语句为select * from t_user where user_name like  ?

  3、在gridSql对应的sql语句外面包一层,查询符合条件的记录数,包装后的sql语句如:select count(1) cnt from( select * from t_user where user_name like    ? ) t

  4、如果第3步查询结果为0则直接返回,如果第3步查询结果大于0,则调用第5步

  5、在gridSql对应的sql语句外面包一层,分页查询符合条件的grid记录,包装后的sql语句如下:select * from (select * from t_user where user_name like  ?) limit 0,10 ,如果sordCol参数不为空则需要在包装的sql语句中添加排序规则

  6、返回查询结果

上面只是大概分享了一下对gridSql的简单包装思路,因为后台架构的问题,作者的实现方式远比上面所有的复杂。

gridSql只是满足了大部分grid的需求,但有些grid数据来源不能简单的使用sql语句查询那么简单,可能要经过复杂的运算或者到第三方系统中获取数据。针对这种情况,我在extJqGrid中添加了datasourceClass配置参数。datasourceClass的值必须为IGridDatasource接口的实现类,用户可以在实现类中完成相应的grid数据业务查询。IGridDatasource接口如下:

1 public interface IGridDatasource {
2     public <E> PageResult<E> getPageResult(GridParam gridParam)throws Exception;
3 }

表头合并colspan参数:

 1     $("#gridId").extJqGrid({
 2            colModel:[
 3                {name:'id',colName:'编号',key:true,width:100},
 4                {name:'userName',colName:'用户名',width:100,colspan:2},
 5                {name:'password',colName:'密码', width:100}    
 6         ],
 7            gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
 8            postParamFields:["userName"],
 9            caption:"用户信息"
10     });

导出excel配置参数exportExcel:

 1     $("#gridId").extJqGrid({
 2            colModel:[
 3                {name:'id',colName:'编号',key:true,width:100},
 4                {name:'userName',colName:'用户名',width:100,colspan:2},
 5                {name:'password',colName:'密码', width:100}    
 6         ],
 7            gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
 8            postParamFields:["userName"],
 9            caption:"用户信息"
10            ,exportExcel:true
11     });

默认excelDataFrom为server,excel的数据为数据库中符合查询条件的所有数据,表头合并信息和页面保持一致,也可以通过exportExcelName来配置导出excel的文件名称。

如果excelDataFrom为local,则excel数据来源于页面的grid,当grid多选配置multiselect为false时excel的数据为当年页面中所有数据,当grid多选配置multiselect为false,则excel的数据为页面中所有选中的数据。

修改单元格内容后,自动标识(背景颜色不是很好看,读者可以自己调整)

 1     $("#gridId").extJqGrid({
 2            colModel:[
 3                {name:'id',colName:'编号',key:true,width:100},
 4                {name:'userName',colName:'用户名',width:100,editable:true},
 5                {name:'password',colName:'密码', width:100}    
 6         ],
 7            gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
 8            postParamFields:["userName"],
 9            caption:"用户信息"
10            ,cellEdit:true
11     });

分页多选:

假设有这样的需求,我们在第一页选择几条记录,然后翻到第二页再选择几条记录,最后翻回第一页,要求原来选中的记录状态任然为选中。jqgrid是不支持这样的特性的,所以我添加了pageMultiselect选项来完成类似这样的功能。当且仅当loadonce、multiselect和pageMultiselect都为true时可实现翻页多选(大家可以根据自己的需求做相关修改)

 1     $("#gridId").extJqGrid({
 2            colModel:[
 3                {name:'id',colName:'编号',key:true,width:100},
 4                {name:'userName',colName:'用户名',width:100},
 5                {name:'password',colName:'密码', width:100}    
 6         ],
 7            gridSql:'com.myproject.user.dao.UserDao.queryByCondition',
 8            postParamFields:["userName"],
 9            caption:"用户信息"
10            ,loadonce:true
11            ,multiselect:true
12            ,pageMultiselect:true
13     });

 

本地全选:

跟分页多选的条件一样,当且仅当loadonce、multiselect和pageMultiselect都为true时,可以使用extJqGrid.selectLocalAllRow()方法选择本地所有记录,调用extJqGrid.selectLocalAllRow()方法取消全选本地记录

翻到第二页所有记录也都是选中状态

触发全选事件:

如果使用原生的jqgrid,想要使用程序触发jqGridSelectAll事件进行全选是无效的,虽然jqgrid官方文档提供了jqGridSelectAll事件的说明,但源码中根本没有定义这样的事件。我在封装的js中添加了jqGridSelectAll事件,通过以下代码可以触发grid的全选和取消全选事件

$("#gridId").trigger("jqGridSelectAll",true);  
$("#gridId").trigger("jqGridSelectAll",false); 

 如果程序存在什么问题,希望各位大神能帮忙指正,在此不胜感激!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM