jqGrid 三级层次结构子网格单元格验证
jqGrid three level hierarchy subgrid Cell validation
我有一个三级网格系统,产品 -> 类别 -> 项目,我在其中展开产品行以查看子网格类别,并在展开类别行时通过单元格的内联编辑获得项目网格行.现在,用户将需要在项目网格中输入信息。一旦用户进入编辑模式,我就会进行单元格验证,但可以选择在添加该行后根本不编辑该行。现在的挑战是我需要以这种方式验证整个网格结构。
1) 我们将有预定义数量的产品(产品 = 10)
2)预定义类别预产品数量(5个类别/产品)
3) 单元格非空单元格的任意数量的项目。
使用按钮 "validate" 我需要遍历整个网格系统并首先确认产品数量
2确认类别/产品的数量
第三次确认每个产品、类别数据的项目网格中没有空单元格。
希望有人能帮助我解决这个问题。
下面是我的网格系统
productGrid.jqGrid({
url : 'getList.php?ID=' + ID,
editurl : 'clientArray',
mtype : "GET",
datatype : "json",
page : 1,
regional : lang,
colNames : ['ID','product'],
colModel : [
{ name: 'ID', width: 25, hidden: true },
{ name: 'productID', key: true, editable: true, width: 20 },
],
loadonce : true,
autowidth : true,
//width: 525,
height : 500,
rowNum : 20,
subGrid : true, // set the subGrid property to true to show expand buttons for each row
subGridRowExpanded : showChildGrid, // javascript function that will take care of showing the child grid
subGridOptions : {
expandOnLoad: false, // expand all rows on load
plusicon: "fa fa-plus-circle",
minusicon: "fa fa-minus-circle",
openicon: "ui-icon-arrowreturn-1-e"
},
subGridBeforeExpand: function(divid, rowid) {
var expanded = jQuery("td.sgexpanded", "#progGrid")[0];
if(expanded) {
setTimeout(function(){
$(expanded).trigger("click");
}, 100);
}
},
shrinkToFit: true,
//altRows:true,
//altclass:'myAltRowClass',
sortorder: "asc",
hidegrid:false,
gridview: true,
pgbuttons: false, // disable page control like next, back button
pgtext: null,
viewrecords: true,
pager: progExerGridPager
}).navGrid(progExerGridPager, {edit: false, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav(progExerGridPager,
{edit: true, add: true, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
// the event handler on expanding parent row receives two parameters
// the ID of the grid tow and the primary key of the row subgrid_id
function showChildGrid(parentRowID, parentRowKey) {
var childGridID = parentRowID + "_t";
var childGridPagerID = parentRowKey + "_pager";
// send the parent row primary key to the server so that we know which grid to show
var childGridURL = 'getList.php?programID=' + programID +'&productID=' + parentRowKey;
// add a table and pager HTML elements to the parent grid row - we will render the child grid here
$('#' + parentRowID).append('<table id=' + childGridID + '></table><div id=' + childGridPagerID + ' class=scroll></div>');
$("#" + childGridID).jqGrid({
url: childGridURL,
editurl: 'clientArray',
mtype: "GET",
datatype: "json",
page: 1,
regional: lang,
caption : "Category " + parentRowKey + " of Product",
colNames: ['categ_id', 'category'],
colModel: [
{ name: 'categ_id', width: 75, hidden: true },
{ name: 'categoryID', key: true, width: 100, editable:true, editrules : { required: true, integer:true, minValue:1, maxValue:7}, },
],
loadonce : true,
autowidth : true,
//width : 500,
height: '100%',
subGrid: true, // set the subGrid property to true to show expand buttons for each row
subGridRowExpanded: showThirdLevelChildGrid, // javascript function that will take care of showing the child grid
subGridOptions : {
expandOnLoad: false, // expand all rows on load
plusicon: "fa fa-plus-circle",
minusicon: "fa fa-minus-circle",
openicon: "ui-icon-arrowreturn-1-e"
},
subGridBeforeExpand: function(divid, rowid) {
// #grid is the id of the grid
var expanded = jQuery("td.sgexpanded", "#" + childGridID )[0];
if(expanded) {
setTimeout(function(){
$(expanded).trigger("click");
}, 100);
}
},
shrinkToFit : true,
// altRows : true,
// altclass : 'myAltRowClass',
sortorder : "asc",
hidegrid : true,
gridview : true,
pgbuttons : false, // disable page control like next, back button
pgtext : null,
viewrecords : true,
pager: '#' + childGridPagerID
}).navGrid('#' + childGridPagerID, {edit: false, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav('#' + childGridPagerID,
{edit: true, add: true, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
}
// the event handler on expanding parent row receives two parameters
// the ID of the grid tow and the primary key of the row
// custom mask definition to allo X in the tempo
//$.mask.definitions['x']='[x-9]';
function showThirdLevelChildGrid(parentRowID, parentRowKey) {
var childGridID = parentRowID + "_table";
var childGridPagerID = parentRowID + "_pager";
var rowID = parentRowID.split('_');
var productID = rowID[1];
// send the parent row primary key to the server so that we know which grid to show
var childGridURL = 'getList.php?programID=' + programID + '&productID=' + productID + '&categoryID=' + parentRowKey;
// add a table and pager HTML elements to the parent grid row - we will render the child grid here
$('#' + parentRowID).append('<table id=' + childGridID + '></table><div id=' + childGridPagerID + ' class=scroll></div>');
$("#" + childGridID).jqGrid({
url: childGridURL,
editurl: 'clientArray',
mtype: "GET",
datatype: "json",
caption : "Item " + parentRowKey + " Product/Category",
regional: lang,
colNames: ['ItemID', 'Name', 'Quantity', 'Range', 'Rate', 'Inventory', 'Type', 'Note'],
colModel: [
{ name: 'ID', key: true, width: 75, hidden: true },
{ name: 'Name', width: 200, editable: false, editrules : { required: true},
cellattr: function (rowId, tv, rawObject, cm, rdata) {
return 'style="white-space: normal;'
},
},
{ name: 'Quantity', width: 70, align: 'center', editable: true, editrules : { required: true, integer:true}},
{ name: 'Range', width: 80, align: 'center', editable: true, edittype:'text', editrules : { required: true},
editoptions: {
dataInit: function (elem) {
$(elem).mask("99~99",{
placeholder :" ",
completed :function(){
// validate the ranges
var repRange = this.val().split("~"),
fromRange = repRange[0],
toRange = repRange[1];
if (fromRange > toRange) {
alert("the lower range cannot be higher than the High range");
// clear the box
this.val("");
}
}
});
}
}
},
{ name: 'Rate', width: 100, align: 'center', editable: true, edittype:'text', editrules : { required: true},
editoptions: {
dataInit: function (elem) {
$(elem).mask("9-9",{
placeholder :" ",
});
}
}
},
{ name: 'Inventory', width: 80, align: 'center', editable: true, editrules : { required: true, integer:true}},
{ name: 'Type', width: 100, align: 'center', editable: true, editrules : { required: true}, edittype: "select", editoptions : {value: exerciseType}},
{ name: 'Note', width: 100, editable: true, edittype:"textarea", editoptions:{rows:"5",cols:"45"}, hidden:true, editrules:{edithidden:true}},
//}
],
recreateForm: true,
loadonce : true,
//onSelectRow : editRow,
autowidth : true,
//width : 'auto',
height : '100%',
shrinkToFit : true,
// altRows : true,
// altclass : 'myAltRowClass',
sortorder : "asc",
hidegrid : false,
gridview : true,
pgbuttons : false, // disable page control like next, back button
pgtext : null,
rownumbers : true, // show row numbers
rownumWidth : 20, // the width of the row numbers columns
viewrecords : true,
pager : "#" + childGridPagerID
}).navGrid('#' + childGridPagerID, {edit: true, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav('#' + childGridPagerID,
{edit: true, add: false, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
所以我进行了服务器端验证并将结果显示在网格之外。获得更多控制和更容易实施,特别是在单元格验证部分。
我有一个三级网格系统,产品 -> 类别 -> 项目,我在其中展开产品行以查看子网格类别,并在展开类别行时通过单元格的内联编辑获得项目网格行.现在,用户将需要在项目网格中输入信息。一旦用户进入编辑模式,我就会进行单元格验证,但可以选择在添加该行后根本不编辑该行。现在的挑战是我需要以这种方式验证整个网格结构。 1) 我们将有预定义数量的产品(产品 = 10) 2)预定义类别预产品数量(5个类别/产品) 3) 单元格非空单元格的任意数量的项目。
使用按钮 "validate" 我需要遍历整个网格系统并首先确认产品数量 2确认类别/产品的数量 第三次确认每个产品、类别数据的项目网格中没有空单元格。 希望有人能帮助我解决这个问题。 下面是我的网格系统
productGrid.jqGrid({
url : 'getList.php?ID=' + ID,
editurl : 'clientArray',
mtype : "GET",
datatype : "json",
page : 1,
regional : lang,
colNames : ['ID','product'],
colModel : [
{ name: 'ID', width: 25, hidden: true },
{ name: 'productID', key: true, editable: true, width: 20 },
],
loadonce : true,
autowidth : true,
//width: 525,
height : 500,
rowNum : 20,
subGrid : true, // set the subGrid property to true to show expand buttons for each row
subGridRowExpanded : showChildGrid, // javascript function that will take care of showing the child grid
subGridOptions : {
expandOnLoad: false, // expand all rows on load
plusicon: "fa fa-plus-circle",
minusicon: "fa fa-minus-circle",
openicon: "ui-icon-arrowreturn-1-e"
},
subGridBeforeExpand: function(divid, rowid) {
var expanded = jQuery("td.sgexpanded", "#progGrid")[0];
if(expanded) {
setTimeout(function(){
$(expanded).trigger("click");
}, 100);
}
},
shrinkToFit: true,
//altRows:true,
//altclass:'myAltRowClass',
sortorder: "asc",
hidegrid:false,
gridview: true,
pgbuttons: false, // disable page control like next, back button
pgtext: null,
viewrecords: true,
pager: progExerGridPager
}).navGrid(progExerGridPager, {edit: false, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav(progExerGridPager,
{edit: true, add: true, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
// the event handler on expanding parent row receives two parameters
// the ID of the grid tow and the primary key of the row subgrid_id
function showChildGrid(parentRowID, parentRowKey) {
var childGridID = parentRowID + "_t";
var childGridPagerID = parentRowKey + "_pager";
// send the parent row primary key to the server so that we know which grid to show
var childGridURL = 'getList.php?programID=' + programID +'&productID=' + parentRowKey;
// add a table and pager HTML elements to the parent grid row - we will render the child grid here
$('#' + parentRowID).append('<table id=' + childGridID + '></table><div id=' + childGridPagerID + ' class=scroll></div>');
$("#" + childGridID).jqGrid({
url: childGridURL,
editurl: 'clientArray',
mtype: "GET",
datatype: "json",
page: 1,
regional: lang,
caption : "Category " + parentRowKey + " of Product",
colNames: ['categ_id', 'category'],
colModel: [
{ name: 'categ_id', width: 75, hidden: true },
{ name: 'categoryID', key: true, width: 100, editable:true, editrules : { required: true, integer:true, minValue:1, maxValue:7}, },
],
loadonce : true,
autowidth : true,
//width : 500,
height: '100%',
subGrid: true, // set the subGrid property to true to show expand buttons for each row
subGridRowExpanded: showThirdLevelChildGrid, // javascript function that will take care of showing the child grid
subGridOptions : {
expandOnLoad: false, // expand all rows on load
plusicon: "fa fa-plus-circle",
minusicon: "fa fa-minus-circle",
openicon: "ui-icon-arrowreturn-1-e"
},
subGridBeforeExpand: function(divid, rowid) {
// #grid is the id of the grid
var expanded = jQuery("td.sgexpanded", "#" + childGridID )[0];
if(expanded) {
setTimeout(function(){
$(expanded).trigger("click");
}, 100);
}
},
shrinkToFit : true,
// altRows : true,
// altclass : 'myAltRowClass',
sortorder : "asc",
hidegrid : true,
gridview : true,
pgbuttons : false, // disable page control like next, back button
pgtext : null,
viewrecords : true,
pager: '#' + childGridPagerID
}).navGrid('#' + childGridPagerID, {edit: false, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav('#' + childGridPagerID,
{edit: true, add: true, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
}
// the event handler on expanding parent row receives two parameters
// the ID of the grid tow and the primary key of the row
// custom mask definition to allo X in the tempo
//$.mask.definitions['x']='[x-9]';
function showThirdLevelChildGrid(parentRowID, parentRowKey) {
var childGridID = parentRowID + "_table";
var childGridPagerID = parentRowID + "_pager";
var rowID = parentRowID.split('_');
var productID = rowID[1];
// send the parent row primary key to the server so that we know which grid to show
var childGridURL = 'getList.php?programID=' + programID + '&productID=' + productID + '&categoryID=' + parentRowKey;
// add a table and pager HTML elements to the parent grid row - we will render the child grid here
$('#' + parentRowID).append('<table id=' + childGridID + '></table><div id=' + childGridPagerID + ' class=scroll></div>');
$("#" + childGridID).jqGrid({
url: childGridURL,
editurl: 'clientArray',
mtype: "GET",
datatype: "json",
caption : "Item " + parentRowKey + " Product/Category",
regional: lang,
colNames: ['ItemID', 'Name', 'Quantity', 'Range', 'Rate', 'Inventory', 'Type', 'Note'],
colModel: [
{ name: 'ID', key: true, width: 75, hidden: true },
{ name: 'Name', width: 200, editable: false, editrules : { required: true},
cellattr: function (rowId, tv, rawObject, cm, rdata) {
return 'style="white-space: normal;'
},
},
{ name: 'Quantity', width: 70, align: 'center', editable: true, editrules : { required: true, integer:true}},
{ name: 'Range', width: 80, align: 'center', editable: true, edittype:'text', editrules : { required: true},
editoptions: {
dataInit: function (elem) {
$(elem).mask("99~99",{
placeholder :" ",
completed :function(){
// validate the ranges
var repRange = this.val().split("~"),
fromRange = repRange[0],
toRange = repRange[1];
if (fromRange > toRange) {
alert("the lower range cannot be higher than the High range");
// clear the box
this.val("");
}
}
});
}
}
},
{ name: 'Rate', width: 100, align: 'center', editable: true, edittype:'text', editrules : { required: true},
editoptions: {
dataInit: function (elem) {
$(elem).mask("9-9",{
placeholder :" ",
});
}
}
},
{ name: 'Inventory', width: 80, align: 'center', editable: true, editrules : { required: true, integer:true}},
{ name: 'Type', width: 100, align: 'center', editable: true, editrules : { required: true}, edittype: "select", editoptions : {value: exerciseType}},
{ name: 'Note', width: 100, editable: true, edittype:"textarea", editoptions:{rows:"5",cols:"45"}, hidden:true, editrules:{edithidden:true}},
//}
],
recreateForm: true,
loadonce : true,
//onSelectRow : editRow,
autowidth : true,
//width : 'auto',
height : '100%',
shrinkToFit : true,
// altRows : true,
// altclass : 'myAltRowClass',
sortorder : "asc",
hidegrid : false,
gridview : true,
pgbuttons : false, // disable page control like next, back button
pgtext : null,
rownumbers : true, // show row numbers
rownumWidth : 20, // the width of the row numbers columns
viewrecords : true,
pager : "#" + childGridPagerID
}).navGrid('#' + childGridPagerID, {edit: true, add: false, del: false, refresh: true, view: false, search:false})
.inlineNav('#' + childGridPagerID,
{edit: true, add: false, del: true, cancel: true, refresh : true, editParams: {keys: true,}, addParams: {keys: true}
});
所以我进行了服务器端验证并将结果显示在网格之外。获得更多控制和更容易实施,特别是在单元格验证部分。