BUG:jqGrid可合并属性设置为true,无法实现当前列合并

这个BUG是基于我们平台进行开发发现的,不具有普遍性。

BUG的表现形式是当前列可合并属性mergeRow设为true后,当前列相同数据行无法合并,只会影响前一行属性。

merge属性:当前列重复属性是否可合并,默认为false,设置为true设置合并

sorttype属性:定义排序的方式,可选值:int/integer - 对整形数值进行排序, float/number/currency - 对浮点型数值进行排序, date - 对日期进行排序, text - 对文本进行排序, function - 自定义排序方法 默认值为:text。

sortable属性:是否可排序,默认为true

问题原因是

在jqGrid主标签<grid>中使用了一个标签属性,来对行数据进行序号排列。rownumbers="true"。

导致freemark的ftl文件中判断列数出错。而jqGrid为列赋值,为列绑定属性JS出错。

jqGrid生成的JS

<script type='text/javascript'>
jQuery(document).ready(function () { 
	var options_listGrid = {};
	options_listGrid.defaultUrls = {
        ajaxDelete : "student!ajaxDelete.do",
        "delete" : "student!ajaxDelete.do",
        edit : "student!edit.do",
        view : "student!view.do"
    };
	var options_listGrid_colmodels = new Array();
	var options_listGrid_colnames = new Array();
	var options_listGrid_coljsonmaps = new Array();
	var options_listGrid_operations = new Array();
	var options_listGrid_operations_2 = new Array();
	var options_listGrid_mergeRowCols = new Array();
	var options_listGrid_groupHeaders = new Array();
	    jQuery("#listGrid").after("<div id='listGrid_pager'></div>");
    options_listGrid.pager = "listGrid_pager";
    options_listGrid.rowList = [10,20,30,50,100];
    options_listGrid.rowNum = 10;

	var options_listGrid_colmodels_id = {};
options_listGrid_colmodels_id.name = "id";
options_listGrid_colmodels_id.jsonmap = "id";
options_listGrid_colmodels_id.align = "center";
    options_listGrid_colmodels_id.title = true;
    options_listGrid_colmodels_id.formatoptions = {};
    options_listGrid_colmodels_id.editable = false;
    options_listGrid_colmodels_id.search = true;
    options_listGrid_colmodels_id.sortable = true;
    options_listGrid_colmodels_id.hidden = true;
    options_listGrid_colmodels_id.key = true;
    options_listGrid_colmodels_id.resizable = true;
options_listGrid_colnames.push("primaryKey");
options_listGrid_colmodels.push(options_listGrid_colmodels_id);
if(options_listGrid_colmodels_id.jsonmap != "operations") {
    var i = options_listGrid_colmodels_id.jsonmap.indexOf(".");
    options_listGrid_coljsonmaps.push(i > 0 ? options_listGrid_colmodels_id.jsonmap.substring(0,i) : options_listGrid_colmodels_id.jsonmap);
}

<!-- 相似列JS省略 -->
	var options_listGrid_colmodels_born = {};
options_listGrid_colmodels_born.name = "born";
options_listGrid_colmodels_born.jsonmap = "born";
options_listGrid_colmodels_born.align = "center";
    options_listGrid_colmodels_born.title = true;
    options_listGrid_colmodels_born.formatoptions = {};
    options_listGrid_colmodels_born.editable = false;
    options_listGrid_colmodels_born.search = true;
    options_listGrid_colmodels_born.sortable = true;
    options_listGrid_colmodels_born.resizable = true;
    	options_listGrid_mergeRowCols.push(options_listGrid_colnames.length + 1 );
options_listGrid_colnames.push("出生日期");
options_listGrid_colmodels.push(options_listGrid_colmodels_born);
if(options_listGrid_colmodels_born.jsonmap != "operations") {
    var i = options_listGrid_colmodels_born.jsonmap.indexOf(".");
    options_listGrid_coljsonmaps.push(i > 0 ? options_listGrid_colmodels_born.jsonmap.substring(0,i) : options_listGrid_colmodels_born.jsonmap);
}

	var options_listGrid_colmodels_operations = {
    name : "operations",
    jsonmap : "operations"
};
    options_listGrid_colmodels_operations.title = true;
    options_listGrid_colmodels_operations.formatoptions = {};
    options_listGrid_colmodels_operations.formatter = "operations";
    options_listGrid_colmodels_operations.editable = false;
    options_listGrid_colmodels_operations.search = false;
    options_listGrid_colmodels_operations.sortable = false;
    options_listGrid_colmodels_operations.resizable = true;

<!-- 省略ajax访问代码 -->

</script>








 

扫描二维码关注公众号,回复: 2743932 查看本文章

出生年龄这一列配置了merge属性。在为colnames对象push元素前为MergeRowCols对象push当前列的列值,采用了一个小策略。

options_listGrid_mergeRowCols.push(options_listGrid_colnames.length );

options_listGrid_colnames.push("出生日期");

通过为mergeRowCols对象push进当前colnames.length属性,在给colnames push出生日期,在mergeRowCols对象中存的length数值,正好就为出生日期所在列值

而配置rownumber=“true”后,当前列左侧会加一列序号列,导致为mergeRowCols 对象push 的colname.length值不在是当前出生年龄的列号,而是前一列的列号

所以需要在push 方法内传的length值需要+1

底层原理如下:

底层mergeRowCols传length

options_${escapedGridId}_mergeRowCols.push(options_${escapedGridId}_colnames.length );

在jquery.grid.struts2.js文件中根据mergeRowCols值合并相邻行

 

所以解决方法如下:

在Grid.java文件中。利用ValueStack值栈将rownumbers属性使用set方法存入值栈中,变量驼峰命名法命为rownumMerge以待使用·。(Grid.java用于获取freemark对象,为属性进行赋值操作)

Freemarker模板文件grid_column.ftl中,根据ValueStack中rownumMerge的值进行判断。rownumMerge为true执行if方法,否则执行else方法

具体逻辑代码截图

猜你喜欢

转载自blog.csdn.net/tpwulawula/article/details/81589412
今日推荐