easyui datagrid 相同列合并/编辑行后保存

      利用easyui datagrid做一个订单信息列表,需要的功能为相同类型下的产品列合并,并且能随意修改其价格与数量。

大致如下


方法实现思路.

     首先想到的肯定就是,这个功能绝对是可以实现的,于是乎找资料呀找资料,先从相同列合并单元格找起。
于是乎找到的资料如下:
  1. easyui datagrid 连续相同列合并拓展  http://blog.csdn.net/dcb_ripple/article/details/55050689
  2. easyui gatagrid ——可编辑的列      http://blog.csdn.net/fengyao1995/article/details/47702409
  3. easyui gatagrid 行编辑功能(行内编辑、删除、保存、取消)  http://blog.csdn.net/xuezt/article/details/45727601
  4. easyui gatagrid 单元格编辑保存  http://blog.csdn.net/toutou0505/article/details/43266707
  5. easyui gatagrid 不在编辑状态改变其值  http://www.gkxsn.com/6347761983142187501.html
  6. easyui 前台改变某个单元格的值 http://blog.csdn.net/d7011800/article/details/8692624


本次主要资料借鉴于1、3、5。


代码实现.

相同单元格合并
比较简单,直接按上面的资料第一部分即可实现此功能。我的代码如下
<table id="tt2" class="easyui-datagrid"
				style="width: 100%; height: 470px"
				url=""
				title="" iconCls="icon-save" rownumbers="true" pageSize=30 
				method:"get"
					idField="id" pagination="true">
				<thead>
					<tr>
						<th field="ck" checkbox="true"></th>
						<th field="id" hidden="hidden"></th>
						<th field="sortId" hidden="hidden"></th>
						<th field="myDetailId" hidden="hidden"></th>
						<th field="sort_Name" width="200">分类名称</th>
						<th field="product_id" width="100">erp编号</th>
						<th field="type_id" hidden="hidden"></th>
						<th field="typeName" width="100">系统类型</th>
						<th field="identify" width="70">唯一编码</th>
						<th field="market_money" width="100">指导价</th>
						<th field="clinch_money" editor="{type:'numberbox',options:{precision:0}}" width="100">成交价(可编辑)</th>
						<th field="count" editor="{type:'numberbox',options:{precision:0}}" width="80">数量(可编辑)</th>
						<th field="clinch_money_sum" width="100">金额小计</th>
						<th field="discount" width="100">折扣(%)</th>
						<th field="product_desc" width="200">描述</th>
						<th field="note" width="200">备注</th>
					</tr>
				</thead>
			</table>
js代码片段
function getBinding(id){    //单击事件的一个方法

		$.extend($.fn.datagrid.methods, {
		    autoMergeCells: function(jq, fields) {
		        return jq.each(function() {
		            var target = $(this);
		            if (!fields) {
		                fields = target.datagrid("getColumnFields");
		            }
		            var rows = target.datagrid("getRows");
		            var i = 0,
		            j = 0,
		            temp = {};
		            for (i; i < rows.length; i++) {
		                var row = rows[i];
		                j = 0;
		                for (j; j < fields.length; j++) {
		                    var field = fields[j];
		                    var tf = temp[field];
		                    if (!tf) {
		                        tf = temp[field] = {};
		                        tf[row[field]] = [i];
		                    } else {
		                        var tfv = tf[row[field]];
		                        if (tfv) {
		                            tfv.push(i);
		                        } else {
		                            tfv = tf[row[field]] = [i];
		                        }
		                    }
		                }
		            }
		            $.each(temp,
		            function(field, colunm) {
		                $.each(colunm,
		                function() {
		                    var group = this;

		                    if (group.length > 1) {
		                        var before, after, megerIndex = group[0];
		                        for (var i = 0; i < group.length; i++) {
		                            before = group[i];
		                            after = group[i + 1];
		                            if (after && (after - before) == 1) {
		                                continue;
		                            }
		                            var rowspan = before - megerIndex + 1;
		                            if (rowspan > 1) {
		                                target.datagrid('mergeCells', {
		                                    index: megerIndex,
		                                    field: field,
		                                    rowspan: rowspan
		                                });
		                            }
		                            if (after && (after - before) != 1) {
		                                megerIndex = after;
		                            }
		                        }
		                    }
		                });
		            });
		        });
		    }
		});
		
		
		//所有列进行合并操作
	    $('#tt2').datagrid({
	        url: "${pageContext.request.contextPath }/myorder/myorder_getProductMyOrderIdListJson.action?myOrder.id="+id,
	        onLoadSuccess: function(data) {
	            //所有列进行合并操作
	            //$(this).datagrid("autoMergeCells");
	            //指定列进行合并操作  
	            $(this).datagrid("autoMergeCells", ['sort_Name', '']);
	        }
	    });
		
	    $('#dlg2').dialog('open').dialog('setTitle', '订单情况'); 
	}
  这里需要注意的是,和并列有时会出现错误,发现合并效果不理想不成功. 建议如下,尽量保障你要合并的列名称(field)保证唯一。每次改变grid时都手动调用一次
 $(this).datagrid("autoMergeCells", ['sort_Name', '']);   保证其效果正常运行。

行编辑后利用ajax保存
难点在于如何使编辑后的内容进行保存,因为并未发现有失去焦点这一事件,具体代码如下:
$(function(){

		
		$('#tt2').datagrid({
		    onClickCell: function(index,field,value){
		       //var ed = $(this).datagrid('getEditor', {index:index,field:field});  
		       //$.messager.alert('温馨提示','请谨慎更改!','info');
		       editorDatagrid(index,field,value);
		    }   
		});  
		
	});
	
	var editIndex = -1 ;
	function editorDatagrid(index,field,value){
		
		//未选择编辑框
		if(field !="clinch_money" && field !="count" && editIndex == -1){
			return false;
		}
		if(editIndex != -1){
			//$('#tt2').datagrid('validateRow', editIndex);
			$('#tt2').datagrid('endEdit', editIndex);  //保存已编辑的框 
			$('#tt2').datagrid("autoMergeCells", ['sort_Name', '']); //重新加载合并列
			var row =  $('#tt2').datagrid('getData').rows[editIndex];
			if (row.clinch_money =="" || row.count ==""){
				$.messager.alert('温馨提示','请填写金额与数量,本次修改失败!','info');
				editIndex = -1;   //复位.
				$('#tt2').datagrid('load',{});
				return false;
			}else{
				editIndex = -1;   //复位.
				//填写折扣后的数据.,,, 
			}
			if(field =="clinch_money"||field =="count" ){
				editIndex = index;
			}else{
				editIndex = -1;   //复位.
			}
			//ajax 保存操作
			$.post("${pageContext.request.contextPath }/myorder/myorder_editOrderDetailMy.action",
					{"myDetail.clinch_money":row.clinch_money,"myDetail.market_money":row.market_money,
					  "myDetail.count":row.count,"myDetail.id":row.myDetailId},
				function(data){
					if(data.status=="1"){
						$('#tt2').datagrid('load',{});
					}else{
						$.messager.alert('温馨提示',data.errorMsg,'info');
					}
					editIndex = -1;   //复位.
			},"json");
		}else{
			if(field =="clinch_money" || field=="count"){
				$('#tt2').datagrid('beginEdit',index);  //更改属性为可编辑
		    }
			editIndex = index; //保存,作为第二次进入时 修改保存的依据
		}
	}


html代码跟上面的是一样的,思路在每次点击事件时将上一次所单击的下标保存起来,再下一次点击事件时将数据通过ajax保存到后台. 缺点在于有些事情做得较为繁琐,方法比较笨拙而且需修改后点击表格中的其他位置。

















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyUI Datagrid 编辑行后,可以通过以下步骤保存数据: 1. 获取编辑后的数据:在 Datagrid 编辑完成后,可以通过 `datagrid('getChanges')` 方法获取到修改的数据。 2. 发送数据到后台:使用 AJAX 技术将修改后的数据发送到后台进行保存。可以使用 jQuery 中的 `$.ajax()` 方法或者 `$.post()` 方法实现。 3. 处理保存结果:后台保存数据完成后,需要返回相应的结果。可以使用 JSON 格式返回保存结果。根据返回结果,可以给出相应的提示信息。 下面是一个示例代码: ```javascript // 获取修改后的数据 var changes = $('#datagrid').datagrid('getChanges'); // 发送数据到后台保存 $.ajax({ url: 'save.php', type: 'post', data: {changes: JSON.stringify(changes)}, dataType: 'json', success: function(result){ if(result.success){ // 保存成功,刷新数据 $('#datagrid').datagrid('reload'); }else{ // 保存失败,给出相应的提示信息 alert(result.message); } } }); ``` 在后台处理保存数据的代码中,可以根据需求使用相应的技术进行数据保存。例如,可以使用 PHP 的 PDO 技术进行数据库操作,代码如下: ```php // 获取修改后的数据 $changes = json_decode($_POST['changes'], true); // PDO 连接数据库 $dsn = "mysql:host=localhost;dbname=mydatabase;charset=utf8"; $user = "myuser"; $pass = "mypassword"; $pdo = new PDO($dsn, $user, $pass); // 开始事务 $pdo->beginTransaction(); try { // 循环保存修改后的数据 foreach($changes as $change){ $id = $change['id']; $name = $change['name']; $age = $change['age']; // 更新数据库中的数据 $sql = "UPDATE mytable SET name=?, age=? WHERE id=?"; $stmt = $pdo->prepare($sql); $stmt->execute([$name, $age, $id]); } // 提交事务 $pdo->commit(); // 返回保存成功的结果 $result = array('success' => true); echo json_encode($result); } catch (PDOException $e) { // 回滚事务 $pdo->rollBack(); // 返回保存失败的结果 $result = array('success' => false, 'message' => $e->getMessage()); echo json_encode($result); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值