【发布时间】:2016-02-24 12:15:10
【问题描述】:
我正在尝试将子网格添加到主网格的每一行。主网格填充得很好,但是当我单击行子网格的展开图标时没有填充。仅显示子网格列标题。
json 数据是一个嵌套的数据结构,在第一次加载网格时只获取一次。因此,当我单击网格展开图标时,我希望从显示父网格时获取的数据填充子网格。
当我使用 - 数据类型:“本地”时,会显示空子网格。
如果我设置数据类型:“json”,那么如果我单击展开图标,则会进行服务器端调用以获取数据。
那么如何使用已经获取的单个 json 数据显示子网格。谢谢
请在下面找到示例代码,
$(document).ready(function () {
"use strict";
var dataGrid = $('#itemList');
var firstClick = true;
$('#action').click(function () {
if (!firstClick) {
$("#itemList").setGridParam({datatype:'json'}).trigger("reloadGrid");
}
firstClick = false;
$("#itemList").jqGrid({
url: "${pageContext.request.contextPath}/billing/items",
datatype: "json",
mtype: "POST",
autowidth: true,
loadBeforeSend: function(jqXHR) {
jqXHR.setRequestHeader("X-CSRF-TOKEN", $("input[name='_csrf']").val());
},
colNames: ["Id", "Item Type", "Item Code"],
colModel: [
{ name: "id", width: 35, sorttype:"int", search: false, editable: false, key: true, hidden: true},
{ name: "itemType", width: 100},
{ name: "itemCode", width: 120}
],
maxHeight: 400,
cmTemplate: {editable: true},
pager: true,
rowNum: 50,
rowList: [50, 100, 150, 200],
rownumbers: true,
rownumWidth: 25,
sortname: "itemType",
sortorder: "asc",
forceClientSorting: true,
viewrecords: true,
height: '100%',
loadonce: true,
//gridview: true,
autoencode: true,
editurl: "${pageContext.request.contextPath}/billing/saveItem",
caption: "Item List",
subGrid: true,
subGridRowExpanded: function (subgridId, rowid) {
var subgridTableId = subgridId + "_t";
$("#" + subgridId).html("<table id='" + subgridTableId + "'></table>");
$("#" + subgridTableId).jqGrid({
datatype: "local",
data: $(this).jqGrid("getLocalRow", rowid).itemDetails,
colNames: ["Id", "Unit", "Stock", "Batch No.", "Expiry Date", "Quantity Per Unit", "Price"],
colModel: [
{ name: "id", width: 35, sorttype:"int", search: false, editable: false, key: true, hidden: true},
{ name: "unit", width: 70, search: false},
{ name: "availableQuantity", width: 55, search: false, formatter: "number",},
{ name: "batchNumber", width: 80, search: false},
{ name: "expiryDate", width: 80, search: false, sorttype: "date", formatoptions: {srcformat:'d/m/Y', newformat:'d/m/Y'}},
{ name: "quantityPerUnit", width: 80, search: false, formatter: "number"},
{ name: "price", width: 55, search: false, formatter: "number"}
],
height: "100%",
rowNum: 10,
idPrefix: "s_" + rowid + "_",
cmTemplate: {editable: true},
editurl: "${pageContext.request.contextPath}/billing/saveItem"
});
}
}).navGrid({add:false,edit:false,del:true});
$("#itemList").jqGrid('filterToolbar', {autoSearch: true, stringResult: true, searchOnEnter: false, defaultSearch: 'cn'});
$("#itemList").jqGrid('gridResize', { minWidth: 450, minHeight: 150 });
});
示例 json 数据:-
[{"id":1,"itemCode":"Omez","itemType":"Medicine","itemDesc":"Omez for acidity","itemDetails":[{"id":1,"batchNumber":"batch1","expiryDate":"01/06/2018","unit":"bottle","subUnit":"tablet","availableQuantity":120.0,"quantityPerUnit":60.0,"price":122.0}]}]
【问题讨论】:
-
你使用
$(this).jqGrid("getLocalRow", rowid).itemDetails。每一行数据中是否包含itemDetails属性(从"${pageContext.request.contextPath}/billing/items"返回)?您使用forceClientSorting: true和maxHeight: 400选项。你用free jqGrid吗?在这种情况下,您应该在问题中添加free-jqgrid标记以及jqgrid。您使用隐藏列name: "id"。您是否需要稍后向用户显示该列?如果没有,那么您可以删除该列。firstClick和#action是什么意思? -
你好奥列格,是的,我使用免费的 jqGrid。 itemDetails 属性包含在每一行数据中。 'id' 列是隐藏的,因为我想将其用作隐藏变量,以便在我编辑行时将其发送到服务器。正在使用“firstClick”变量,以便在用户点击“操作”按钮时仅加载一次网格。并且在随后点击“动作”网格时,将使用“触发器(“reloadGrid”)”重新加载
-
我已将示例 json 数据添加到问题中。谢谢
标签: javascript jquery json jqgrid free-jqgrid