グリッド直接編集サンプル

今回は、グリッドを直接編集するサンプルです。
簡単に説明すると、

  1. editRow で編集状態にします
  2. saveRow で更新します(サーバと通信します)
  3. キャンセルの場合は restoreRow で元に戻します

という手順になります。
saveRow では、指定したURLに対して、パラメータをPOSTで送信します。
具体的には、下のサンプルで言うと、

  • 従業員番号:2 -> 4
  • 名前:test2 -> test4

という風に編集して更新すると、

  • URL:自分自身のURL
  • POSTパラメータ:employee_no=4&id=2&name=test4

となります。
その際、WEBサーバからのレスポンスコードが200であれば、内容はどうあれ更新成功とみなされて、グリッドのデータも更新されます。
もちろんそれでは不便なので、自分でレスポンスを解析して、成功かどうかを判定することは可能です。(このサンプルはそこまでやってませんが)


あと注意点として、行IDも強制的に送信します。しかもパラメータ名は"id"固定です。今までカラム名に"id"を使用してきましたが非常にまずいので、急遽employee_no に変更しました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Grid直接編集サンプル</title>
  
<link rel="stylesheet" type="text/css" media="screen" href="css/jquery-ui-1.7.2.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/i18n/jquery.jqGrid.min.js"></script>
<script type="text/javascript" src="js/jquery.jqGrid.min.js"></script>

<script type="text/javascript">


function begin_edit()
{
	// 保存、キャンセルボタンを押せるようにし、編集ボタンを押せないようにする
	$("#btn1").attr("disabled",true);
	$("#btn2").attr("disabled",false);
	$("#btn3").attr("disabled",false);
}

function end_edit()
{
	// 保存、キャンセルボタンを押せないようにし、編集ボタンを押せるようにする
	$("#btn1").attr("disabled",false);
	$("#btn2").attr("disabled",true);
	$("#btn3").attr("disabled",true);
}

jQuery(document).ready(function()
{
	// ID という列名を使うと色々と弊害が出てくるので、employee_no に変更
	jQuery("#list").jqGrid({
		datatype: "local",
		colNames:['従業員番号', '名前'],
		colModel:[
			{name:'employee_no', editable:true},
			{name:'name'       , editable:true},
		],
		caption: 'グリッドを直接編集する'
	});

	var mydata = [
		{employee_no:"1",name:"test1"},
		{employee_no:"2",name:"test2"},
		{employee_no:"3",name:"test3"},
	];

	for(var i=0;i<=mydata.length;i++)
		jQuery("#list").addRowData(undefined,mydata[i]);

	// 編集中の行ID
	var editting_id = null;

	// 選択した行データを編集状態にする
	jQuery("#btn1").click( function()
	{
		var grid = jQuery("#list");
		editting_id = grid.getGridParam("selrow");
		if( !editting_id )
		{
			alert("選択されてません");
			return;
		}

		grid.editRow(editting_id); 
		begin_edit();
	});

	// 編集内容を保存し、編集解除する
	$("#btn2").click( function()
	{
		if( !editting_id ) return;

		// とりあえず、どんなURLでもいいので、サーバから200レスポンスが得られるURLを指定する
		jQuery("#list").saveRow(editting_id, null, location.href);
		editting_id = null;
		end_edit();
	});

	// 編集内容を破棄し、編集解除する
	$("#btn3").click( function()
	{
		if( !editting_id ) return;

		jQuery("#list").restoreRow(editting_id); 
		editting_id = null;
		end_edit();
	});

	end_edit();
});
</script>
</head>
<body>

<table id="list" class="scroll" cellpadding="0" cellspacing="0"></table>

<p><button id="btn1">選択中の行を編集する</button></p>
<p><button id="btn2">保存</button></p>
<p><button id="btn3">キャンセル</button></p>

</body>
</html>