jqGrid 问题笔记

所谓问题可能不是jqgrid本身问题,而是浏览器或应用的特殊需要而产生的问题。

 

01.单元格内的文本自动换行

 

加入样式:

 

.ui-jqgrid tr.jqgrow td {
    white-space: normal !important;
    height:auto;
    vertical-align:text-top;
    padding-top:2px;
}

 

具体说明可参阅: http://blog.qumsieh.ca/2009/12/03/jqgrid-textword-wrapping/

 

 

02.保持显示垂直滚动条和水平滚动条

 

在IE中记录比较少的时候,默认情况下不显示垂直滚动条,会出现标题行与数据行位置对不齐的情况,通过保持显示垂直滚动条可以解决这个问题( 目前使用jqgrid3.6似乎没有这样的问题  )。

 

    $( pGridId ).closest(".ui-jqgrid-bdiv").css({ 'overflow-y' : 'scroll' });

 

 

需要保持水平滚动条,则:

    $( pGridId ).closest(".ui-jqgrid-bdiv").css({ 'overflow-x' : 'scroll' });

 

在目前使用的 jqgrid 3.6 版本中,当 IE 浏览器中网格宽度超过容器的水平宽度时,高度即使设置为 auto,也会同时出现水平滚动条和垂直滚动条,感觉非常难受。此时,只要保持水平滚动条,即可解决这个问题。使用前后的效果见下图:

 




 

 

 

 

 

 

03.控制列的水平宽度

 

当表字段比较多时,如果按照colModel指定的宽度,整个jqGrid宽度会太宽,我们通常希望控制一下grid的宽度,并同时保持各列的指定宽度。

可以指定jgrid的参数 shrinkToFit:false 。shrinkToFit属性用来说明当初始化列宽度时候的计算类型,如果为ture,则按比例初始化列宽度。如果为false,则列宽度使用colModel指定的宽度。

同时需要控制jqgrid的宽度。通过autowidth:true属性可以达到目地。

 

04. 高度随记录数自动变化.

 

使用 height: 'auto' 参数 .

 

不理想的是,在IE6中,当字段比较多并出现水平滚动条时,感觉会比较难受。参考保持垂直滚动条的办法,保持一个水平滚动条,高度是对了。( 使用的Firefox3.6没发现这个问题, 所以说IE比较烂并不是空穴来风 )

 

 

Js代码 
  1. if($.browser.msie) {       
  2.     // 保持垂直滚动条    
  3.     // $( pGridId ).closest(".ui-jqgrid-bdiv").css({ 'overflow-y' : 'scroll' });     
  4.     // 保持水平滚动条   
  5.     $( pGridId ).closest(".ui-jqgrid-bdiv").css({ 'overflow-x' : 'scroll' });     
  6. }  
 

 

 

 

 

05. jqgrid 和 validation 插件一起使用的问题

 

在提交表单的时候,会报错:'settings' is null or not an object.  'setting'为空或不是对象. 

 

http://www.trirand.com/blog/?page_id=393/help/jqgrid-validation-plugin-issue/ 有这样的问题报告,

 

目前还是有这样的问题。

 

 

06. 动态修改 jqgrid 提交的参数 

 

具体的说明可以参考 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:post_data_module  

 

这里举个例子:当你需要根据用户的输入过滤 jqgrid 的显示数据,可以这样实现,

 

Js代码 
  1. userName = $( '#userName' ).val( );   // input 的值   
  2.   
  3. userCode =  $( '#userCode' ).val( );   // input 的值   
  4.   
  5. jQuery('#grid_user').appendPostData( { userName :userName , userCode :userCode }    
  6.   
  7. 这样,刷新 grid 数据时,提交到服务器的数据将包含这 userName 和 userCode两项。  
 

 

07. Editing form 提交时,动态添加数据项 

 

在以 Form Editing 方式添加或修改数据,如何在提交时动态的添加或修改一些项目呢?

 

一个典型的例子是添加文章记录时,在提交的数据中添加当前时间这个项目。

 

参考 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing 可以知道:

 

在表单提交前,将触发事件 beforeSubmit , 所以我们可以在这个事件里做些事情。

 

Js代码 
  1. // 提交前   
  2. fn_beforeSubmit = function( postdata, formid ) {    
  3.     // 添加或修改 postdata 项目值              
  4.     postdata[ 'uploadDate' ] = new Date().format("yyyy/MM/dd") ;     
  5.     postdata[ 'uploadTime' ] = new Date().format("hh:mm:ss") ;     
  6.                                            
  7.     return[true,''];   // 提交   
  8.                            
  9. };   
  10.   
  11. // 添加记录 options    
  12. Options_add = {   
  13.         width:500,   
  14.         height:290,   
  15.         reloadAfterSubmit:true,   
  16.         jqModal:true,    
  17.         beforeSubmit:       fn_beforeSubmit,   
  18.         ......   
  19. }   
  20.   
  21. // 配置 jqgrid nav   
  22. jQuery( pGridId ).jqGrid('navGrid',pPageId, {edit:true,add:true,del:true,search:false,refresh:true,view:true,addtext:'添加',edittext:'修改',deltext:'删除' }, //options    
  23.         {height:290,reloadAfterSubmit:false, jqModal:true, closeOnEscape:true, bottominfo:"标记有*的字段不能为空"}, // edit options    
  24.         Options_add, // add options    
  25.         {reloadAfterSubmit:false,jqModal:true, closeOnEscape:true }, // del options    
  26.         {closeOnEscape:true}, // search options    
  27.         {height:250,jqModal:false,closeOnEscape:true// view options    
  28.     );   
 

 

 

08.  Editing form 中上传文件 

 

待续 ......

 

 

 

09.  不显示中间的分页器或右边的记录信息 

 

通过 FireBug可以发现 jqgrid  pager中各部分的命名规则: pager id + _left/_center/_right。

 

pPageId = '#pager_grid' ;

$( pPageId + "_center" ).remove( );    // 删除中间分页器

 

 

另外,也可以通过控制 css 实现。

 

参考:

 jqgrid  Tips, Tricks and Hacks -  To use the nav bar for buttons but hide the pager, using CSS

10 JQGrid Tips learned from my experience - tip5,tip6

 

 

10.  取得记录行序号 

 

jqGrid提供的方法一般只能取得记录的 id 号。使用 $('#jqgrid1').jqGrid('getDataIDs') 方法可以获得各行的id数组,此数组相应元素的索引号就是记录行序号了(从0开始)。

 

可以参考:

http://www.trirand.com/blog/?page_id=393/help/to-get-the-rowid-of-the-nth-row-of-the-grid/

 

Found the answer using $('#gridmain').jqGrid('getDataIDs');

It will return an array of ids for the visible grid.

So to get the nth rowid, i use:

var rids = $('#gridmain').jqGrid('getDataIDs');

var nth_row_id = rids[n-1]; //bec the row array starts from zero.

Hope it will help others, if interested.

 

 

 

 

 

其他参考:

 

10 JQGrid Tips learned from my experience

http://veechand.wordpress.com/2009/07/13/10-jqgrid-tips-learned-from-my-experience/

 

 

jqGrid and JQuery UI tabs showing grids expanded only on primary tab (div)


 

http://stackoverflow.com/questions/2117687/jqgrid-and-jquery-ui-tabs-showing-grids-expanded-only-on-primary-tab-div

 

预览文章: jqGrid 问题笔记

永久链接: http://forestkqq.javaeye.com/blog/602944

 

 

所谓问题可能不是jqgrid本身问题,而是浏览器或应用的特殊需要而产生的问题。

 

 

11.  UI Tab中显示jqGrid,只是首个标签中的宽度可以自动扩展 

 

 

解决的办法是在各标签显示的时候才初始化 jqgrid 。下面是  Stack Overflow 中的一段示例:

 

Js代码 
  1. jQuery(document).ready(function() {   
  2.  var initialized = [falsefalse];   
  3.   
  4. // 原文格式  jQuery('#tabs').tabs({show: function(event, ui)  没反应    
  5. // 改为 .bind 格式     
  6.   
  7.  jQuery('#tabs').bind('tabsshow'function(event, ui) {   
  8.                    if (ui.index == 0 && !initialized[0]){   
  9.                       // Initialize grid on second tab page here...   
  10.                       jQuery(NOMBRE_GRID).jqGrid({   
  11.                           url: '/Idiomas/DatosGrid/',   
  12.                           datatype: 'json',   
  13.                           mtype: 'GET',   
  14.                           height: 'auto',   
  15.                           multiselect: true,   
  16.                           autowidth: true,              
  17.                           colNames: ['Id',  'Nombre'],   
  18.                           colModel: [   
  19.                                     { name: 'id_idioma', index: 'id_idioma', width: 100, align: 'left',   
  20.                                         formatter: 'showlink', formatoptions: { baseLinkUrl: '/Idiomas/', showAction: 'Edit', addParam: '' }   
  21.                                     },   
  22.                                     { name: 'nombre', index: 'nombre', width: 100, align: 'left' }   
  23.                                 ],   
  24.                           pager: jQuery(NOMBRE_AREA_PAGINACION),   
  25.                           rowNum: tamanoPagina,   
  26.                           rowList: [5, 10, 15, 20],   
  27.                           sortname: 'nombre',   
  28.                           sortorder: “asc”,   
  29.                           viewrecords: true,              
  30.                           caption: 'Idiomas'  
  31.                       }).navGrid(NOMBRE_AREA_PAGINACION, { edit: false, add: false, del: false, refresh: false, search: false });   
  32.                    });   
  33.   
  34.   
  35.                   } else if (ui.index == 1 && !initialized[1]){   
  36.                       // Initialize grid on second tab page here...   
  37.                       jQuery(NOMBRE_GRID_SELECCIONADOS).jqGrid({   
  38.                           url: '/Idiomas/DatosGrid/',   
  39.                           datatype: 'json',   
  40.                           mtype: 'GET',   
  41.                           height: 'auto',   
  42.                           multiselect: true,   
  43.                           autowidth: true,              
  44.                           colNames: ['Id',  'Nombre'],   
  45.                           colModel: [   
  46.                                     { name: 'id_idioma', index: 'id_idioma', width: 100, align: 'left',   
  47.                                         formatter: 'showlink', formatoptions: { baseLinkUrl: '/Idiomas/', showAction: 'Edit', addParam: '' }   
  48.                                     },   
  49.                                     { name: 'nombre', index: 'nombre', width: 100, align: 'left' }   
  50.                                 ],   
  51.                           sortname: 'nombre',   
  52.                           sortorder: “asc”,   
  53.                           viewrecords: true,              
  54.                           caption: 'Idiomas'  
  55.                       });   
  56.   
  57.                    initialized[ ui.index ] = true;   
  58. });  

 

 

 

 

12. 动态切换 jqgrid multiselect 行多选 选项

 

    原先以为通过修改 multiselect 选项可以实现,后来发现行不通。现在的办法是先允许多选,在需要切换的时候,直接隐藏 multiselect 列。如果需要在装入时即不显示 multiselect 列,可以在 loadComplete 事件中根据需要隐藏此列。

 

Js代码 
  1. // -----------------------------------------------------   
  2. // jqgrid 重置 multiselect   
  3. // -----------------------------------------------------   
  4. function jqgrid_reset_multiselect( jqGrid, opt_multiselect )   
  5. {   
  6.     // jqGrid.setGridParam( { multiselect: opt_multiselect } );   
  7.     if ( opt_multiselect ) {   
  8.         jqGrid.jqGrid('showCol''cb');   
  9.     } else {   
  10.         jqGrid.jqGrid('hideCol''cb');   
  11.     }   
  12.     // jqGrid.trigger( 'reloadGrid' );   
  13.        
  14. }   

需要说明的是,jqgrid 的 multiselect 需要先初始化为 true,才可以在以后动态切换。

 

 

 

  参考:

stackoverflow: jqGrid with multiselect on, how to turn off checkbox checking when row is selected

stackoverflow: jqGrid with multiselect how to check all checkboxes and top one at load?

 

 

13. 如何识别和控制自定义按钮

 

下面的代码通过在分页器上添加一个按钮,切换行多选/单选。同时展示了如何识别和动态改变新添加的导航按钮属性。

 

Js代码 
  1. // 新增一个按钮,设置 id ,以便click事件中识别。    
  2. pjqGrid.jqGrid('navButtonAdd',pPageId,{caption:"多行",title:"行单选", buttonicon :'ui-icon-close',<SPAN style="TEXT-DECORATION: underline"><STRONG>id:'multiselect'</STRONG>   
  3.   
  4.   
  5.   
  6.   
  7.   
  8. </SPAN>   
  9.   
  10.   
  11.   
  12.   
  13.   
  14. , onClickButton:function(  )   
  15.     {    
  16.         var title = $( '#multiselect',pPageId  ).attr( 'title' );   
  17.         if ( title == '行多选' ) {   
  18.                         // 切换按钮图标   
  19.             $( 'span.ui-icon-check''#multiselect',pPageId  ).removeClass().addClass( 'ui-icon ui-icon-close' );   
  20.             $( '#multiselect',pPageId  ).attr( 'title''行单选' );   
  21.                         // 调用“问题12”中的函数   
  22.             jqgrid_reset_multiselect( pjqGrid, true )   
  23.         } else {   
  24.             $( 'span.ui-icon-close''#multiselect',pPageId  ).removeClass().addClass( 'ui-icon ui-icon-check' );   
  25.             $( '#multiselect',pPageId  ).attr( 'title''行多选' );   
  26.             jqgrid_reset_multiselect( pjqGrid, false )   
  27.         }   
  28.     }    
  29. });    
  30.     
  31.    

  关键的是在 navButtonAdd 命令中设定可选的 id 参数。因为这样的按钮是动态添加在 pager 里的,所以可以通过 jQuery 选择器  $( '#multiselect',pPageId  ) 找到它。自定义按钮的具体的Html代码可以通过 FireBug查看出来:

Html代码 
  1. <div id="..." ... >  
  2. ...   
  3. <td class="ui-pg-button ui-corner-all" id="multiselect" title="行单选" style="cursor: pointer;">  
  4.   <div class="ui-pg-div">  
  5.     <span class="ui-icon ui-icon-close"></span>多行   
  6.   </div>  
  7. </td>  
  8. ...   
  9. </div>  

  选择器 $( 'span.ui-icon-check', '#multiselect',pPageId  ) 表示 pager 中id=multiselect的元素中包含class='ui-icon-check'的 span 标签。由此可以看出,了解按钮的代码结构对于编写jQuery选择器是少不了的。

 

 

 

 

14. 使用 setGridParam  动态重载事件 ( 实现数据选择器 )

 

    使用 jqgrid 是 setGridParam 方法,可以动态的设置 jqgrid 参数,也可以动态重载定义的事件处理函数。

 

    比如,我们可以 jqgrid 作为数据记录选择器,在双击行的时候表示选中了当前记录。具体实现可以将 jqgrid 显示在一个 dialog 中,双击行时记录当前记录,并关闭 dialog 。或者通过触发一个自定义事件,由自定义事件的绑定者接收选中的记录。下面我们介绍下如何动态重载事件:

 

Js代码 
  1. // --------------------------------------   
  2. // jqgrid 加载后的回调函数   
  3. // --------------------------------------   
  4. function callback_grid_after_loaded( currGrid, ppagerId )   
  5. {   
  6.     var jqgridId = currGrid.attr( 'id' );  // jqgrid 的 id    
  7.   
  8.     currGrid.jqGrid(    
  9.              'setGridParam',   
  10.              {  ondblClickRow: function( id ) { // 重载  ondblClickRow 事件   
  11.                   var rowdata = currGrid.getRowData( id );  // 行数据   
  12.   
  13.                       // 触发自定义事件   
  14.                        $( '#obj1' ).trigger(    
  15.                             "selected_jqgrid_CRUD",    
  16.                             { jqgridId:jqgridId, selectedId:id }      
  17.                        );     
  18.               }}   
  19.          );   
  20.   
  21. }  

 

需要注意的是,对于要重载的事件,在初始化 jqgrid 的时候,需要定义事件参数:

 

Js代码 
  1. var jqOption = {    
  2.           
  3.          height: "auto",    
  4.   
  5.           ....,   
  6.           ondblClickRow : function(id){   }    // 定义事件    
  7.       };   
  8.   
  9.   
  10. var currGrid =  jQuery("#jqgrid1").jqGrid(  jqOption );   
  11. ......   
  12.   
  13. callback_grid_after_loaded( currGrid, '#pagerId' );  

 

参考:

 

setGridParam 方法

 

jqGrid dynamic event

 

 

 

 

15. 设定 jqgrid 数据行高度

 

    通过重新定义 jqgrid(3.6.4) 样式可以设定数据行的高度:

Css代码 
  1.  .ui-jqgrid tr.jqgrow td {   
  2.     height:30px;    /* row 高度 */   
  3. }  

 

 

16. UI dialog 中使用 jqgrid 时 jqmodal 被遮盖

 

    在 UI dialog 中使用 jqgrid(3.6.4) , 调用 jqgrid.setColumns( { jqModal:true } ) ,即显示 jqModal 对话框,此时 jqModal 对话框将被 dialog 遮盖(见下图)。


 

 

    出现这种情况自然是因为 z-index 的问题,通过 firefox 可以看出 dialog 的z-index为 1002, 而 jqmodal 的为 950。我们可以修改 grid.common.js 中设定的值:

Js代码 
  1. // 原来为 950, 但在 UI dialog 中使用 jqmodal setColumns 时,z-index 较小    
  2. if(!p.zIndex) {p.zIndex = 1950;}      

 

    可以参考:JqGrid in a JqModal causes incorrect edit/delete/alertmod modal position


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值