Jqgrid外掛實現單元格編輯,以及彈出選擇資料後賦值。
阿新 • • 發佈:2019-02-02
這段時間因為做了個erp系統,要求能實現表格內編輯資料儲存,於是採用了文件非常坑的jqgrid。
不多廢話,跳過前戲。
過程中遇到如下幾個坑:
1、儲存的時候最後編輯的行資料無法儲存;
2、自定義單元格中彈出一個選擇框的資料後,用setRowData賦值誤區。
好了,我先貼程式碼 然後再說話。
var g_jqgrid;
var g_lastrow;
var g_lastcol;
$(function () {
initJqTable();
});
function myelem(value, options) {
var rowid = options.rowId;
var html = '<div><input type="text"/>';
html += '<i class="icon-points" onclick=\'chooseProduct("' + rowid + '","' + options.id + '")\'></i></div>';
var a = $(html);
if (value) {
a.find('input').val(value);
}
return a.get(0);
}
function myvalue(elem, operation, value) {
if (operation === 'get') {
return $(elem).find('input').val() || '';
} else if (operation === 'set') {
$('input', elem).val(value);
}
}
function chooseProduct(rowid, elemId) {
var url = '{wb:U("xxxx")}';
G_openDialog({
url: url,
title: '物料選擇',
width: '90%',
height: '60%',
btns: ['確定', '取消'],
btnfunc: [doCheck]
});
function doCheck(index, layero) {
var iframeWin = G_getChildIframeByDom(layero);
var data = iframeWin.getRowData();
var newData = new Object();
newData.product_id = data.id;
newData.uom_id = data.uoms;
newData.uom_name = data.uoms_name;
newData.model = data.model_code;
$('#' + elemId).find('input').val(data.name);
g_jqgrid.jqGrid("setRowData", rowid, newData);
G_closeDialog(index);
}
}
function initJqTable() {
g_jqgrid = $("#table").jqGrid({
url: '{wb:U("xxx")}',
datatype: "json",
mtype: 'POST',
cellEdit: true,
cellsubmit: 'clientArray',
rowNum: 0,
postData: {
id: id
},
colNames: ['操作', 'ID', 'product_id', 'uom_id', '計劃單號', '產品名稱', '規格型號或圖號', '數量', '單位', '下單時間', '要求交貨時間', '來源', '來源單號'],
colModel: [
{
name: 'cz', index: 'cz', align: 'center',
formatter: function (cellvalue, options, rowObject) {
var str = '';
var rowId = options.rowId;
if(ac == 'add'){
str += '<button title="新增" type="button" class="wb-btn-add" onclick="addRow()"/>';
str += '<button title="刪除" type="button" class="wb-btn-del" onclick=\'delRow("' + rowId + '")\'/>';
}
return str;
}
},
{name: 'id', index: 'id', hidden: true},
{name: 'product_id', index: 'product_id', hidden: true},
{name: 'uom_id', index: 'uom_id', hidden: true},
{name: 'codes', index: 'codes'},
{
name: 'names', index: 'names', classes: 'cus-edit-td',
editable: true,
edittype: 'custom',
editoptions: {
custom_element: myelem,
custom_value: myvalue
}
},
{name: 'model', index: 'model'},
{name: 'qty', index: 'qty', editable: true, classes: 'cus-edit-td',},
{name: 'uom_name', index: 'uom_name'},
{
name: 'create_time', index: 'create_time',
formatter: function (cellvalue, options, rowObject) {
return moment().format('YYYY-MM-DD HH:mm:ss');
}
},
{
name: 'require_time', index: 'require_time', editable: true, classes: 'cus-edit-td',
editoptions: {
dataInit: function (e) {
initDate(e);
}
}
},
{
name: 'source', index: 'source',
formatter: function (cellvalue, options, rowObject) {
if (cellvalue == '0') {
return '';
}else{
// 待處理
return '';
}
}
},
{name: 'source_codes', index: 'source_codes'},
],
jsonReader: {
repeatitems: false
},
loadComplete: function () {
var datas = g_jqgrid.jqGrid('getDataIDs');
if (datas && datas.length == 0) {
g_jqgrid.jqGrid('addRowData', getRandomGridId(), {});
}
},
beforeEditCell: function (rowid, cellname, v, iRow, iCol) {
g_lastrow = iRow;
g_lastcol = iCol;
},
});
}
function addRow() {
g_jqgrid.jqGrid('addRowData', getRandomGridId(), {});
}
function delRow(jqid) {
// 判斷當前是否是最後一條記錄
var datas = g_jqgrid.jqGrid('getDataIDs');
if (datas && datas.length > 1) {
g_jqgrid.delRowData(jqid);
} else {
G_alertDialog('至少保留一條');
}
}
/**
* @Author CR
* @date 2017/4/17
* 儲存
*/
function save() {
// 獲取表格所有資料
g_jqgrid.jqGrid("saveCell", g_lastrow, g_lastcol);
var objDatas = g_jqgrid.jqGrid('getRowData');
var lindex = G_loadDialog();
var d = JSON.stringify(objDatas);
d = $.jgrid.htmlEncode(d);
$.ajax({
type: "POST",
data: {
ac:ac,
datas: d
},
url: '{wb:U("save")}',
error: function () {
G_closeDialog(lindex);
},
success: function (data) {
G_closeDialog(lindex);
if(data.rtnResult == 'success'){
G_msgDialog('儲存成功',function () {
location.href = '{wb:U("index")}';
})
}
}
});
}
首先,
var datas = g_jqgrid.jqGrid('getDataIDs');
if (datas && datas.length == 0) {
g_jqgrid.jqGrid('addRowData', getRandomGridId(), {});
}
上面這段程式碼是為了在進入新增頁面的時候自動新增出一行。
getRandomGridId()是我自定義的一個生成隨機id的方法。
beforeEditCell: function (rowid, cellname, v, iRow, iCol) {
g_lastrow = iRow;
g_lastcol = iCol;
},
上面這段程式碼是為了解決在點儲存的時候,最後編輯行的資料無法獲取到的問
題。
{
name: 'require_time', index: 'require_time', editable: true, classes: 'cus-edit-td',
editoptions: {
dataInit: function (e) {
initDate(e);
}
}
},
上面這部分程式碼是將我用的datepicker嵌入到單元格編輯中,initDate為自定義初始化日期外掛的方法。
{
name: 'names', index: 'names', classes: 'cus-edit-td',
editable: true,
edittype: 'custom',
editoptions: {
custom_element: myelem,
custom_value: myvalue
}
},
上面的程式碼就是繫結單元格自定義控制元件了。
自定義的控制元件程式碼如下:
function myelem(value, options) {
var rowid = options.rowId;
var html = '<div><input type="text"/>';
html += '<i class="icon-points" onclick=\'chooseProduct("' + rowid + '","' + options.id + '")\'></i></div>';
var a = $(html);
if (value) {
a.find('input').val(value);
}
return a.get(0);
}
function myvalue(elem, operation, value) {
if (operation === 'get') {
return $(elem).find('input').val() || '';
} else if (operation === 'set') {
$('input', elem).val(value);
}
}
function chooseProduct(rowid, elemId) {
var url = '{wb:U("xxxxxxx")}';
G_openDialog({
url: url,
title: '物料選擇',
width: '90%',
height: '60%',
btns: ['確定', '取消'],
btnfunc: [doCheck]
});
function doCheck(index, layero) {
var iframeWin = G_getChildIframeByDom(layero);
var data = iframeWin.getRowData();
var newData = new Object();
newData.product_id = data.id;
newData.uom_id = data.uoms;
newData.uom_name = data.uoms_name;
newData.model = data.model_code;
$('#' + elemId).find('input').val(data.name);
g_jqgrid.jqGrid("setRowData", rowid, newData);
G_closeDialog(index);
}
}
上面的程式碼實現的功能就是 定義了一個自定義的單元格編輯,點選後彈出資料選擇對話方塊,然後選擇一條資料,將資料寫入當前行。
具體效果看圖片: