これはなに? †
- イケてる表を作る jQuery plugin
- 簡単!
- より高度な使い方のサンプル (めちゃめちゃたくさんある)
動作環境の設定 †
基本的な使い方 †
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>jqgrid exam</title>
<link rel="stylesheet" type="text/css" media="screen" href="jqgrid-4.5.4/css/ui.jqgrid.css">
<link rel="stylesheet" type="text/css" media="screen" href="jquery-ui-1.10.3/jquery-ui.min.css">
<style type="text/css">
</style>
</head>
<body>
<table id="myTbl"></table>
<div id="myPager"></div><br>
<button>Shipment</button>
<script src="jquery-2.0.3.min.js" type="text/javascript"></script>
<script src="jquery-ui-1.10.3/jquery-ui.min.js" type="text/javascript"></script>
<script src="jqgrid-4.5.4/js/i18n/grid.locale-ja.js" type="text/javascript"></script>
<script src="jqgrid-4.5.4/js/jquery.jqGrid.src.js" type="text/javascript"></script>
<script type="text/javascript">
/* ==================== SCRIPTS ==================== */
var contents = [
{id:1, customer:'田中一郎', date:1385000000000, item:'ピタゴラスイッチ', unit_price:1450, amount:2, total_price:2900},
{id:2, customer:'田中一郎', date:1385000000000, item:'つるぴかLED', unit_price:50, amount:30, total_price:1500},
{id:3, customer:'佐藤二郎', date:1380000000000, item:'がっつりコンデンサ', unit_price:100, amount:5, total_price:500},
{id:4, customer:'山田花子', date:1390000000000, item:'満タン電池', unit_price:200, amount:12, total_price:2400},
];
$(document).ready(function() {
init();
$('button').on('click', function() {
var tbl = $("#myTbl");
var rowIds = tbl.getGridParam('selarrrow');
if (0 === rowIds.length) {
alert('選択されていません');
return;
}
var orderIds = new Array();
for (var idx = 0; idx < rowIds.length; idx++) {
var row = tbl.getRowData(rowIds[idx]);
orderIds.push(row.id);
}
alert('受注番号' + orderIds + 'を出荷します');
// 実アプリではここで ajax なんかを呼び出して、出荷処理と未出荷の受注一覧の取得を行う
var data = new Array();
for (var idx = 0; idx < contents.length; idx++) {
if (orderIds.indexOf("" + contents[idx].id) < 0) {
data.push(contents[idx]);
}
}
contents = data;
// 実アプリではここで ajax なんかを呼び出す
tbl
.jqGrid('clearGridData')
.jqGrid('setGridParam', { data: data })
.trigger('reloadGrid', [{ page: 1}]);
});
});
function init() {
var tbl = $("#myTbl");
tbl.jqGrid({
data: contents,
datatype: "local",
colNames: ['注文番号','顧客名','受注日','品目','単価','個数','合計金額'],
colModel: [
{ name: 'id' , index: 'id' , width: 40 , align: 'center', classes: 'tbl_id_class'},
{ name: 'customer' , index: 'customer' , width: 50 , align: 'center', classes: 'tbl_txt_class'},
{ name: 'date' , index: 'date' , width: 100 , align: 'center', classes: 'tbl_txt_class',
formatter: function (cellValue, option) {
if (!cellValue) {
return "-";
}
var date = new Date(cellValue);
return date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
}
},
{ name: 'item' , index: 'item' , width: 100, align: 'center', classes: 'tbl_txt_class'},
{ name: 'unit_price' , index: 'unit_price' , width: 40, align: 'right' , classes: 'tbl_num_class'},
{ name: 'amount' , index: 'amount' , width: 40, align: 'right' , classes: 'tbl_num_class'},
{ name: 'total_price' , index: 'total_price' , width: 40, align: 'right' , classes: 'tbl_num_class'},
],
rowNum: 10, // デフォルトの 行/ページ
rowList: [10, 20, 50], // 行/ページ セレクトボックスの候補
caption: "Orders", // 表タイトル
height: 200,
width: 600,
shrinkToFit: true, // 画面サイズに合わせて表の大きさを変える
pager: 'myPager', // Pager の id
viewrecords: true, // 行数を pager の右下に表示する。
multiselect: true, // 左側にチェックボックスを作成
});
}
/* ==================== SCRIPTS ==================== */
</script>
</body>
</html>
ラジオボタン付きの単一選択画面の作り方 †
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>jqgrid exam</title>
<link rel="stylesheet" type="text/css" media="screen" href="jqgrid-4.5.4/css/ui.jqgrid.css">
<link rel="stylesheet" type="text/css" media="screen" href="jquery-ui-1.10.3/jquery-ui.min.css">
<style type="text/css">
</style>
</head>
<body>
<table id="myTbl"></table>
<div id="myPager"></div><br>
<button>Shipment</button>
<script src="jquery-2.0.3.min.js" type="text/javascript"></script>
<script src="jquery-ui-1.10.3/jquery-ui.min.js" type="text/javascript"></script>
<script src="jqgrid-4.5.4/js/i18n/grid.locale-ja.js" type="text/javascript"></script>
<script src="jqgrid-4.5.4/js/jquery.jqGrid.src.js" type="text/javascript"></script>
<script type="text/javascript">
/* ==================== SCRIPTS ==================== */
var contents = [
{id:1, customer:'田中一郎', date:1385000000000, item:'ピタゴラスイッチ', unit_price:1450, amount:2, total_price:2900},
{id:2, customer:'田中一郎', date:1385000000000, item:'つるぴかLED', unit_price:50, amount:30, total_price:1500},
{id:3, customer:'佐藤二郎', date:1380000000000, item:'がっつりコンデンサ', unit_price:100, amount:5, total_price:500},
{id:4, customer:'山田花子', date:1390000000000, item:'満タン電池', unit_price:200, amount:12, total_price:2400},
];
$(document).ready(function() {
init();
$('button').on('click', function() {
var tbl = $("#myTbl");
var rowId = tbl.getGridParam('selrow');
if (!rowId) {
alert('選択されていません');
return;
}
var row = tbl.getRowData(rowId);
alert('受注番号' + row.id + 'を出荷します');
// 実アプリではここで ajax なんかを呼び出して、出荷処理と未出荷の受注一覧の取得を行う
var data = new Array();
for (var idx = 0; idx < contents.length; idx++) {
if (row.id != contents[idx].id) {
data.push(contents[idx]);
}
}
contents = data;
// 実アプリではここで ajax なんかを呼び出す
tbl
.jqGrid('clearGridData')
.jqGrid('setGridParam', { data: data })
.trigger('reloadGrid', [{ page: 1}]);
});
});
function init() {
var tbl = $("#myTbl");
tbl.jqGrid({
data: contents,
datatype: "local",
colNames: ['','注文番号','顧客名','受注日','品目','単価','個数','合計金額'],
colModel: [
{ name: 'select' , index: 'select', width: 20, align: 'center', resizable: false, sortable: false,
formatter: function (cellValue, option) {
return '<input type="radio" name="radio_' + option.gid + '" onclick=\"selectRow(this);\"/>';
}
},
{ name: 'id' , index: 'id' , width: 40 , align: 'center', classes: 'tbl_id_class'},
{ name: 'customer' , index: 'customer' , width: 50 , align: 'center', classes: 'tbl_txt_class'},
{ name: 'date' , index: 'date' , width: 100 , align: 'center', classes: 'tbl_txt_class',
formatter: function (cellValue, option) {
if (!cellValue) {
return "-";
}
var date = new Date(cellValue);
return date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日";
}
},
{ name: 'item' , index: 'item' , width: 100, align: 'center', classes: 'tbl_txt_class'},
{ name: 'unit_price' , index: 'unit_price' , width: 40, align: 'right' , classes: 'tbl_num_class'},
{ name: 'amount' , index: 'amount' , width: 40, align: 'right' , classes: 'tbl_num_class'},
{ name: 'total_price' , index: 'total_price' , width: 40, align: 'right' , classes: 'tbl_num_class'},
],
beforeSelectRow: function (rowid, e) {
// 選択行のラジオボタンを選択状態にする
var $radio = $(e.target).closest('tr').find('input[type="radio"]');
$radio.prop("checked", true);
return true; // allow row selection
},
rowNum: 10, // デフォルトの 行/ページ
rowList: [10, 20, 50], // 行/ページ セレクトボックスの候補
caption: "Orders", // 表タイトル
height: 200,
width: 600,
shrinkToFit: true, // 画面サイズに合わせて表の大きさを変える
pager: 'myPager', // Pager の id
viewrecords: true, // 行数を pager の右下に表示する。
multiselect: false, // 左側にチェックボックスを作成
});
}
function selectRow(radio) {
// クリックしたラジオボタンの行を選択状態にする
var rowid = $(radio).closest('tr').attr('id');
console.log(rowid);
var tbl = $("#myTbl");
tbl.jqGrid('setSelection', rowid);
}
/* ==================== SCRIPTS ==================== */
</script>
</body>
</html>
- 単純に単一選択にしたければ multiselect : false にすればいいだけ
- アフォーダンスとして単一選択であることをユーザに仄めかすためにラジオボタンをつける。結構大変
- 表の第一列に <input type="radio"> を設定する
- 行が選択された場合に、このラジオボタンを選択状態にする
- ラジオボタンがクリックされた時に、ラジオボタンを含む行を選択状態にする
- 選択行は var rowId = tbl.getGridParam?('selrow'); で取得できる。未選択時は undefined が返る
HTML#Javascript