dataGrid支持键盘操作

博主分享了一个困扰自己一周的表格操作方法。该表格支持动态combobox选择作为搜索条件,还支持用键盘TAB(shift+TAB)键切换单元格,且只需修改少量代码即可使用,旨在避免更多人卡在该问题上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 支持动态combobox选择(搜索条件)

  2. 支持键盘TAB(shift+TAB)键切换单元格

  3. 修改一点点代码就可以使用

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>dataGrid键盘监听</title>
	<link rel="stylesheet" type="text/css" href="easyui.css">
	<link rel="stylesheet" type="text/css" href="icon.css">
	<link rel="stylesheet" type="text/css" href="demo.css">
	<script type="text/javascript" src="jquery.min.js"></script>
	<script type="text/javascript" src="jquery.easyui.min.js"></script>
</head>

<body>
	<h2>订单</h2>

	<div style="margin:20px 0;"></div>
		<div id="tb" style="height:auto">
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true"
			onclick="append()">新增行</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true"
			onclick="removeit()">删除行</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-save',plain:true"
			onclick="accept()">保存</a>
		<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-undo',plain:true"
			onclick="reject()">撤销</a>
	</div>
	<table id="dg" class="easyui-datagrid" title="Row Editing in DataGrid" style="width:1200px;height:auto"
			data-options="
                title: '新增订单',
				iconCls: 'icon-edit',
				singleSelect: true,
				toolbar: '#tb',
				data: [
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' },
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' },
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' },
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' },
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' },
                {shopId:'',productAlias:'',shopName:'',OrderNum:'',OrderUnit:'',number:'',price:'',Unit:'',pushprice:'',remake:'' }
                ],
				onClickCell: onClickCell
			">
		<thead>
			<tr>
               
				<th data-options="field:'productAlias',width:200,align:'center',editor:{
                                    type:'combobox',
                                    options:{
                                                valueField:'shopId',
                                                textField:'productAlias',
                                                 loader : nickname,
                                                mode : 'remote',
                                                onSelect: selNickName,
                                              required:true                              
                    }}">下单名称</th>
				<th data-options="field:'shopName',width:200,align:'center',editor:{
                        type:'combobox',
                        options:{
                            valueField: 'shopId',
                            textField: 'shopName',  
                            loader : shopname,
                            mode : 'remote',                            
                            required:true
                        }}">标准名称</th>
				<th data-options="field:'OrderNum',width:80,align:'center',editor:{type:'numberbox',options:{precision:2}}">下单数量</th>
                <th data-options="field:'OrderUnit',width:80,align:'center',editor:'textbox'">下单单位</th>
				<th data-options="field:'number',width:80,align:'center',editor:{type:'numberbox',options:{precision:2}}">销售数量</th>
				<th data-options="field:'price',width:80,align:'center',editor:{type:'numberbox',options:{precision:2}}">销售单价</th>
				<th data-options="field:'Unit',width:80,align:'center',editor:'textbox'">销售单位</th>
				<th data-options="field:'pushprice',width:80,align:'center',editor:{type:'numberbox',options:{precision:2}}">采购价格</th>
                <th data-options="field:'remake',width:200,align:'center',editor:'textbox'">备注</th>

               
			</tr>
		</thead>
	</table>
 
	<script type="text/javascript">
    
		var pfields = undefined; //属性集合
var pgrid = undefined;
$.extend($.fn.datagrid.methods, {
    editCell: function(jq, param) {
        return jq.each(function() {
            
            var opts = $(this).datagrid('options');
            var fields = $(this).datagrid('getColumnFields', true).concat($(this).datagrid('getColumnFields'));
            var arr = new Array();
            for (var i = 0; i < fields.length; i++) {
                var col = $(this).datagrid('getColumnOption', fields[i]);
                if (col.editor != undefined) {
                    arr.push(fields[i]);
                }
                col.editor1 = col.editor;
                if (fields[i] != param.field) {
                    col.editor = null;
                }
            }
            pfields = arr;
            $(this).datagrid('beginEdit', param.index);
            var ed = $(this).datagrid('getEditor', param);
            if (ed) {
                if ($(ed.target).hasClass('textbox-f')) {
                    $(ed.target).textbox('textbox').focus();
                } else {
                    $(ed.target).focus();
                }
            }
            for (var i = 0; i < fields.length; i++) {
                var col = $(this).datagrid('getColumnOption', fields[i]);
                col.editor = col.editor1;
                    
                 if (col.editor == "textbox") {  //获取焦点           
                        $(".textbox-text").focus();
                        $(".textbox-text").select();
                    }
            }
        });
    }
});





var editIndex = undefined;
var pfield = "";

function endEditing() {
    if (editIndex == undefined) {
        return true
    }
    if (pgrid.datagrid('validateRow', editIndex)) {      
        pgrid.datagrid('endEdit', editIndex);
        editIndex = undefined;
        return true;
    } else {
        return false;
    }
}

//单击编辑单元格
function onClickCell(index, field) {
    if (endEditing()) {
        $(this).datagrid('selectRow', index).datagrid('editCell', {
            index: index,
            field: field
        });
        editIndex = index;
        pfield = field;
    }
    pgrid = $(this);
      
}

//新增一行
function append(){
    if (endEditing()){
        $('#dg').datagrid('appendRow',{productAlias:""});
        editIndex = $('#dg').datagrid('getRows').length-1;
        
    }
}

//保存
function accept(){
    if (endEditing()){
        $('#dg').datagrid('acceptChanges');
    }
   var rows = $("#dg").datagrid("getRows"); 
    for(var i=0;i<rows.length;i++){
        if(rows[i].shopName=="" || rows[i].shopName==null){
            return;
        }else{
        console.log("保存的数据",rows)
        }
    } 
}

//需要定义 grid editIndex pfield pfields
$(document).keydown(function(event) {

    //判断单元格编辑状态
 if (event.keyCode == 9 && (!event.shiftKey) /*||event.keyCode ==39*/ ) { //tab 和 向右方向键
        
        var e = event
        if (e.preventDefault) { //屏蔽浏览器快捷键
            e.preventDefault();
            e.stopPropagation()
        } else {
            e.returnValue = false;
            e.cancelBubble = true
        }
       pgrid.datagrid('endEdit', editIndex); //结束编辑
        pgrid.datagrid('cancelEdit', editIndex); //取消编辑
         pgrid.datagrid('refreshRow', editIndex);  //刷新
        for (var j = 0; j < pfields.length; j++) {
            if (pfield == pfields[j]) {
                if (j == pfields.length - 1) { //最后一列时换行
                    editIndex = editIndex + 1;
                    pfield = pfields[0];
                    break;
                }
                pfield = pfields[j + 1];
                break;
            }
        }
         if (editIndex == pgrid.datagrid('getData').rows.length) { //当到最后一行时 换列
            append(); //新增一行
           /* editIndex = 0;
            for (var j = 0; j < pfields.length; j++) {
                if (pfield == pfields[j]) {
                    if (j == pfields.length - 1) {
                        pfield = pfields[0];
                        break;
                    }
                    pfield = pfields[j + 1];
                    break;
                }
            }*/
        }
        setTimeout("pgrid.datagrid('selectRow', editIndex).datagrid('editCell', {index:editIndex,field:pfield});", 100)
    } else if (event.keyCode == 9 && event.shiftKey) { //shift tab 向左移动
        var e = event
        if (e.preventDefault) {
            e.preventDefault();
            e.stopPropagation()
        } else {
            e.returnValue = false;
            e.cancelBubble = true
        }
       pgrid.datagrid('endEdit', editIndex); //结束编辑
        pgrid.datagrid('cancelEdit', editIndex); //取消编辑
         pgrid.datagrid('refreshRow', editIndex);  //刷新
        for (var j = 0; j < pfields.length; j++) {
            if (pfield == pfields[j]) { //最前一列时换行
                if (j == 0) {
                    editIndex = editIndex - 1;
                    pfield = pfields[pfields.length - 1];
                    break;
                }
                pfield = pfields[j - 1];
                break;
            }
        }
        setTimeout("pgrid.datagrid('selectRow', editIndex).datagrid('editCell', {index:editIndex,field:pfield});", 100)
    }
});
//end

/**下单名称**/
var nickname = function (param, success, error) {
		var q = param.q || "";
        //console.log(param.q)
		if (q.length <= 0) {
			//console.log("q.length <= 0");
			return false;
		}
		$.ajax({
			url: "http://wechat.superms.cn/AreasComputer/BasicInformation/AliasSearch",
			type: "get",
			data: {buyerOrgId:'ON201905200011',search: q},//后台使用param这个变量接收传值的
			dataType: "json",
			success: function (res) {
				if(res.Code==200){
				console.log('数据',res); //返回的是数组对象data
				success(res.Result);//调用loader的success方法,将items添加到下拉框中,这里是难点啊,之前后台已经返回数据了,但就是不添加到下拉框
			}else{
               success(res.Result)
            }
			}
		});
	}  
    
/**标准名称**/
var shopname = function (param, success, error) {
		var q = param.q || "";
        //console.log(param.q)
		if (q.length <= 0) {
			//console.log("q.length <= 0");
			return false;
		}
		$.ajax({
			url: "http://wechat.superms.cn/AreasComputer/BasicInformation/SearchShop",
			type: "get",
			data: {buyerOrgId:'ON201905200011',search: q},//后台使用param这个变量接收传值的
			dataType: "json",
			success: function (res) {
            if(res.Code==200){
				console.log('数据',res); //返回的是数组对象data
				success(res.Result);//调用loader的success方法,将items添加到下拉框中,这里是难点啊,之前后台已经返回数据了,但就是不添加到下拉框
			}else{
                success(res.Result)
            }
            
            }
		});
	} 
 
 /**选中下单名称**/
var selNickName = function (param){
    $(this).textbox('textbox').keydown(function (event) {
        if (event.keyCode == 13) { //监听回车(选择以后在更新行数据)
            console.log("param",param); 
             pgrid.datagrid('endEdit', editIndex);
            $('#dg').datagrid('updateRow',{
                index: editIndex,
                row: {
                   shopId:param.shopId,
                   productAlias:param.productAlias,
                   shopName:param.shopName,
                   OrderNum:param.OrderNum,
                   OrderUnit:param.OrderUnit,
                   number:param.number,
                   price:param.price,
                   Unit:param.Unit,
                   pushprice:param.pushprice,
                   remake:param.remake
                }
            });
        }
    });
}    
    
  
    
/**选中标准名称**/
var selShopName = function (param){
    console.log("param",param);
         pgrid.datagrid('endEdit', editIndex);
    $('#dg').datagrid('updateRow',{
        index: editIndex,
        row: {
           shopId:param.shopId,      
           shopName:param.shopName,
           OrderNum:param.OrderNum,
           OrderUnit:param.OrderUnit,
           number:param.number,
           price:param.price,
           Unit:param.Unit,
           pushprice:param.pushprice,
           remake:param.remake
        }
    });

}    

	</script>
</body>

</html>

 这个表的操作,困了我一个星期,为了不让更多的人卡在这个问题上,所以我分享出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值