效果如下:
点击添加按钮,在第二行的位置添加新行,点击单元格输入内容,点保存通过ajax提交。
修改则直接点击单元格修改,点保存提交。


代码如下:
首先table还是平常的table,只不过要在需要编辑的列加上editor:'text' 我这里只是编辑文本,所以是text,其他时间等类型请查api,
另外因为我触发修改的方式是直接点击单元格,所以table要加上onClickCell属性,然后重写onClickCell方法。
01. <code class="hljs javascript">$('#remark_dg').datagrid({02. url:'',03. columns:[[04. {field:'cb',checkbox:true,align:'center'},05. {field:'id',title:'编号',width:80,hidden:true},06. {field:'text',title:'内容',width:80,editor:'text'}07. ]],08. toolbar:'#remark_tb', //表格菜单09. fit:true,10. fitColumns:true,11. loadMsg:'加载中...', //加载提示12. rownumbers:true, //显示行号列13. singleSelect:true,//是允许选择一行14. onClickCell: onClickCell,15. queryParams:{ //在请求数据是发送的额外参数,如果没有则不用写16. },17. onLoadSuccess:function(data){18. },19. rowStyler:function(index,row){20. }21. });</code>简单说明下可编辑的实现方法:
首先通过beginEdit让选中的行启动编辑,保存的时候,获得选中的行,通过row取到编辑的信息,使用ajax提交,提交完成,使用endEdit属性结束行编辑。
01. <code class="hljs javascript"><code class="hljs javascript"> //可编辑行02. var editIndex = undefined;03. function endEditing(){04. if (editIndex == undefined){return true}05. if ($('#remark_dg').datagrid('validateRow', editIndex)){06. $('#remark_dg').datagrid('endEdit', editIndex);07. editIndex = undefined;08. return true;09. } else {10. return false;11. }12. }13. function onClickCell(index, field){14. if (editIndex != index){15. if (endEditing()){16. $('#remark_dg').datagrid('selectRow', index)17. .datagrid('beginEdit', index);18. var ed = $('#remark_dg').datagrid('getEditor', {index:index,field:field});19. ($(ed.target).data('textbox') ? $(ed.target).textbox('textbox') : $(ed.target)).focus();20. editIndex = index;21. } else {22. $('#remark_dg').datagrid('selectRow', editIndex);23. }24. }25. }26. function accept(){27. if (endEditing()){28. var row = $('#remark_dg').datagrid('getSelected');29. var text = row.text;30. var remarkid = row.id;31. var typeid = $('#typeid').val();32. $.ajax({33. url:'${ctx}/typeRemark/addTypeRemark.do',34. type:'post',35. dataType:'json',36. data:{37. remarkid:remarkid,38. text:text,39. typeid:typeid40. },41. success:function(data){42. if(data.status == 'success'){43. $.messager.show({44. title : '提示',45. msg : '操作成功'46. });47. $('#dg').datagrid('load', {});48. }else{49. $.messager.show({50. title : '提示',51. msg : '操作失败,请联系管理员 ------'52. });53. }54. },55. error:function(){56. $.messager.show({57. title : '提示',58. msg : '系统错误,请联系管理员------'59. });60. }61. });62. }63. }64. function addRemark(){65. function addRemark(){66. if (editIndex != undefined){67. return ;68. }69. $('#remark_dg').datagrid('insertRow',{70. index: 1, // 索引从0开始71. row: {72. text:''73. }74. });75. $('#remark_dg').datagrid('selectRow', 1);76. $('#remark_dg').datagrid('beginEdit', 1);77. var ed = $('#remark_dg').datagrid('getEditor', {index:1,field:'text'});78. $(ed.target).focus();79. editIndex = 1;80. }81. }</code></code>这里有必要提一下,我的添加和修改方法用了一个方法accpet(),同时后台也用一个方法处理的,有需要的可以借鉴一下:
表现层用的是spring mvc,持久成用的hibernate:
01. <code class="hljs javascript"><code class="hljs javascript"><code class="hljs lasso">@RequestMapping(value = '/addTypeRemark.do',method = RequestMethod.POST)02. @ResponseBody03. public Map<String,String> addTypeRemark(String text,String typeid,@RequestParam(value ='remarkid', required = false)Integer remarkid,HttpServletRequest request){04. Map<String,String> map = new HashMap<String,String> ();05. System.out.println(typeid);06. try {07. BatchType batchType=batchTypeMag.find(Integer.parseInt(typeid));08. TypeRemark typeRemark = new TypeRemark();09. if(remarkid!=null){10. typeRemark = typeRemarkMag.find(remarkid);11. }12. typeRemark.setBatchType(batchType);13. typeRemark.setText(text);14. typeRemarkMag.saveOrUpdate(typeRemark);15. map.put('status','success');16. } catch (Exception e) {17. e.printStackTrace();18. map.put('status','fail');19. }20. return map;21. }</code></code></code>也就是说,添加的时候,没有这条记录的id,修改的时候需要通过记录的id修改,所以可以判断一下。
这样,easyui动态编辑行就完成啦