jqgridでデータを追加するときに表の最上部からデータを追加したい、特定の行を表示させない。
まず、表の上からデータを追加したいという場合に関してはそんなに難しくなく、
addRowDataの第三引数に'first'という引数を渡してやると出来ちゃったりする。
$('#list').addRowData(undefined,{invdate:'2008-08-01',name:'nasu-tarou',amount:'100',tax:'5',total:'105',note:'追加ボタンから'},'first');
次の特定の行を表示させないというのは、
jqgridで行を追加するときに非表示の行を追加し、
特定のオペレーションでその行の表示/非表示を切り替えたい
といったオーダーがあったのでその対応。
正直、かなり難しいと思ったが意外とあっさりいけてしまった。
表のデータを追加した際に、nameプロパティがhiddenだった場合にその行を非表示にする
といった場合、行のデータを追加する際にafterInsertRowイベントを設定し、そのイベント内で
setRowDataを呼び、第三引数のcssPropにオブジェクトとして{'display':'none'}
と渡してやれば非表示には出来るんだが、後から表示/非表示を切り替えづらいので
非表示用のクラスを用意してやり、setRowDataの第三引数にオブジェクトではなく、
非表示用のクラス名と切り替えした際に非表示になるクラス名をスペース区切りの文字列で
指定してやる。文字列で指定するとaddClassとして動作するようだ。
実際のコードはこんな感じ。
<!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="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>My First Grid</title> <link rel="stylesheet" type="text/css" media="screen" href="jquery-ui-1.8.18.custom.css" /> <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" /> <style type="text/css"> html, body { margin: 0; padding: 0; font-size: 75%; } .hide { display: none; } </style> <script src="js/jquery-1.5.2.min.js" type="text/javascript"></script> <script src="js/i18n/grid.locale-en.js" type="text/javascript"></script> <script src="js/jquery.jqGrid.min.js" type="text/javascript"></script> <script type="text/javascript"> $(function(){ $("#list").jqGrid({ datatype: 'local', // postData: $('#form').serialize(), serializeGridData: function(postData){ var formData = $('#form').serializeArray(); for(var i = 0 ; i < formData.length ; i++ ){ postData[formData[i].name] = formData[i].value; } return postData; }, height: 125, data:[], colNames:['Date', 'Client', 'Amount','Tax','Total','Notes'], colModel:[ {name:'invdate',index:'invdate', width:90}, {name:'name',index:'name', width:100}, {name:'amount',index:'amount', width:80, align:"right"}, {name:'tax',index:'tax', width:80, align:"right"}, {name:'total',index:'total', width:80,align:"right"}, {name:'note',index:'note', width:150 } ], pager: '#pager', rowNum:5, viewrecords: true, afterInsertRow: function(rowid,rowdata,rowelem){ if(rowdata.name == 'hidden'){ alert('非表示データを追加しました'); $('#list').setRowData(rowid,{},'hide hide-row'); } } } ); }); </script> </head> <body> <form id="form"> <input type="text" name="text1" value=""/><br/> <input type="text" name="text2" value=""/><br/> </form> <input type="button" id="button1" value="データをクリア"> <input type="button" id="button2" value="表をリフレッシュ"> <input type="button" id="button3" value="見えるデータを追加"> <input type="button" id="button4" value="見えないデータを追加"> <input type="button" id="button5" value="表示/非表示切り替え"> <table id="list"></table> <div id="pager"></div> <script type="text/javascript"> $(function(){ $('#button1').click(function(){ $('#list').clearGridData(); }); $('#button2').click(function(){ $('#list').setGridParam({page:"1",url: '/init.php',mtype: 'POST', datatype:'json'}); $('#list').trigger("reloadGrid"); }); $('#button3').click(function(){ $('#list').addRowData(undefined,{invdate:'2008-08-01',name:'cyubachi',amount:'100',tax:'5',total:'105',note:'追加ボタンから'},'first'); }); $('#button4').click(function(){ $('#list').addRowData(undefined,{invdate:'2008-08-01',name:'hidden',amount:'100',tax:'5',total:'105',note:'追加ボタンから'},'first'); }); $('#button5').click(function(){ $('.hide-row').toggle(); }); }); </script> </body> </html>
hideというクラスに加えてhide-rowというクラスを加えているのがミソで、
これが非表示データの目印になっている。