jqGridで、行の結合をやってみます。
方法は2つあるようです。
注意点として、結合だけで、cssの調整はやっていません。
実際にはこのままだと、変なhoverがかかったりするなどします。

この怪しげなレシピは、「黒い砂漠」というゲーム内のレシピです。
コーディング
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jqGridのテスト</title>
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/jquery-ui-1.11.4/jquery-ui.min.css" rel="stylesheet" />
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/jqGrid/css/ui.jqgrid.css" rel="stylesheet" />
<script type="text/javascript" src="${pageContext.request.contextPath}/jqGrid/js/jquery-1.11.0.min.js" ></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/jqGrid/js/jquery.jqGrid.min.js" ></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/jqGrid/js/i18n/grid.locale-ja.js" ></script>
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/css/jqGridSample.css" rel="stylesheet" />
<script type="text/javascript" src="${pageContext.request.contextPath}/js/onload.js" ></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/grid.js" ></script>
</head>
<body>
<div id="grid-container">
<table id="jqGrid-tbl"></table>
</div>
</body>
<script type="text/javascript">
onload();
</script>
</html>
/*
* 画面ロード時の処理
*/
function onload() {
var recepiData = [
{
"dish":"ビール"
,"material":"穀物類"
,"quantity":5
,"effect":"労働者の行動力+2回復"
,attr: {"dish": {rowspan: "4"}, "effect": {rowspan: "4"}}
}, {
"dish":"ビール"
,"material":"砂糖"
,"quantity":1
,"effect":"労働者の行動力+2回復"
,attr: {"dish": {display: "none"}, "effect": {display: "none"}}
}, {
"dish":"ビール"
,"material":"料理用ミネラルウォーター"
,"quantity":6
,"effect":"労働者の行動力+2回復"
,attr: {"dish": {display: "none"}, "effect": {display: "none"}}
}, {
"dish":"ビール"
,"material":"発酵剤"
,"quantity":2
,"effect":"労働者の行動力+2回復"
,attr: {"dish": {display: "none"}, "effect": {display: "none"}}
}];
grid(recepiData);
}
データ側にrowspanとdisplayの設定値を持たせておきます。
連結したいのは料理列(dish)と効果列(effect)なので、この2つの設定値を書いておきます。
先頭はrowspan、それ以外はdisplay。
/*
* Grid生成
*/
attrSetting = function(rowId, val, rawObject, cm) {
var attr = rawObject.attr[cm.name];
var result = "";
if (attr.rowspan) {
result = ' rowspan=' + '"' + attr.rowspan + '"';
} else if (attr.display) {
result = ' style="display:' + attr.display + '"';
}
return result;
};
function grid(data) {
// 表タイトル部に表示する列名
var colNames = ["料理", "材料", "分量", "効果"];
// 列ごとの設定
var colModelSetting = [
{
// 料理列の設定
name : "dish", // 列の名前
index : "dish", // 列のインデックス
width : 150, // 列の幅
align : "left", // 文字寄せ
classes: "material_class", // クラス
cellattr: attrSetting
}, {
// 材料列の設定
name : "material",
index : "material",
width : 150,
align : "left",
classes: "material_class"
}, {
// 分量列の設定
name : "quantity",
index : "quantity",
width : 50,
align : "center",
classes: "material_class"
}, {
// 効果列の設定
name : "effect",
index : "effect",
width : 150,
align : "left",
classes: "material_class",
cellattr: attrSetting
}
];
// 表を削除
$("#grid-container").empty();
// tableタグを再挿入
$("#grid-container").append('<table id="jqGrid-tbl"></table>');
//テーブルの作成
$("#jqGrid-tbl").jqGrid({
data:data, // 表示したいデータ
datatype : "local", // データの種別
colNames : colNames, // 表タイトル部に表示する列名
colModel : colModelSetting, // 列ごとの設定
rowNum : 10, // 1ページに表示する行数
rowList : [1, 10, 20], // 変更可能な1ページ当たりの行数
caption : "レシピ", // ヘッダーのキャプション
height : 150, // 高さ
width : 700, // 幅
pager : 'pager1', // footerのページャー要素のid
shrinkToFit: true, // 画面サイズに依存せず固定の大きさを表示する設定
viewrecords: true, // footerの右下に表示する
// multiselect: true // チェックボックス表示
});
}
変数attrSettingに、関数をセットしておきます。
引数は、
rowid:rowのID
val:そのcolumnの値
rawObject:jsonならjsonのraw data、xmlならxmlのraw data
cm:そのcolumnのプロパティ
rdata:rowデータ(配列)
cellattrにfunctionが返却した値をセットするようにします。
参考にさせていただいたサイト
http://dabunlog.blogspot.jp/2013/04/jqgridcolmodelcellattr.html
http://qiita.com/k499778/items/65db2380d989b1d70985
http://acro-engineer.hatenablog.com/entry/20110715/1310683073
http://www.northwind.mydns.jp/samples/jqgrid_sample5.php
