1. 程式人生 > >jqGrid 條件編輯、條件樣式、自定義錯誤驗證處理

jqGrid 條件編輯、條件樣式、自定義錯誤驗證處理

  可以利用jqGrid的isCellEditable函式實現表格行或單元格的條件編輯,利用colMode的formatter實現表格行或單元格的條件樣式,重寫info_dialog實現驗證錯誤資訊自定義顯示。一個DEMO,看看具體如何實現。

1、頁面截圖

在這裡插入圖片描述

2、頁面程式碼

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>jggrid-單元格條件編輯</title>
	<link rel="stylesheet" href
="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" /> <link rel="stylesheet" href="https://cdn.bootcss.com/jqueryui/1.11.0/jquery-ui.min.css" /> <link rel="stylesheet" href="https://js.cybozu.cn/jqgrid/v5.3.1/css/ui.jqgrid.css"
/>
<script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> <script src="https://js.cybozu.cn/jqgrid/v5.3.1/js/jquery.jqGrid.min.js"></script> <script src="https://js.cybozu.cn/jqgrid/v5.3.1/js/i18n/grid.locale-en.js"></script> </head> <body> <div
class="page-content container">
<div class="page-head" style="padding: 15px 0"> <!-- page-head --> <button type="button" class="btn btn-sm" onclick="getBills()">載入資料</button> </div><!-- page-head --> <div class="page-body"> <!-- page-body --> <div class="panel panel-default" id="panel-orders"> <table id="orders"></table> </div> </div> </div> <script type="text/javascript"> function getBills() { var rowCount = 20; var data = []; for (var i = 0; i < rowCount; i ++) { data.push({ sid: i, bill_id: i, bill_detail: i, goods_id: i, unit_id: i, package_id: i, ref_detail: i, goods_no: i + 1, goods_name: '零件名稱' + rowCount + i, car_type_name: '車型' + rowCount + i, package_name: '包裝器具' + rowCount + i, unit: i%2==0 ? '件' : '箱', snp: 0.89, box_count: rowCount + i, total_count: rowCount + i, goods_count: rowCount + i, out_count: rowCount + i, bill_no: 'BN0000000' + i, }) } $("#orders").jqGrid("clearGridData"); $("#orders").jqGrid('setGridParam',{data: data || []}).trigger('reloadGrid'); } function outCountFormatter(data, options, row) { return (data < 22) ? "<span style='color:red'>" + data + "</span>" : data; } function totalCountRules(value, colname) { if(value != parseFloat(value) || value < 10) { return [false, colname + "必須為數值, >=10!"]; } return [true, ""]; } $(function() { $("#orders").jqGrid({ colModel: [ {label: "零件號", name: "goods_no", width: 60}, {label: "零件名稱", name: "goods_name", width: 180}, {label: "車型", name: "car_type_name", width: 70}, {label: "包裝器具", name: "package_name", width: 70}, {label: "單位", name: "unit", width: 60}, {label: "裝箱率", name: "snp", width: 50, sorttype: "number"}, {label: "箱數", name: "box_count", width: 40, editable:true, sorttype: "number"}, {label: "需求總數", name: "total_count", width: 70, editable:true, editrules:{custom:true, custom_func: totalCountRules}, sorttype: "number"}, {label: "需求數量", name: "goods_count", width: 70,}, {label: "出庫數量", name: "out_count", width: 70, formatter: outCountFormatter, sorttype: "number"}, {label: "訂單號", name: "bill_no", width: 120}, ], datatype: 'local', rownumbers: true, height: 300, rowNum: 1000, cellEdit: true, cellsubmit: 'clientArray', isCellEditable : function(cellname, iRow, iCol){ // 設定某一行是否允許編輯 var rows = $("#orders").jqGrid("getRowData"); // console.log(rows[iRow - 1]); return (rows[iRow - 1]['unit'] == "箱") && (cellname!='box_count' || cellname=='box_count' && rows[iRow - 1]['car_type_name'] == '車型501'); },gridComplete: function() { var rowIds = $("#orders").jqGrid("getDataIDs"); for(var i = 0, l = rowIds.length; i<l; i++) { var rowData = $("#orders").jqGrid("getRowData", rowIds[i]); if(rowData && rowData.unit == '箱') { $("#" + rowIds[i]).css("background", "gray"); } } } }); $.jgrid && ($.jgrid.info_dialog = function(caption, content,c_b, modalopt) { alert(content); }); }); </script> </body> </html>

3、程式碼說明

表格行或單元格條件編輯:
表格構建時,實現isCellEditable函式。

function isCellEditable(cellname, iRow, iCol){
				// 設定某一行是否允許編輯
	            var rows = $("#orders").jqGrid("getRowData");
				// console.log(rows[iRow - 1]);
				return (rows[iRow - 1]['unit'] == "箱") 
					&& (cellname!='box_count' || cellname=='box_count' && rows[iRow - 1]['car_type_name'] == '車型501');
	        }

1)單位為“箱”的行可以編輯;
2)非box_count欄位,或box_count欄位 並且 car_type_name== '車型501’也可以編輯。

如案例所示:
1)第1、3行不可編輯,單位為件,不滿足可編輯要求;
2)第2行,箱數、需求總數都可以編輯;
3)第4行,箱數不可編輯,需求總數可以編輯;

條件樣式
條件樣式通常2種情形:單元格條件樣式、表格行條件樣式,兩者實現完全不同。

單元格條件樣式,可以用formatter,如案例的出庫數量:

{label: "出庫數量", name: "out_count", width: 70, formatter: outCountFormatter, sorttype: "number"},
function outCountFormatter(data, options, row) {
	return (data < 22) ? "<span style='color:red'>" + data + "</span>" : data;
}	// 出庫數<22紅色字顯示

表格行條件樣式:
1)表格構建時,註冊gridComplete事件處理處理函式,表格資料清空、載入完畢會呼叫gridComplete事件處理函式。
2)在gridComplete中遍歷表格行,設定tr的css,如:

gridComplete: function() {
	        	var rowIds = $("#orders").jqGrid("getDataIDs");
	        	for(var i = 0, l = rowIds.length; i<l; i++) {
	        		var rowData = $("#orders").jqGrid("getRowData", rowIds[i]);
	        		if(rowData && rowData.unit == '箱') {
	        			$("#" + rowIds[i]).css("background", "gray");
	        		}
	        	}
	        }

自定義錯誤資訊顯示
1)在colModel中設定編輯規則
{label: “出庫數量”, name: “out_count”, width: 70, formatter: outCountFormatter}

2)outCountFormatter自定義驗證函式實現,出庫數必須是數字,大於等於10

	function totalCountRules(value, colname) {
		if(value != parseFloat(value) || value < 10) {
			return [false, colname + "必須為數值, >=10!"];
		}
		return [true, ""];
	}

當出庫數,輸入5時,顯示jqgrid自帶錯誤資訊,如下圖所示。
在這裡插入圖片描述

重寫info_dialog實現自定義錯誤資訊顯示,如下:

$.jgrid && ($.jgrid.info_dialog = function(caption, content,c_b, modalopt) {
			alert(content);
		});

在這裡插入圖片描述