jqGrid 條件編輯、條件樣式、自定義錯誤驗證處理
阿新 • • 發佈:2019-01-07
可以利用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);
});