Lý do hạn chế một mức độ của nhóm tiêu đề trong jqGrid tồn tại vì jqGrid cung cấp nhiều hơn như chỉ hiển thị tiêu đề. Bạn có thể thấy trên ví dụ về được tạo cho the answer rằng các tiêu đề cột sau khi nhóm có thể nhấp (để sắp xếp theo cột) và có thể thay đổi kích thước (bằng cách kéo & thả trên dấu phân tách giữa các tiêu đề cột). Nếu bạn sử dụng tùy chọn titleText
của setGroupHeaders
, bạn có thể bao gồm các đoạn HTML, phần tử bao gồm <table>
, trong tiêu đề cột. Nó cho bạn khả năng hiển thị các tiêu đề mức milti. Người ta có thể bao gồm resizable: false
để từ chối thay đổi kích thước hoặc người ta có thể viết bộ xử lý tùy chỉnh resizeStop
nào thay đổi kích thước các cột trong bảng được thêm bởi titleText
tùy chọn setGroupHeaders
.
Tất cả những gì tôi đã mô tả ở trên lý thuyết âm thanh. Vì vậy, tôi đã viết the small demo thể hiện cách tiếp cận này. Nó hiển thị lưới sau
Bản demo được viết không phải cho các trường hợp thông thường, nhưng rõ ràng là người ta có thể sử dụng nó làm cơ sở để giải pháp phổ biến hơn. Trong bất kỳ cách nào tôi hy vọng rằng bạn có thể thay đổi nó vào bất kỳ lưới đa cấp của bạn.
Các bộ phận quan trọng nhất của bản demo, bạn sẽ tìm thấy bên dưới:
var grid = $("#list"),
setHeaderWidth = function() {
var $self = $(this),
colModel = $self.jqGrid("getGridParam", "colModel"),
cmByName = {},
ths = this.grid.headers, // array with column headers
cm,
i,
l = colModel.length;
// save width of every column header in cmByName map
// to make easy access there by name
for (i = 0; i < l; i++) {
cm = colModel[i];
cmByName[cm.name] = $(ths[i].el).outerWidth();
}
// resize headers of additional columns based on the size of
// the columns below the header
$("#h1").width(cmByName.amount + cmByName.tax + cmByName.total - 1);
$("#h2").width(cmByName.closed + cmByName.ship_via - 1);
};
grid.jqGrid({
...
colModel: [
{name: "id", width: 65, align: "center", sorttype: "int", hidden: true},
{name: "invdate", width: 80, align: "center", sorttype: "date",
formatter: "date", formatoptions: {newformat: "d-M-Y"}, datefmt: "d-M-Y"},
{name: "name", width: 70},
{name: "amount", width: 75, formatter: "number", sorttype: "number", align: "right"},
{name: "tax", width: 55, formatter: "number", sorttype: "number", align: "right"},
{name: "total", width: 65, formatter: "number", sorttype: "number", align: "right"},
{name: "closed", width: 75, align: "center", formatter: "checkbox",
edittype: "checkbox", editoptions: {value: "Yes:No", defaultValue: "Yes"}},
{name: "ship_via", width: 100, align: "center", formatter: "select",
edittype: "select", editoptions: {value: "FE:FedEx;TN:TNT;IN:Intim", defaultValue: "IN"}},
{name: "note", width: 70, sortable: false}
],
resizeStop: function() {
// see https://stackoverflow.com/a/9599685/315935
var $self = $(this),
shrinkToFit = $self.jqGrid("getGridParam", "shrinkToFit");
$self.jqGrid("setGridWidth", this.grid.newWidth, shrinkToFit);
setHeaderWidth.call(this);
}
});
grid.jqGrid ("navGrid", "#pager",
{edit: false, add: false, del: false, refresh: true, view: false},
{}, {}, {}, {multipleSearch: true, overlay: false});
grid.jqGrid("setGroupHeaders", {
useColSpanStyle: true,
groupHeaders: [{
startColumnName: "amount",
numberOfColumns: 5,
titleText:
'<table style="width:100%;border-spacing:0px;">' +
'<tr><td id="h0" colspan="2"><em>Details</em></td></tr>' +
'<tr>' +
'<td id="h1">Price</td>' +
'<td id="h2">Shiping</td>' +
'</tr>' +
'</table>'
}]
});
$("th[title=DetailsPriceShiping]").removeAttr("title");
$("#h0").css({
borderBottomWidth: "1px",
borderBottomColor: "#c5dbec", // the color from jQuery UI which you use
borderBottomStyle: "solid",
padding: "4px 0 6px 0"
});
$("#h1").css({
borderRightWidth: "1px",
borderRightColor: "#c5dbec", // the color from jQuery UI which you use
borderRightStyle: "solid",
padding: "4px 0 4px 0"
});
$("#h2").css({
padding: "4px 0 4px 0"
});
setHeaderWidth.call(grid[0]);
CẬP NHẬT: Nhiều mã sau đó của setGroupHeaders
cho phép nhiều cuộc gọi của setGroupHeaders
trên lưới tương tự. Trong cách người ta có thể tạo ra các tiêu đề đa cấp. jqPivot sử dụng tính năng này (xem the wiki).
Đây là câu trả lời hay hơn. Cảm ơn bạn đã thêm nó! –
@ThomasMondelli: Bạn đã thử nghiệm mã trên chưa? Là kết quả của [demo] (http://www.ok-soft-gmbh.com/jqGrid/MultiLevelHeaders.htm) những gì bạn muốn? – Oleg
Có, tôi đã hoàn thành một trường hợp thử nghiệm nhỏ và nó hoạt động như mô tả. Bởi vì nó sử dụng chức năng của jqGrid, nó là một cách đơn giản hơn nhiều để làm điều đó và kết quả tốt hơn phù hợp với phần còn lại của bảng. –