jqGrid表格
jqgrid官方文档:https://blog.mn886.net/jqGrid/
1.css文件引用
<link rel="stylesheet" href="../static/plugins/jqgrid/v5.2.1/css/ui.jqgrid-bootstrap.css">
引用位置:在bootstrap.min.css之后,galaxy-1.0.0.min.css之前。
<link rel="stylesheet" href="../static/plugins/bootstrap/v3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="../static/plugins/jqgrid/v5.2.1/css/ui.jqgrid-bootstrap.css">
<link rel="stylesheet" href="../static/css/galaxy-1.0.0.min.css">
使用Thymeleaf模板引用css文件如下:
<link rel="stylesheet" th:href="@{/plugins/bootstrap/v3.3.7/css/bootstrap.min.css}">
<link rel="stylesheet" th:href="@{/plugins/jqgrid/v5.2.1/css/ui.jqgrid-bootstrap.css}">
<link rel="stylesheet" th:href="@{/css/galaxy-1.0.0.min.css}">
2.js文件引用
<!--语言包-->
<script src="../static/plugins/jqgrid/v5.2.1/js/i18n/grid.locale-zh_CN.js"></script>
<!--jqgrid 插件-->
<script src="../static/plugins/jqgrid/v5.2.1/js/jquery.jqGrid.min.js"></script>
引用位置:在jquery-3.3.1.min.js之后,common-1.0.0-min.js之前。
<script src="../static/js/jquery-3.3.1.min.js"></script>
<script src="../static/plugins/jqgrid/v5.2.1/js/i18n/grid.locale-zh_CN.js"></script>
<script src="../static/plugins/jqgrid/v5.2.1/js/jquery.jqGrid.min.js"></script>
<script src="../static/js/common-1.0.0-min.js"></script>
使用Thymeleaf模板引用js文件如下:
<script th:src="@{/js/jquery-3.3.1.min.js}"></script>
<script th:src="@{/plugins/jqgrid/v5.2.1/js/i18n/grid.locale-zh_CN.js}"></script>
<script th:src="@{/plugins/jqgrid/v5.2.1/js/jquery.jqGrid.min.js}"></script>
<script th:src="@{/js/common-1.0.0-min.js}"></script>
3.在共通common.js中的封装方法
jqGrid默认初始化参数说明:
styleUI:表格皮肤为Bootstrap风格;
width:宽度100%;
contentType:请求数据类型;
datatype:从服务器端返回的数据类型;
prmNames:jqGrid将要向Server传递的默认参数名称;
viewrecords:是否要显示总记录数;
autowidth:如果为ture时,则当表格在首次被创建时会根据父元素比例重新调整表格宽度。如果父元素宽度改变,为了使表格宽度能够自动调整则需要实现函数:setGridWidth;
shrinkToFit:此属性用来说明当初始化列宽度时候的计算类型,如果为ture,则按比例初始化列宽度。如果为false,则列宽度使用colModel指定的宽度;
forceFit:当为ture时,调整列宽度不会改变表格的宽度。当shrinkToFit 为false时,此属性会被忽略;
height:表格默认高度,可以是数字,像素值或者百分比;
rowNum:每页显示记录条数,这个参数会被传递到后台;
rowList:一个下拉选择框,用来改变显示记录数,当选择时会覆盖rowNum参数传递到后台,默认选择列表为pageList;
multiselect:是否显示复选框,定义是否可以多选;
multiselectWidth : 复选框列的宽度,当multiselect为true时生效。
jqGrid事件说明:
onPaging:翻页事件
resizeStart:当开始改变一个列宽度时触发此事件,待整理;
resizeStop:当列宽度改变之后触发此事件,待整理;
gridComplete:当表格所有数据都加载完成而且其他的处理也都完成时触发此事件,排序,翻页同样也会触发此事件;
loadComplete: 当从服务器返回响应时执行,表格加载完成后执行
var pageList = [10, 20, 50, 100];
var noDataString = "<div class='no-data'>记录不存在</div>";
if ($.jgrid) {
    $.jgrid.defaults.styleUI = 'Bootstrap';
    $.jgrid.defaults.width = "100%";
    $.jgrid.defaults.contentType = "application/json; charset=UTF-8";
    $.jgrid.defaults.datatype = "json";
    $.jgrid.defaults.prmNames = {
        search: "search",
        rows: "limit"
    };
    $.jgrid.defaults.viewrecords = true;
    $.jgrid.defaults.autowidth = true;
    $.jgrid.defaults.shrinkToFit = true;
    $.jgrid.defaults.forceFit = true;
    $.jgrid.defaults.height = "auto";
    $.jgrid.defaults.rowNum = 10;
    $.jgrid.defaults.rowList = pageList;
    $.jgrid.defaults.multiselect = false;
    $.jgrid.defaults.onPaging = function (pageBtn) {
        
        var gridId = $(this).attr("id");
        var inputNumer = $("#input_"+gridId).find("ui-pg-input").value;
        var re_page = $("#"+gridId).getGridParam('page');
        var re_rowNum = $("#"+gridId).getGridParam('rowNum');
        var re_total = $("#"+gridId).getGridParam('lastpage'); 
        
        if (isNaN(inputNumer)) {
            $("#input_"+gridId).find("ui-pg-input").value = re_page;
        } else {
            inputNumer = inputNumer * 1;
            
            if (inputNumer > re_total) {
                $("#input_"+gridId).find("ui-pg-input").value = re_total;
            }
            if (inputNumer < 1) {
                $("#input_"+gridId).find("ui-pg-input").value = 1;
            }
        }
    }
    $.jgrid.defaults.resizeStart = function (event, index) {
        $("#gbox_"+$(this).attr("id")).find(".ui-jqgrid-bdiv").css('overflow-x', 'scroll');
    }
    $.jgrid.defaults.resizeStop = function (newwidth, index) {
        var gridId = $(this).attr("id");
        if (parseInt($("#gbox_"+gridId).find(".ui-jqgrid-htable").css('width').split('px')[0]) < parseInt($("#gbox_"+gridId).find(".ui-jqgrid-hdiv").css('width').split('px')[0])) {
            $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css('overflow-x', 'scroll');
        }
    }
    $.jgrid.defaults.gridComplete = function () {
    	loadJqgrid($(this));
    }
}
function loadJqgrid(e){
    
    
    var grid = $(e);
    var gridId = $(e).attr("id");
    
    var records = grid.getGridParam("records");
    
    if (records <= 0) {
      if ($("#gbox_"+gridId).find(".ui-jqgrid-bdiv .no-data").length === 0) {
          $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").append(noDataString);
          $("#"+gridId).setGridWidth($("#gbox_"+gridId).parent().width());
      }
    } else {
        $("#gbox_"+gridId).find(".no-data").remove();
    }
    
    $("#"+gridId).width($("#gbox_"+gridId).width() -1);
    $("#"+gridId).setGridWidth($("#gbox_"+gridId).parent().width());
    $("#gbox_"+gridId).find('.ui-jqgrid-bdiv').width($("#gbox_"+gridId).width() + 2);
    $("#"+gridId).width($("#gbox_"+gridId).width() - 1);
    
    if(grid.getGridParam().shrinkToFit){
        $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css('overflow', 'hidden !important');
    }else{
        $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css({'overflow-x':'scroll !important','overflow-y':'hidden !important'});
    }
    
    
    if("-1" != IEVersion()){
        $("#gbox_"+gridId).find('.ui-jqgrid-hbox').width($("#gbox_"+gridId).find('.ui-jqgrid-hdiv').width()+1);
    }
    
    if($("#gbox_"+gridId).width() <= $("#"+gridId).width()){
        $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css("overflow-x","scroll");
    }else{
        $("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css("overflow-x","hidden");
    }
}
4.使用方法
4.1.定义列显示名称数组
定义列显示名称数组colNames,注意:数组中列显示名称个数与colModel的数据个数必须一致。
var colNames = [ 'id','申请书ID', '申请书', '保存者', '保存日期', '关键字1', '关键字2', '关键字3', '关键字4', '关键字5', '关键字6', '关键字7' ];
   
4.2.定义表格列的属性
定义表格列的属性数组colModel,注意:数组中表格列的属性个数与colModel的数据个数必须一致。
colModel参数大全请参照jqgrid官方文档
var colModel = [{
      name: 'id',
      key: true,
      hidden: true
    },{
      index: 'applyID',
      name: 'applyID',
      align: 'left',
      width: 160,
      sortable: true,
      fixed:true
    }, {
      index: 'applyName',
      name: 'applyName',
      align: "left",
      width: 160,
      sortable: true,
      fixed:true
    }, {
      name: 'createUser',
      align: "left",
      width: 120,
      sortable: true,
      fixed:true
    }, {
      index: 'createDate',
      name: 'createDate',
      align: 'center',
      width: 160,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord01',
      name: 'keyWord01',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord02',
      name: 'keyWord02',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord03',
      name: 'keyWord03',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord04',
      name: 'keyWord04',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord05',
      name: 'keyWord05',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord06',
      name: 'keyWord06',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }, {
      index: 'keyWord07',
      name: 'keyWord07',
      align: "left",
      width: 100,
      sortable: true,
      fixed:true
    }];
4.3.初始化jqgrid
$("#jqGridTable").jqGrid({
	url: "https://www.easy-mock.com/mock/5ae968776e5d390eb9a0732d/example/getFuchsDemo",
	colNames: colNames,
	colModel: colModel,
	multiselect: true,
	pager: "#jqGridPager",
	loadComplete: function () {
	},
	onSelectAll: function (rowids, statue) {
	},
	onSelectRow: function (rowid, status) {
	}
});
4.4.jqgrid时间字段格式化
封装在common.js中用于jqgrid的表格时间格式化的方法如下:
function jqgridDateFmatter(cellvalue, options, rowObject){
	var dateFormatStr = "yyyy-MM-dd hh:mm:ss";
	
	if(options.colModel.formatoptions && options.colModel.formatoptions.dateFormat){
		dateFormatStr = options.colModel.formatoptions.dateFormat;
	}
	
    return $.Utils.dateFormatter(cellvalue,dateFormatStr);
}
使用方法:
1.在定义表格列的属性数组colModel中定义formatter:jqgridDateFmatter;
2.默认时间格式为"yyyy-MM-dd hh:mm:ss",有其他格式需求时,在定义表格列的属性数组colModel,传入自定义dateFormat。使用方法如下:
var colModel = [{
        index : 'createTime',
        name : 'createTime',
        align : "center",
        width : 120,
        sortable : true,
        formatter:jqgridDateFmatter,
        formatoptions:{dateFormat:"yyyy-MM-dd"}
    }];
例:
使用默认时间格式:
var colModel = [{
        index : 'modifyDatetime',
        name : 'modifyDatetime',
        align : "center",
        width : 120,
        sortable : true,
        formatter:jqgridDateFmatter
    }];
效果:
使用自定义时间格式:
var colModel = [{
        index : 'modifyDatetime',
        name : 'modifyDatetime',
        align : "center",
        width : 120,
        sortable : true,
        formatter:jqgridDateFmatter,
		formatoptions:{dateFormat:"yyyy-MM-dd"},
    }];
效果:
  
4.5.表格字段对齐规则
1.文本型、可变长度字符串左对齐,例如名称、普通文本型字段;
2.数值型右对齐,例如:金额、数字;
3.固定长度字符串居中,如性别、日期、状态、布尔类型。
例:
todo
  
4.6.表格横滚动条控制
与jqGrid表格是否有横滚动条的两个属性:
使用默认shrinkToFit为true的配置,此时表格内字段会自动分配列宽,不出现横滚动条。
代码:
````javascritpt
$("#jqGridTable").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	multiselect : true,//复选框
	pager : "#jqGridPager"
});
````
效果:
表格需要展示字段过多时,设置shrinkToFit为false,此时列宽会使用colModel指定的宽度,表格出现横滚动条。
代码:
````javascritpt
$("#jqGridTable").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	shrinkToFit:false,
	multiselect : true,//复选框
	pager : "#jqGridPager"
});
````
效果:
  
4.7.jqGrid加载完后自定义执行事件
 jqGrid加载完后会执行gridComplete中的loadJqgrid方法,主要进行一些表格宽度的设置及横滚动条的设置以及在IE下相关的兼容性设置,如业务页面有一些自定义的操作需要设置,则在jqGrid的loadComplete事件中写自定义代码,
 例:
 
 ```javascritpt
$("#jqGridTable01").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	shrinkToFit:false,
	multiselect : true,//复选框
	loadComplete : function () {
		//自定义事件
	}
}); 
如果自定义事件一定要写在gridComplete方法中,则在业务页面先调用loadJqgrid方法,loadJqgrid方法传入参数为jqGrid实例对象,再定义后续自定义操作,
例:
 ```javascritpt
$("#jqGridTable01").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	shrinkToFit:false,
	multiselect : true,//复选框
	gridComplete : function () {
		
		loadJqgrid($(this));
		//自定义事件
		//...
	}
}); 
  
 4.8.表格多选
设置初始化参数multiselect为true,表格出现多选框,multiselectWidth属性设置多选框宽度。
代码:
$("#jqGridTable").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	multiselect : true,
	multiselectWidth: 80,
	pager : "#jqGridPager"
});
 效果:
 
 获取多选数据的方法:
var ids = $("#jqGridTable").getGridParam("selarrrow");
4.9.点击全选按钮事件
multiselect为ture,且点击头部的checkbox时才会触发此事件。
$("#jqGridTable").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	multiselect : true,
	multiselectWidth: 80,
	pager : "#jqGridPager",
	onSelectAll: function(aRowids,status){ 
		var ids = $("#jqGridTable").getGridParam("selarrrow");
		
	}
});
4.10.表格单选
 1.jqgrid表格设置成单选使用beforeSelectRow事件和resetSelection方法;
 2.在loadComplete事件中将checkbox样式改成radio的样式,并且隐藏全选按钮。
 
 
 
 代码:
 
 ```javascritpt
 $("#jqGridTable").jqGrid({
	 url : "/security/user/userList",
	 colNames : colNames,
	 colModel : colModel,
	 shrinkToFit:false,
	 pager : "#jqGridPager",
	 multiselect : true,//复选框
	 multiselectWidth: 80,
	 beforeSelectRow: function(rowid, e){
	 	jQuery("#jqGridTable").jqGrid('resetSelection');
	 	return(true);
	 },
	 loadComplete:function(){
	 
		//替换checkbox样式成radioButton
		 $("input[type='checkbox']").each(function(){
			 $(this).attr("type","radio");
		 });
		//隐藏全选checkbox
		$("#cb_jqGridTable").attr("style","display:none");
	}
});
效果:

 **获取已选数据的方法:**
```javascript
var id=$("#jqGridTable").jqGrid('getGridParam','selrow');
//获得的id为一个字符串 例如:"300001"。
  
4.11.点击行事件
当选择行时触发此事件。
代码:
$("#jqGridTable").jqGrid({
	url : "/security/user/userList",
	colNames : colNames,
	colModel : colModel,
	multiselect : true,
	multiselectWidth: 80,
	pager : "#jqGridPager",
	onSelectRow: function(rowid, status){
		
		var rowData = $("#jqGridTable").getGridParam("getRowData","rowid");
	}
});
4.12.获取除当前单元格以外同一行数据的其他字段
jqgrid初始化时formatter或点击行时获取的整行数据为配置在colModel中的字段,如需要获取除显示以外的字段,在定义colModel时将该字段设置为 hidden : true,之后获取整行数据rowData则可以得到该字段。
colModel初始化:
var colModel = [ {
        name : 'id',
        key : true,
        hidden : true
    }, {
        index : 'modifyTimestamp',
        name : 'modifyTimestamp',
        hidden : true
    }];
	
  
4.13.点击名称打开详情页公共方法
在common.js中的公共方法:
function nameLinkFormatter(cellvalue, options, rowObject){
	var showEditDialogSetting = {};
	showEditDialogSetting.type = 2;
	showEditDialogSetting.readOnly = options.colModel.formatoptions.openObj.readOnly?options.colModel.formatoptions.openObj.readOnly:true;
	showEditDialogSetting.content = renderUrlPlaceholder(options.colModel.formatoptions.openObj.content,rowObject)?renderTip(options.colModel.formatoptions.openObj.content,rowObject):options.colModel.formatoptions.openObj.content+"?id="+rowObject.id;
	if(options.colModel.formatoptions.openObj.addParames){
		showEditDialogSetting.content+=options.colModel.formatoptions.openObj.addParames;
	}
	var title = cellvalue?cellvalue:'';
	return "<a href='javascript:void(0);' class='galaxy-option-link' onclick='showEditDialog(" + JSON.stringify(showEditDialogSetting) + ")'>" + title + "</a>";
}
openObj中对象属性:
1.title为打开页面的标题显示,必填;
2.content为打开页面的url,必填,
	url中传参使用占位符,在url后加上?{id}{name}可传多个字段,但多个字段必须包含在此行数据中,例如:/demo/user-add.html?{id}{name},如果不传则按照id查询详请页数据,此时content属性为/demo/user-add.html;
3.传参数据不在行数据中的情况:在openObj的属性addParames中拼接好参数传入,例如:formatoptions:{openObj:{title:"测试",content:"/security/user/user-add.html",addParames:"&test=123"}},
使用方法如下:
在colModel定义时定义
var colModel = [
	...
	{
        index : 'userName',
        name : 'userName',
        align : "left",
        width : 160,
        formatter:nameLinkFormatter,
        formatoptions:{openObj:{title:"测试",content:"/demo/user-add.html?{id}"}},
        sortable : true
    }
	...
];
页面显示效果如下:
点击名称效果如下:
注:页面中不能编辑在具体页面中自行控制
4.14.jqgrid 表格操作按钮渲染公共方法(打开页面修改)
// TODO
  
4.15.tab页签中的jqgrid
在标签页中使用jqgrid:
html代码:
<div class="layui-tab" lay-filter="process">
	<ul class="layui-tab-title">
		<li class="layui-this">tab01</li>
		<li>tab02</li>
	</ul>
	<div class="layui-tab-content">
		<div class="layui-tab-item layui-show">
			<table id="jqGridTable" class="list-data-table"></table>
			<div id="jqGridPager"></div>
		</div>
		<div class="layui-tab-item">
			<table id="jqGridTable01" class="list-data-table"></table>
		</div>
	</div>
</div>
JS中jqGrid初始化方法(jqGrid配置项省略):
$(function () {
	$("#jqGridTable").jqGrid({
		url : "/security/user/userList",
		colNames : colNames,
		colModel : colModel,
		shrinkToFit:false,
		multiselect : true,
		multiselectWidth: 80,
		pager : "#jqGridPager"
	});
	$("#jqGridTable01").jqGrid({
		url : "/security/user/userList",
		colNames : colNames,
		colModel : colModel,
		shrinkToFit:false,
		multiselect : true,
		multiselectWidth: 80
	});
});
*重要!!!!!!!!!!!!!!
在切换标签的监听事件中调用公共方法resizeJqGrid(),该方法用于重置jqGrid的表格宽度,如果不调用此方法,在标签切换后jqGrid将不会设置父容器的宽度。
在common.js中resizeJqGrid(),在浏览器窗口发生变化时也会触发此方法:
function resizeJqGrid(){
	
	var jqgrids = $('.list-data-table');
	if(jqgrids.length>0){
		for(var i = 0;i<jqgrids.length;i++){
			var gridId = $(jqgrids[i]).attr("id");
			if ($('#'+gridId).length > 0 && $("#gbox_"+ gridId).find('.ui-jqgrid-htable').length > 0) {
				
				if("-1" != IEVersion()){
					$("#gbox_"+ gridId).find('.ui-jqgrid-hbox').width($("#gbox_"+ gridId).find('.ui-jqgrid-hdiv').width()+1);
				}
				$('#'+gridId).setGridWidth($("#gbox_"+ gridId).parent().width());
				$('#'+gridId).width($("#gbox_"+ gridId).width() - 1);
			}
		}
		if($("#gbox_"+ gridId).width() < $('#'+gridId).width()){
			$("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css("overflow-x","scroll");
		}else{
			$("#gbox_"+gridId).find(".ui-jqgrid-bdiv").css("overflow-x","hidden");
		}
	}
}
标签切换监听事件:
layui.use('element', function () {
	var element = layui.element;
	
	element.on('tab(process)', function (data) {
		resizeJqGrid();
		
	});
});
  
4.16.jqgrid的行编辑
4.16.1 实时保存的行编辑
适用场景:
	1. 列表页,头表数据需要编辑时适用;
	2. 列表页,明细表数据需要编辑时适用,此可以取到已保存到头表id。
	
不适用的场景:
表单页在新增时头表数据未保存到数据库,id为空,此时实时保存正在编辑的明细数据关联不到头表数据id,所以实时保存不适用,请使用16.2jqGrid本地数据表格编辑。
参考文件:/demo/jqgrid-edit-demo.html
下面开始进行配置:
在colModel中将可以编辑的字段编辑属性editable设为true,保存所需的字段(包括隐藏字段)都需要配置该属性;
最后一列操作按钮formatter方法如下:
var colModel = [ 
	...
	{
		index : 'act',
		name : 'act',
		align : "center",
		width : 120,
		formatter:immediatelyJqGridEdit
	}];
在jqGrid实例中配置以下属性:
ajaxRowOptions:{
	contentType:"application/json; charset=UTF-8"
},
serializeRowData: function (postData){
	
	return JSON.stringify(postData);
}
	
完整配置:
var colNames = [ 'id','modifyTimestamp', '用户账户', '用户中文名','用户英文名', '语言代码','email','操作'];
var colModel = [ {
	name : 'id',
	key : true,
	editable : true,
	hidden : true
}, {
	index : 'modifyTimestamp',
	name : 'modifyTimestamp',
	editable : true,
	hidden : true
},{
	index : 'loginName',
	name : 'loginName',
	align : 'left',
	width : 160,
	editable : true,
	sortable : true
}, {
	index : 'userName',
	name : 'userName',
	align : "left",
	width : 160,
	editable : true,
	sortable : true
},{
	index : 'userNameEn',
	name : 'userNameEn',
	align : "left",
	width : 160,
	editable : true,
	sortable : true
}, {
	index : 'i18nCode',
	name : 'i18nCode',
	align : "left",
	width : 120,
	sortable : true
},{
	index : 'email',
	name : 'email',
	align : "left",
	width : 120,
	editable : true,
	sortable : true
},{
	index : 'act',
	name : 'act',
	align : "center",
	width : 120,
	formatter:immediatelyJqGridEdit
}];
$(function () {
	$("#jqGridTable").jqGrid({
		url : "/security/user/userList",
		colNames : colNames,
		colModel : colModel,
		multiselect : true,
		pager : "#jqGridPager",
		editurl :"/security/user/save",
		ajaxRowOptions:{
			contentType:"application/json; charset=UTF-8"
		},
		serializeRowData: function (postData){
			
			return JSON.stringify(postData);
		}
	});
});
  
4.16.2jqGrid本地数据表格编辑
适用场景:有保存按钮触发后续保存事件时适用。
参考文件:/demo/jqgrid-edit-local-demo.html
文件入口:
下面开始进行配置:
在colModel中将可以编辑的字段编辑属性editable设为true,保存所需的字段(包括隐藏字段)都需要配置该属性;
最后一列操作按钮formatter方法如下:
var colModel = [ 
	...
	{
    name : 'act',
    index : 'act',
    width : 50,
    align : "center",
    formatter:function(celval, options, rowdata){
        var act = '';
        deleteBtn = "<button class=\"btn jqgrid-btn-delete\" onclick=\"deleteItem('"+ rowdata.id +"')\">删除</button>";
        act =  deleteBtn;
        return act;
    }
}];
deleteItem方法如下:
function deleteItem(rowId){
    
    $("#jqGridTable").jqGrid("delRowData",rowId);
}
3.设置jqGrid属性datatype:"local",此属性必须得写;
4.设置jqGrid属性cellEdit : true,设置此属性后表格内单元格可以才可以编辑;
5.设置jqGrid属性cellsubmit : "clientArray",设置此属性后编辑完单元格数据保存在本地,否则会向后台发送数据请求;
6.beforeEditCell:单元格编辑前事件,在单元格编辑前获取将要编辑的iRow和iCol,避免在编辑完表格后鼠标未离开编辑的单元格直接按保存时获取到的表格中数据是一个dom对象,lastRow和lastcell是js文件开头定义的用于保存当前编辑行和单元格标志位的全局变量,初始值var lastRow = 1;var lastcell =1。
beforeEditCell:function(rowid,cellname,value,iRow,iCol){
	lastRow = iRow;
	lastcell = iCol;
},
7.afterSaveCell:单元格编辑完的事件,此时可以获取到编辑完的数据,可以做一些数据检查;
afterSaveCell : function(rowid,cellname,value,iRow,iCol){
	var rowData = $("#jqGridTable").jqGrid("getRowData");
	if(cellname == "dataCode"){
		var count = 0;
		for(var i=0;i<rowData.length;i++){
			if(value == rowData[i].dataCode){
				count++
			}
		}
		if(count>1){
			$.showWarningMsg("数据代码重复")
			$(".addRow").attr("disabled","disabled");
			$(".btn-delete").attr("disabled","disabled");
			$("#save").attr("disabled","disabled");
		}else{
			$(".addRow").removeAttr("disabled","disabled");
			$(".btn-delete").removeAttr("disabled","disabled");
			$("#save").removeAttr("disabled","disabled");
		}
	}
}
8.loadComplete:表格加载完后事件,在表格数据加完成后做的操作,下面方法在表格加载完后判断如果当前表格数据为空时,就插入一条新的空数据,并且设置已保存至数据库的数据dataCode字段不能编辑;
**注:必须注意的是,在插入数据时colModel中设置key:true的可以区分数据唯一性的字段不能为空,否则在编辑多行新增数据时行之间的数据会错乱,但是将数据传至后台时需设置id=null用于告诉后台接口这条数据是新增数据,所以此时在插入数据时,将id的前缀设置为字符串“temp”,在调用保存接口前,将会循环表中数据将id含有temp字符串的数据id设置为空。**
loadComplete : function () {
	
	var grid = $("#jqGridTable");
	
	var records = grid.getGridParam("records");
	if(records == 0 ){
		var tempId = "temp1"
		$("#jqGridTable").jqGrid("addRowData",tempId,{ "id":tempId,"dataCode":"10","dataShortDescription":"","dataLongDescription":"","remark":""},"");
	}
	
	var ids = $("#jqGridTable").jqGrid("getDataIDs");
	for(var i=0;i<records;i++){
		$("#jqGridTable").jqGrid('setCell', ids[i], 'dataCode', '', 'not-editable-cell');
	}
}
9.加载本地数据
在表格实例化后,将已经取得的表格数据dataTemp通过以下方法设置到表格中。
$("#jqGridTable").setGridParam({data: datTemp}).trigger('reloadGrid');
$("#jqGridTable").trigger('reloadGrid')为重新加载表格数据。
10.新增按钮绑定的方法
先将 “temp”+ getTempId() 作为新插入数据的临时id,然后将新的空对象通过addRowData插入表格最后一行。
*注:getTempId() 是在common.js中取临时id的方法。
function getTempId(){
	return Date.parse(new Date()) + rand(8);
}
function rand(m) {
	m = m > 16 ? 16 : m;
	var num = Math.random().toString();
	if(num.substr(num.length - m, 1) === '0') {
		return rand(m);
	}
	return num.substring(num.length - m);
}
这里再强调一次!!!!!!!!非常重要!!!
**注:必须注意的是,在插入数据时colModel中设置key:true的可以区分数据唯一性的字段不能为空,否则在编辑多行新增数据时行之间的数据会错乱,但是将数据传至后台时需设置id=null用于告诉后台接口这条数据是新增数据,所以此时在插入数据时,将id的前缀设置为字符串“temp”,在调用保存接口前,将会循环表中数据将id含有temp字符串的数据id设置为空。**
function add(){
	
	var newId = "temp" + getTempId();
	var dateObj = { "id":newId,"dataCode":"","dataShortDescription":"","dataLongDescription":"","remark":""};
	$("#jqGridTable").jqGrid("addRowData",newId,dateObj,"last");
}
10.保存方法
if(lastRow !== null && lastcell !== null ){
		$("#jqGridTable").jqGrid("saveCell",lastRow,lastcell);
	}
10.1以上代码在保存方法的开头一定要写!!!!避免在编辑完表格后鼠标未离开编辑的单元格直接按保存时获取到的表格中数据是一个dom对象,lastRow和lastcell是js文件开头定义的用于保存当前编辑行和单元格标志位的全局变量。
var rowData = $("#jqGridTable").jqGrid("getRowData");
	
	console.log(JSON.stringify(rowData));
	var submitData = [];
	for(var i=0;i<rowData.length;i++){
		var line = i+1;
		if(rowData[i].dataCode == "" 
		   || rowData[i].dataLongDescription == ""
		   || rowData[i].dataShortDescription == ""){
			if(rowData[i].dataCode == ""){
				$.showErrorMsg("第"+line+"行数值编码不能为空");
			}else if(rowData[i].dataShortDescription == ""){
				$.showErrorMsg("第"+line+"行数值名称不能为空");
			}else if(rowData[i].dataLongDescription == ""){
				$.showErrorMsg("第"+line+"行数值说明不能为空");
			}
			return false;
		}else{
			
			delete rowData[i].act;
			
			if(rowData[i].id.indexOf("temp") != -1){
				rowData[i].id = null;
			}
			submitData.push(rowData[i]);
		}
	}
10.2在写完10.1代码后获取全部表格数据进行数据检查,删除多余的操作列,
并将id包含“temp”字符串的新增数据id设为null,让后台区分出这是新增数据,再将表格数据插入新的数组。
需要重新设置id=null的原因:
已经第三次提到了!!!!!!请注意
**注:必须注意的是,在插入数据时colModel中设置key:true的可以区分数据唯一性的字段不能为空,否则在编辑多行新增数据时行之间的数据会错乱,但是将数据传至后台时需设置id=null用于告诉后台接口这条数据是新增数据,所以此时在插入数据时,将id的前缀设置为字符串“temp”,在调用保存接口前,将会循环表中数据将id含有temp字符串的数据id设置为空。**
10.3在完成前面操作后将表格数据设置为头表的属性,调用接口进行保存;
var data = {
	i18nCode : $("#i18nCode").val(),
	dataTypeCode : $("input[name='dataTypeCode']").val(),
	dataShortDescription : $("input[name='dataShortDescription']").val(),
	dataLongDescription : $("input[name='dataLongDescription']").val(),
	dictionaryDetailList : submitData
}
jqGrid表格初始化:
$("#jqGridTable").jqGrid({
	datatype:"local",
	colNames : colNames,
	colModel : colModel,
	multiselect : true,
	postData : {
		i18nCode : parent.i18nCodeSelected,
		dataTypeCode : parent.dataTypeCodeSelected
	},
	cellEdit : true,
	cellsubmit : "clientArray",
	beforeEditCell:function(rowid,cellname,value,iRow,iCol){
		console.log(iRow);
		lastRow = iRow;
		lastcell = iCol;
	},
	afterSaveCell : function(rowid,cellname,value,iRow,iCol){
		var rowData = $("#jqGridTable").jqGrid("getRowData");
		if(cellname == "dataCode"){
			var count = 0;
			for(var i=0;i<rowData.length;i++){
				if(value == rowData[i].dataCode){
					count++
				}
			}
			if(count>1){
				$.showWarningMsg("数据代码重复")
				$(".addRow").attr("disabled","disabled");
				$(".btn-delete").attr("disabled","disabled");
				$("#save").attr("disabled","disabled");
			}else{
				$(".addRow").removeAttr("disabled","disabled");
				$(".btn-delete").removeAttr("disabled","disabled");
				$("#save").removeAttr("disabled","disabled");
			}
		}
	},
	loadComplete : function () {
		
		var grid = $("#jqGridTable");
		
		var records = grid.getGridParam("records");
		if(records == 0 ){
			var tempId = "temp1"
			$("#jqGridTable").jqGrid("addRowData",tempId,{ "id":tempId,"dataCode":"10","dataShortDescription":"","dataLongDescription":"","remark":""},"");
		}
		
		var ids = $("#jqGridTable").jqGrid("getDataIDs");
		for(var i=0;i<records;i++){
			
		}
	}
});
$("#jqGridTable").setGridParam({data: datTemp}).trigger('reloadGrid');
全部代码太多,请查找工程中html文件参考
function save(){
	if(lastRow !== null && lastcell !== null ){
		$("#jqGridTable").jqGrid("saveCell",lastRow,lastcell);
	} 
	var rowData = $("#jqGridTable").jqGrid("getRowData");
	
	console.log(JSON.stringify(rowData));
	var submitData = [];
	for(var i=0;i<rowData.length;i++){
		var line = i+1;
		if(rowData[i].dataCode == "" 
		   || rowData[i].dataLongDescription == ""
		   || rowData[i].dataShortDescription == ""){
			if(rowData[i].dataCode == ""){
				$.showErrorMsg("第"+line+"行数值编码不能为空");
			}else if(rowData[i].dataShortDescription == ""){
				$.showErrorMsg("第"+line+"行数值名称不能为空");
			}else if(rowData[i].dataLongDescription == ""){
				$.showErrorMsg("第"+line+"行数值说明不能为空");
			}
			return false;
		}else{
			
			delete rowData[i].act;
			
			if(rowData[i].id.indexOf("temp") != -1){
				rowData[i].id = null;
			}
			submitData.push(rowData[i]);
		}
	}
	var data = {
		i18nCode : $("#i18nCode").val(),
		dataTypeCode : $("input[name='dataTypeCode']").val(),
		dataShortDescription : $("input[name='dataShortDescription']").val(),
		dataLongDescription : $("input[name='dataLongDescription']").val(),
		dictionaryDetailList : submitData
	}
	$.confirm({
		msg: "确认保存?",
		successCallback: function(e, a) {
			layer.closeAll()
			$.ajax({
				url : "/dictionary/saveDictionary",
				type : "POST",
				data : JSON.stringify(data),
				contentType: "application/json; charset=UTF-8",
				success: function(res) {
					parent.layer.closeAll();
					parent.parentCallback()
				}
			})
		}
	})
}
评论 (1 条评论)