EasyUi中的DataGrid提供前台编辑的相关函数。
实现客户选中DataGrid中一列后,对选中列中的一个字段进行编辑,并对数据进行实时校验后,传递至后台保存的需求,
主要涉及到DataGrid中设置编辑单元格,获取编辑单元格,编辑单元格的onchange事件处理,通过当前光标所在编辑单元格获取所在行。
1. 设置编辑单元格
在列定义中增加editor属性,参数为type,options
eg:
{title:\'上级分配额度\',field:\'assigned_amount_temp\',width:150,sortable:true,align:\'right\',editor:{type:\'numberbox\',options:{precision:2,groupSeparator:\',\'}}}
通过beginEdit方法设置行开始编辑,参数为行号(index),设置后,列会变成可输入状态
eg:
$(\'#datagrid\').datagrid(\'beginEdit\', index);
2. 获取编辑单元格,
通过getEditor方法获取单元格,参数为options,使用行号和列名可以唯一定位cell
eg:
var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:index,field:\'assigned_amount_temp\'});
3. 为编辑单元格增加onChange事件
获取到编辑单元格后,可以为其增加onChange事件
eg:
1 $(ed.target).numberbox({ onChange: function () { 2 // 获取编辑对象的value 3 $(ed.target).numberbox(\'getValue\'); 4 // 设置编辑对的value 5 $(ed.target).numberbox(\'setValue\',removeAmountFormat(rowData[\'assigned_amount_temp\'])); 6 });
4. 通过当前光标所在编辑单元格获取所在行
在编辑单元格的onChange方法中,获取当前行
eg:
$(ed.target).numberbox({ onChange: function (newValue,oldValue) { // 获取光标所在行的行号 通过当前对象往上获取第一个datagrid-row的tr,然后那它的datagrid-row-index属性值 var rowIndex = $(this).closest("tr.datagrid-row").attr("datagrid-row-index"); var rows = $("#datagrid").datagrid(\'getRows\');
});
附录:
EasyUi 官方API文档 http://www.jeasyui.com/documentation/#
功能页面展示:
此次功能核心的jsp代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8"%> 2 3 <%-- 引入页面头 --%> 4 <%@ include file="/pageHead.jsp" %> 5 6 <form name="queryform" id="queryform" action="" method="post"> 7 <input type="hidden" id="draftGroupPoolId" name="draftGroupPoolId" value="${draftGroupPool.id}" /> 8 <div class="pageMain"> 9 <div class="pageTitle">票据池额度分配</div> 10 <div class="pageBody"> 11 <table class="tableFrom"> 12 <tr> 13 <td class="td01"></td> 14 <td class="td02">集团客户名称:</td> 15 <td class="td04">${draftGroupPool.client.name}</td> 16 <td class="td01"></td> 17 <td class="td02">集团票据池名称:</td> 18 <td class="td04">${draftGroupPool.group_pool_name}</td> 19 </tr> 20 21 <tr> 22 <td class="td01"></td> 23 <td class="td02" ><b>集团池余额合计:</b></td> 24 <td class="td04"> 25 <b> 26 <script type="text/javascript">document.write(new Number(\'${draft_amount}\').add(new Number(\'${bond_amount}\')).add(new Number(\'${pool_adjust_amount}\')).formatMoney(2,"",",","."));</script> 27 </b> 28 </td> 29 30 <td class="td01"></td> 31 <td class="td02" ><b>集团池已使用余额合计:</b></td> 32 <td class="td04"> 33 <b> 34 <script type="text/javascript">document.write(new Number(\'${ebill_used_amount}\').add(new Number(\'${used_amount}\')).formatMoney(2,"",",","."));</script> 35 </b> 36 </td> 37 </tr> 38 39 <tr> 40 <td class="td01"></td> 41 <td class="td02" >其中:在池票据余额合计:</td> 42 <td class="td04"> 43 <script type="text/javascript">document.write(new Number(\'${draft_amount}\').formatMoney(2,"",",","."));</script> 44 </td> 45 <td class="td01"></td> 46 <td class="td02" >其中:电票已使用合计:</td> 47 <td class="td04"> 48 <script type="text/javascript">document.write(new Number(\'${ebill_used_amount}\').formatMoney(2,"",",","."));</script> 49 </td> 50 </tr> 51 <tr> 52 <td class="td01"></td> 53 <td class="td02" > 保证金余额合计:</td> 54 <td class="td04"> 55 <script type="text/javascript">document.write(new Number(\'${bond_amount}\').formatMoney(2,"",",","."));</script> 56 </td> 57 58 <td class="td01"></td> 59 <td class="td02" > 纸票已使用合计:</td> 60 <td class="td04"> 61 <script type="text/javascript">document.write(new Number(\'${used_amount}\').formatMoney(2,"",",","."));</script> 62 </td> 63 </tr> 64 <tr> 65 <td class="td01"></td> 66 <td class="td02" > 池调节余额合计:</td> 67 <td class="td04"> 68 <script type="text/javascript">document.write(new Number(\'${pool_adjust_amount}\').formatMoney(2,"",",","."));</script> 69 </td> 70 <td class="td01"></td> 71 <td class="td02" ></td> 72 <td class="td04"> 73 </td> 74 </tr> 75 76 <tr> 77 <td class="td01"></td> 78 <td class="td02" ><b>集团调配后余额合计:</b></td> 79 <td class="td04" > 80 <b><div id="after_assign_amount"><script type="text/javascript">document.write(new Number(\'${after_assign_amount}\').formatMoney(2,"",",","."));</script></div></b> 81 </td> 82 <td class="td01"></td> 83 <td class="td02" ></td> 84 <td class="td04"> 85 86 </td> 87 </tr> 88 <tr> 89 <td class="td03" colspan="6" align="right"> 90 <input type="button" class="button" value="保 存" id="butSave"/> 91 <input type="button" class="button" value="返 回" id="butBack"/> 92 </td> 93 </tr> 94 </table> 95 96 <table width="100%"> 97 <tr> 98 <td> 99 <table id="datagrid"></table> 100 </td> 101 </tr> 102 </table> 103 </div> 104 </div> 105 106 <div id="dialog" > 107 </div> 108 109 </form> 110 <script type="text/javascript"> 111 var url = ""; 112 var after_assign_amount = new Number(\'${after_assign_amount}\'); 113 var rowIndex = 0; 114 var tableTitle = $(".pageTitle").html(); 115 $(document).ready(function(){ 116 //客户放大镜 117 $("#manage_clientname").magnifier({ 118 url:\'${systemctx}/commonmagnifier/queryClientMagnifier.json\', 119 columns:[[ 120 {title:\'序号\',field:\'id\',hidden:true, formel:\'manage_clientid\'}, 121 {title:\'管理单位名称\',field:\'name\',width:180,sortable:true, formel:\'manage_clientname\'}, 122 {title:\'管理单位编号\',field:\'code\',width:180} 123 ]], 124 sortName:\'code\', 125 sortOrder:\'asc\', 126 formid:\'queryform\', 127 linkName:\'name\', 128 onBeforeOpen:function(p){//打开放大镜前 129 var queryParams = {//放大镜查询SQL所需的参数 130 agency_type:\'1002\', 131 clientcode:$("input[name=\'manage_clientname\']").val() 132 }; 133 return queryParams; 134 } 135 }); 136 137 $(\'#datagrid\').datagrid({ 138 width:document.documentElement.clientWidth - 50, 139 height:\'400\', 140 nowrap:true, 141 formid:\'queryform\', 142 autoRowHeight:false, 143 striped:true, 144 url:\'${systemctx}/draft/draftPool/queryDraftPoolAssignInfo4DataGrid.json?draftGroupPoolId=${draftGroupPool.id}\', 145 sortName:\'pool_name\', 146 sortOrder:\'desc\', 147 remoteSort:false, 148 pagination:true, 149 rownumbers:true, 150 showFooter:true, 151 columns:[[ 152 {field:\'ck\', checkbox:true}, 153 {title:\'id\',field:\'id\',hidden:true}, 154 {title:\'票据池名称\',field:\'pool_name\',width:135,sortable:true,align:\'center\'}, 155 {title:\'在池票据余额\',field:\'draft_amount\',width:150,sortable:true,align:\'right\'}, 156 {title:\'保证金帐户余额\',field:\'bond_amount\',width:150,align:\'right\'}, 157 // {title:\'电票质押金额\',field:\'ebill_pledge_amount\',width:100,align:\'right\'}, 158 {title:\'池调节额度\',field:\'pool_adjust_amount\',width:100,align:\'right\'}, 159 {title:\'纸票已用额度\',field:\'used_amount\',width:150,sortable:true,align:\'right\'}, 160 {title:\'电票已用额度\',field:\'ebill_used_amount\',width:150,sortable:true,align:\'right\'}, 161 // {title:\'剩余额度\',field:\'surplus_amount\',width:130,sortable:true,align:\'right\'}, 162 {title:\'上级分配额度\',field:\'assigned_amount_temp\',width:150,sortable:true,align:\'right\',editor:{type:\'numberbox\',options:{precision:2,groupSeparator:\',\'}}} 163 ]], 164 toolbar:[ 165 { 166 text:\'导出当前列表\',iconCls:\'icon-export\',handler:function(){ 167 datagridExcelExport(\'datagrid\',\'queryform\',tableTitle,0); 168 } 169 }, 170 { 171 text:\'导出所有列表\',iconCls:\'icon-export\',handler:function(){ 172 datagridExcelExport(\'datagrid\',\'queryform\',tableTitle,1); 173 } 174 } 175 ], 176 onUncheck:function(index, rowData){ 177 after_assign_amount = totalAssignAmount(); 178 var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:index,field:\'assigned_amount_temp\'}); 179 // 加上数据库中存储的上级分配金额减去输入的金额 180 after_assign_amount = after_assign_amount.sub(new Number(removeAmountFormat($(ed.target).numberbox(\'getValue\')))).add(new Number(removeAmountFormat(rowData[\'assigned_amount_temp\']))); 181 document.getElementById("after_assign_amount").innerHTML=after_assign_amount.formatMoney(2,"",",","."); 182 // 更新集团调配后余额合计 183 $(\'#datagrid\').datagrid(\'cancelEdit\', index); 184 185 }, 186 onCheck:function(index, rowData){ 187 $(\'#datagrid\').datagrid(\'beginEdit\', index); 188 var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:index,field:\'assigned_amount_temp\'}); 189 $(ed.target).numberbox({ onChange: function () { 190 // 校验下级分配的额度不能小于单位已使用的额度 191 if(new Number(removeAmountFormat($(ed.target).numberbox(\'getValue\')))<new Number(removeAmountFormat(rowData[\'used_amount\'])).add(new Number(removeAmountFormat(rowData[\'ebill_used_amount\'])))){ 192 alert("上级给下级分配的票据池额度,不能小于当前已使用的余额"); 193 $(ed.target).numberbox(\'setValue\',removeAmountFormat(rowData[\'assigned_amount_temp\'])); 194 } 195 after_assign_amount = totalAssignAmount(); 196 // 更新集团调配后余额合计 197 document.getElementById("after_assign_amount").innerHTML=after_assign_amount.formatMoney(2,"",",","."); 198 } 199 }); 200 $(ed.target).focus(); 201 }, 202 onCheckAll:function(rows){ 203 for(var i=0;i<rows.length;i++){ 204 // 上级分配金额列置为编辑状态 205 $(\'#datagrid\').datagrid(\'beginEdit\', i); 206 var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:i,field:\'assigned_amount_temp\'}); 207 // 为编辑对象设置onChange事件 208 $(ed.target).numberbox({onChange: function (newValue,oldValue) { 209 // 获取光标所在行的行号 210 var rowIndex = $(this).closest("tr.datagrid-row").attr("datagrid-row-index"); 211 var rows = $("#datagrid").datagrid(\'getRows\'); 212 // 校验下级分配的额度不能小于单位已使用的额度 213 if(new Number(removeAmountFormat(newValue))<new Number(removeAmountFormat(rows[rowIndex][\'used_amount\'])).add(new Number(removeAmountFormat(rows[rowIndex][\'ebill_used_amount\'])))){ 214 alert("上级给下级分配的票据池额度,不能小于当前已使用的余额"); 215 $(this).numberbox(\'setValue\',removeAmountFormat(oldValue)); 216 $(this).focus(); 217 } 218 after_assign_amount = totalAssignAmount(); 219 // 更新集团调配后余额合计 220 document.getElementById("after_assign_amount").innerHTML=after_assign_amount.formatMoney(2,"",",","."); 221 } 222 }); 223 } 224 }, 225 onUncheckAll:function(rows){ 226 for(var index=0;index<rows.length;index++){ 227 $(\'#datagrid\').datagrid(\'cancelEdit\', index); 228 } 229 after_assign_amount = new Number(\'${after_assign_amount}\'); 230 // 更新集团调配后余额合计 231 document.getElementById("after_assign_amount").innerHTML=after_assign_amount.formatMoney(2,"",",","."); 232 }, 233 onClickRow:function(index,row){ 234 rowIndex = index; 235 alert(rowIndex); 236 } 237 }); 238 $("#butBack").click(function(){ 239 window.location.href="${systemctx}/draft/draftPool/grouppool/groupPoolAssignQuery.jsp"; 240 }); 241 $("#butSave").click(function(){ 242 $.messager.confirm(\'选择\', \'是否保存选中票据池分配额度\', function(r){ 243 if(r){ 244 var selected_rows = $("#datagrid").datagrid(\'getSelections\'); 245 if(selected_rows==""||selected_rows.length==0) { 246 alert("列表中没有选中的数据"); 247 return; 248 }else { 249 // 下级分配的金额不能大于调配前的票据池余额 250 if(after_assign_amount>new Number(\'${draft_amount}\').add(new Number(\'${bond_amount}\')).add(new Number(\'${pool_adjust_amount}\'))){ 251 alert("集团调配后的余额合计不能大于调配前的池余额合计"); 252 return; 253 } 254 // 选中的id,分配金额收集 255 var ids=""; 256 var assignAmounts =""; 257 var rows = $("#datagrid").datagrid(\'getRows\'); 258 for(var i=0; i<rows.length; i++){ 259 var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:i,field:\'assigned_amount_temp\'}); 260 if(ed!=null){ 261 ids = rows[i]["id"] + "," + ids; 262 assignAmounts = $(ed.target).numberbox(\'getValue\') + "," + assignAmounts; 263 } 264 } 265 ids = ids.substring(0, ids.length-1); 266 assignAmounts = assignAmounts.substring(0, assignAmounts.length-1); 267 showSending(); 268 $.ajax({ 269 type:\'POST\', 270 url:"${systemctx}/draft/draftPool/saveDraftPoolAssign.json", 271 data:{draftPoolAssignIds:ids,assignAmounts:assignAmounts}, 272 dataType:\'json\', 273 success:function(data){ 274 closeSending(); 275 if(data.messagetype==1){ 276 $.messager.alert("操作提示",data.message , "info", function (){ 277 window.location.href="${systemctx}/draft/draftPool/grouppool/groupPoolAssignQuery.jsp"; 278 }); 279 }else if(data.messagetype==2){ 280 $.messager.alert("操作提示",data.message , "error"); 281 } 282 }, 283 error:function(XMLHttpRequest,textStatus,errorThrown){ 284 try{ 285 }catch (e){} 286 } 287 }); 288 } 289 } 290 }); 291 }); 292 293 }); 294 295 function fnPoolDetail(id,canRevMargin){ 296 window.location.href="${systemctx}/draft/query/draftpoolinfoquery/draftPoolMarginQuery.jsp?poolId="+id+"&canRevMargin="+canRevMargin; 297 } 298 // 循环合计金额 299 function totalAssignAmount(){ 300 var after_assign_amount = 0.00; 301 var rows = $("#datagrid").datagrid(\'getRows\'); 302 for(var i=0;i<rows.length;i++){ 303 var ed = $(\'#datagrid\').datagrid(\'getEditor\', {index:i,field:\'assigned_amount_temp\'}); 304 if(ed!=null){ 305 after_assign_amount = after_assign_amount.add(new Number(removeAmountFormat($(ed.target).numberbox(\'getValue\')))); 306 }else{ 307 after_assign_amount = after_assign_amount.add(new Number(removeAmountFormat(rows[i][\'assigned_amount_temp\']))); 308 } 309 } 310 return after_assign_amount; 311 } 312 313 </script> 314 <%-- 引入页面尾 --%> 315 <%@ include file="/pageFloor.jsp" %>