在jqGrid的官方文檔http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules中,對jqGrid的編輯總結了以下三種類型的編輯:
寫道
cell editing: 編輯一個Grid的cell
inline editing: 編輯同一row的幾個cell
form editing: 創建一個form表單在外部更新grid內容
inline editing: 編輯同一row的幾個cell
form editing: 創建一個form表單在外部更新grid內容
在jqGrid中主要通過以下colModel參數來實現:
- editable: true|false 表示該cell是否支持可編輯,默認為false。對hidden屬性默認不支持編輯,當然也可以通過其他方式來實現
- edittype:簡單說就是當前cell在編輯狀態下是按照哪種input類型,因為在編輯下會轉化為<input type="text/password..."../>,於是支持的輸入類型當然包括:'text', 'textarea', 'select', 'checkbox', 'password', 'button', 'image', 'file'還有custom,默認為text
- editoptions:一個數組用來設置edittype屬性,通過該屬性來限定input中各屬性的值,比如:
- edittype="text", editoptions: {size:10, maxlength: 15}
- edittype="textarea", editoptions: {rows:"2",cols:"10"}
- edittype="textarea",editoptions: { value:"Yes:No" }
- edittype="select",editoptions: { value: “FE:FedEx; IN:InTime; TN:TNT” }//對於多選的支持:editoptions: {multiple:true, size:3... }
- //當edittype為custom時需要有兩個函數,一個用來創建該元素(custom_element另外一個對其賦值(custom_value),如
- edittype:'custom', editoptions:{
- custom_element: function(value, options){
- },
- custom_value:function(elem, operation, value){
- }
- }
- editrules:用來校驗用戶輸入值,比如我們常見的長度、必填、email、數字等校驗。如editrules:{maxValue:20, required:true, number:true},提供了一系列常見的驗證格式,具體見http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules。這里舉例來描述一個custom實例
- editrules:{custom:true, custom_func: function(value, colname){
- if (value < 0 || value >20) {
- return [false,"Please enter value between 0 and 20"];
- }else{
- return [true,""];
- }
- }}
- formoptions:用於上面的form editing,用來對form表單排序或在表單前面或后面加上一個元素。如對必填在前面加上*號等。如果要使用該元素,推薦對所有editable的元素都加上該屬性
1、cell editing
是對一個grid的row中一個單獨的cell進行編輯,支持ajax和本地的方式修改,同時對cell的編輯支持事件主要是[Enter]已經上下左右等鼠標事件來觸發,同時還有對編輯事件本身,如beforeEditCell、afterEditCell等。
在cell編輯中,主要通過jqGrid的options參數來設置:
- {
- 'cellEdit' : true,
- 'cellsubmit' : 'remote|clientArray',
- 'cellurl' : '/url/to/handling/the/changed/cell/value'
- }
其實這個cellEdit限制挺多,如果cellEdit=true即支持celEdit時jqGrid的onSelectRow事件都不能使用。就我自己來說沒有在實際業務常見中使用,這里不再多說,具體見:
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:cell_editing
2、inlineEditing
當用戶在對grid的一行做選擇(如grid的onSelectRow、ondblClickRow事件觸發時),當前grid進入可編輯狀態。以下是一個例子,對一些常用的可編輯項做了說明
- var datas = [
- {"id":1, "name":"name1", "date":"2012-08-18 11:11:11", "price":123.1, "email":"abc@163.com", "amount":1123423, "gender":"1", "type":"0"},
- {"id":2, "name":"name2", "date":"2012-08-18 11:11:11", "price":1452.2, "email":"abc@163.com", "amount":12212321, "gender":"1", "type":"1"},
- {"id":3, "name":"name3", "date":"2012-08-18 11:11:11", "price":125454, "email":"abc@163.com", "amount":2345234, "gender":"0", "type":"0"},
- {"id":4, "name":"name4", "date":"2012-08-18 11:11:11", "price":23232.4, "email":"abc@163.com", "amount":2345234, "gender":"1", "type":"2"},
- {"id":5, "name":"name5", "date":"2012-08-18 11:11:11", "price":473454, "email":"abc@163.com", "amount":5234534, "gender":"0", "type":"0"},
- {"id":6, "name":"name6", "date":"2012-08-18 11:11:11", "price":34563, "email":"abc@163.com", "amount":2345342, "gender":"1", "type":"1"}
- ];
- colModel:[
- {name:'id', index:'id'},
- {name:'name', index:'name', editable:true, edittype:"text", editrules:{required: true},editoptions:{size:16, maxlength: 15}},
- {name:'date', index:'date', editable:true, edittype:"text", editrules:{date: true},editoptions:{ size: 10, maxlengh: 10,
- dataInit: function(element) {
- $(element).datepicker({dateFormat: 'yy-mm-dd'});
- }
- }},
- {name:'price', index:'price', editable:true, edittype:"text", editrules:{required: true, number: true}},
- {name:'email', index:'email', editable:true, edittype:"text", editrules:{required: true, email: true}},
- {name:'amount', index:'amount', editable:true, edittype:"text", editrules:{required: true, number: true, maxValue:20}},
- {name:'gender', index:'gender', editable:true, edittype:"checkbox", editrules:{value:"Yes:No"}},
- {name:'type', index:'type', editable:true, edittype:'select', formatter:'select', editoptions:{value:"0:現貨;1:可配貨;2:無貨"}}
- ],
以上是編輯的設置,主要包含了幾種可編輯的方式:
1、
edittype="text",並設置必填、size和maxlength的限制、email、number、maxValue等校驗,在編輯時將對數據的有效性進行校驗
2、 edittype="text",對datepicker控件的支持,需要引入jquery-ui和國際化jquery.ui.datepicker-zh-CN.js的支持
3、 edittype="checkbox",對cell中的值進行checkbox轉換,並設置默認值的設置
4、 edittype="select",配合formatter的使用,設置了可選擇的下拉列表editoptions:{value:"0:現貨;1:可配貨;2:無貨"}}
2、 edittype="text",對datepicker控件的支持,需要引入jquery-ui和國際化jquery.ui.datepicker-zh-CN.js的支持
3、 edittype="checkbox",對cell中的值進行checkbox轉換,並設置默認值的設置
4、 edittype="select",配合formatter的使用,設置了可選擇的下拉列表editoptions:{value:"0:現貨;1:可配貨;2:無貨"}}
下面在對gridRow的雙擊事件觸發編輯:
- ondblClickRow: function(id){
- if(id && id !== lastsel){
- var rowData = $("#jqGridId").jqGrid("getRowData", id);
- $('#jqGridId').jqGrid('restoreRow',lastsel);
- $('#jqGridId').jqGrid('editRow',id,{
- keys : true, //這里按[enter]保存
- url: s2web.appURL + "jq/save.action",
- mtype : "POST",
- restoreAfterError: true,
- extraparam: {
- "ware.id": rowData.id,
- "ware.warename": $("#"+id+"_name").val(),
- "ware.createDate": $("#"+id+"_date").val(),
- "ware.number": $("#"+id+"_amount").val(),
- "ware.valid": $("#"+id+"_type").val()
- },
- oneditfunc: function(rowid){
- console.log(rowid);
- },
- succesfunc: function(response){
- alert("save success");
- return true;
- },
- errorfunc: function(rowid, res){
- console.log(rowid);
- console.log(res);
- }
- });
- }
- }

這里用了innerEdit的editRow方法:
- jQuery("#grid_id").jqGrid('editRow',rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc,errorfunc, afterrestorefunc);
- jQuery("#grid_id").jqGrid('editRow',rowid, {
- "keys" : false,
- "oneditfunc" : null,
- "successfunc" : null,
- "url" : null,
- "extraparam" : {},
- "aftersavefunc" : null,
- "errorfunc": null,
- "afterrestorefunc" : null,
- "restoreAfterError" : true,
- "mtype" : "POST"
- });
這里對以上各個參數的意思做一個簡單的描述
- rowid:當前編輯的rowid
- succesfunc:如果定義了改函數,將會在請求成功調用后立即返回,該函數簽名包括server返回的數據。同時該函數需要返回tue/false
- url: 如果定義了改值,將會覆蓋jqGrid中的editurl(當然,如果沒有url和editurl是會報錯的)。如果url="clientArray" 那么就不會向server端觸發請求,可在后期手動調用修改
- extraparam:請求參數列表{name:value, name:value},將會append到requestData中向server端發送
- aftersavefunc:如果定義了改函數,將會在數據向server端保存后立即調用,該函數接受rowid、response參數。同樣如果是上面的url="clientArray"該函數同樣執行
- errorfunc:如果定義了改函數,將會在數據向server端保存后調用,該函數接受rowid、response參數
- afterrestorefunc:如果定義了改函數,將在restoreRow后調用,接受rowid作為參數
在
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing 中對於innerEdit主要有以下幾個方法:
寫道
editRow //在用戶出發edit事件時調用該方法
saveRow //用戶不需要調用該方法,在edit時會自動調用
restoreRow //回滾當前editRow
addRow //新增row
inlineNav
saveRow //用戶不需要調用該方法,在edit時會自動調用
restoreRow //回滾當前editRow
addRow //新增row
inlineNav
下面這個例子是對jqGrid新增一行並可編輯狀態:
- $("#addBtn").bind("click", function() {
- $("#jqGridId").jqGrid('addRow',{
- rowID : "new_row",
- initdata : {},
- position :"first",
- useDefValues : true,
- useFormatter : true,
- addRowParams : {extraparam:{
- }}
- });
- //當前新增id進入可編輯狀態
- $('#jqGridId').jqGrid('editRow','new_row',{
- keys : true, //這里按[enter]保存
- url: s2web.appURL + "jq/save.action",
- mtype : "POST",
- restoreAfterError: true,
- extraparam: {
- },
- oneditfunc: function(rowid){
- console.log(rowid);
- },
- succesfunc: function(response){
- alert("save success");
- return true;
- },
- errorfunc: function(rowid, res){
- console.log(rowid);
- console.log(res);
- }
- });
- });
3、FormEditing
支持彈出窗的形式對grid的數據查看、新增、編輯、刪除和查找,主要包含以下幾個方法:
查找:searchGrid
編輯:editGridRow:
調用方式如下:
支持彈出窗的形式對grid的數據查看、新增、編輯、刪除和查找,主要包含以下幾個方法:
查找:searchGrid
編輯:editGridRow:
調用方式如下:
- $("#grid_id").jqGrid('editGridRow', rowid, {properties} );
新增:editGridRow
- $("#grid_id")..jqGrid('editGridRow', "new", properties );
查看:viewGridRow
刪除: delGridRow
刪除: delGridRow
4、主要API
[轉自]http://mj4d.iteye.com/blog/1633462