按CTRL,SHIFT,ALT等键扩展easyui的datagrid多选实现

最近项目开发中要求实现在easyui的datagrid的继承上实现按住键盘的某些设定键(如CTRL,SHIFT,ALT等)实现多选功能,主要是,easyui的datagrid的单选或多选开关属性为singleSelect,其值true=单选,false=多选;利用按下键盘的CTRL,SHIFT,ALT等设定键,然后设置singleSelect属性为false即可进行多选,shift连选问题,是记录首尾两次单击的位置,然后用datagrid的getRow事件循环选中首尾之间的行即可;

好,看下实现步骤:

1,增加辅助JS代码,这些代码最好跟datagrid的请求代码一起放到一个JS文件中:

//-------------------------------------------------------------------------------
// 当然页面文件中还需要引入的文件如下:
// easyui.css 和其它页面用到的CSS文件
// jquery-1-8-3-min.js, easyui-lang-zh_CN.js, jquery-easyui-min.js, datagrid-detailview.js,  和其它页面用到的JS文件
//-------------------------------------------------------------------------------
//     结合SHIFT,CTRL,ALT键实现单选或多选
//-------------------------------------------------------------------------------
var KEY = { SHIFT:16, CTRL:17, ALT:18, DOWN:40, RIGHT:39, UP:38, LEFT:37};  
var selectIndexs = {firstSelectRowIndex:0, lastSelectRowIndex:0};
var inputFlags = {isShiftDown:false, isCtrlDown:false, isAltDown:false}

function keyPress(event){//响应键盘按下事件
    var e = event || window.event;  
    var code = e.keyCode | e.which | e.charCode;      
    switch(code) {  
        case KEY.SHIFT:  
		inputFlags.isShiftDown = true;
		$('#dataListTable').datagrid('options').singleSelect = false;			
		break;
	case KEY.CTRL:
		inputFlags.isCtrlDown = true;
		$('#dataListTable').datagrid('options').singleSelect = false;			
		break;
	/*
	case KEY.ALT:	
		inputFlags.isAltDown = true;
		$('#dataListTable').datagrid('options').singleSelect = false;			
		break;
	*/	
	default:		
    }
}

function keyRelease(event) { //响应键盘按键放开的事件
    var e = event || window.event;  
    var code = e.keyCode | e.which | e.charCode;      
    switch(code) {  
        case KEY.SHIFT: 
		inputFlags.isShiftDown = false;
		selectIndexs.firstSelectRowIndex = 0;
		$('#dataListTable').datagrid('options').singleSelect = true;			
		break;
	case KEY.CTRL:
		inputFlags.isCtrlDown = false;
		selectIndexs.firstSelectRowIndex = 0;
		$('#dataListTable').datagrid('options').singleSelect = true;
		break;
	/*
	case KEY.ALT:	
		inputFlags.isAltDown = false;
		selectIndexs.firstSelectRowIndex = 0;
		$('#dataListTable').datagrid('options').singleSelect = true;			
		break;
	*/
	default:		
    }
}

2,HTML代码,在页面增加加载数据的位置和在body中增加响应键盘事件:

<body class="body01" οnkeydοwn="javascript:keyPress(event);" οnkeyup="javascript:keyRelease(event);"> 

<!-- 数据加载存放位置 -->
<div>
<table id="dataListTable"></table>
</div>

3,在datagrid请求代码的onClickRow事件中增加操作代码,onClickRow单击事件如下:

onClickRow:function(index,row){	
	//-------------for TEST 结合SHIFT,CTRL,ALT键实现单选或多选----------------	
	if(index != selectIndexs.firstSelectRowIndex && !inputFlags.isShiftDown ){  
		selectIndexs.firstSelectRowIndex = index; //alert('firstSelectRowIndex, sfhit = ' + index);
	}			
	if(inputFlags.isShiftDown ) {
		$('#dataListTable').datagrid('clearSelections');				
		selectIndexs.lastSelectRowIndex = index;
		var tempIndex = 0;
		if(selectIndexs.firstSelectRowIndex > selectIndexs.lastSelectRowIndex ){
			tempIndex = selectIndexs.firstSelectRowIndex;
			selectIndexs.firstSelectRowIndex = selectIndexs.lastSelectRowIndex;
			selectIndexs.lastSelectRowIndex = tempIndex;
		}
		for(var i = selectIndexs.firstSelectRowIndex ; i <= selectIndexs.lastSelectRowIndex ; i++){
			$('#dataListTable').datagrid('selectRow', i);	
		}	
	}			
	//-------------for TEST 结合SHIFT,CTRL,ALT键实现单选或多选----------------
}

4,参考的datagrid请求代码:

;
$(function(){	
	$('#dataListTable').datagrid({
		url:'xpath/jsonData01.json', 
		height:(screen.height == 900 ? 660 : 950),
		nowrap:true, 
		autoRowHeight:false,
		striped:true,
		singleSelect:true,
		collapsible:false,
		//checkOnSelect:true,
		//selectOnCheck:true,	
		remoteSort:false, 
		frozenColumns:[[
			{field:'ck',checkbox:true},
			//{title:'cel02',field:'code',width:80,sortable:true}
        	]], 
		columns:[[
			{field:'cel01',title:'列名01',width:100,sortable:true},
			{field:'cel02',title:'列名02',width:100,sortable:true},
			{field:'cel03',title:'列名03',width:150,sortable:true},
			{field:'cel04',title:'列名04',width:200,sortable:true},
			{field:'cel05',title:'列名05',width:100,sortable:true},
			{field:'cel06',title:'紧急度',width:100,sortable:true,
				formatter:function(value,row,index){ 
					if("紧急" == $.trim(value)){ 
						return '<span class="urgent01">' + value + '</span>';
					}else{
						return '<span class="normal01">' + value + '</span>';
					}
				}			
			},
			{field:'cel07',title:'列名07',width:300,sortable:true},
			{field:'cel08',title:'开始时间',width:200,sortable:true,
				formatter:function(value,row,index){ return formatterDate(value);}
			},
			{field:'cel09',title:'结束时间',width:200,sortable:true,
				formatter:function(value,row,index){ return formatterDate(value);}
			},
			{field:'cel10',title:'列名10',width:100,sortable:true}
		]],		
		pagination:true,
		pageNumber:1,
		pageList:[10,20,30,40,50],
		view:detailview,
		detailFormatter:function(index,row){ 
			var conStyle = ' style="border:0px solid red; padding:10px 10px; background-color:#a4bac1;"';
			var dataCon = '<div id="ddv-' + index + '"' + conStyle + '></div>'; 
			return dataCon;
    		}, 
		onExpandRow:function(index,row){ //展开事件
			$('#ddv-' + index).panel({
				cache:false,  
				border:false, 
				href:'detailPage.htm', //展开行的子页面,如果是完整页面也仅取body元素之内的内容
				onLoad:function(){ 		
					//调整展开行高度
					$('#dataListTable').datagrid('fixDetailRowHeight',index); 
				}	
			});	
		},
		onSelect:function(index,data){
			//do nothing			
		},
		rowStyler:function(index,row){
			/*
			if( index < 4 && (index % 2) == 0){
				return 'background:#CCFF99';	
			}
			*/
		},
		onClickRow:function(index,row){	//单击行事件
			//---------for TEST 结合SHIFT,CTRL,ALT键实现单选或多选------------
			if(index != selectIndexs.firstSelectRowIndex && !inputFlags.isShiftDown ){  
				selectIndexs.firstSelectRowIndex = index; //alert('firstSelectRowIndex, sfhit = ' + index);
			}			
			if(inputFlags.isShiftDown ) {
				$('#dataListTable').datagrid('clearSelections');
				selectIndexs.lastSelectRowIndex = index;
				var tempIndex = 0;
				if(selectIndexs.firstSelectRowIndex > selectIndexs.lastSelectRowIndex ){
					tempIndex = selectIndexs.firstSelectRowIndex;
					selectIndexs.firstSelectRowIndex = selectIndexs.lastSelectRowIndex;
					selectIndexs.lastSelectRowIndex = tempIndex;
				}
				for(var i = selectIndexs.firstSelectRowIndex ; i <= selectIndexs.lastSelectRowIndex ; i++){
					$('#dataListTable').datagrid('selectRow', i);	
				}	
			}			
			//---------for TEST 结合SHIFT,CTRL,ALT键实现单选或多选------------
		},
		onLoadSuccess:function(data){	
			$('#dataListTable').datagrid('clearSelections');
		},
		onLoadError:function(){	
			//alert('error....');
		}
	}); 	
	
	//other variables or event initialize here
	//-------------------------------------------
	var p = $('#dataListTable').datagrid('getPager'); //个性化设置分页对象
	$(p).pagination({
		pageNumber:1,
		pageSize:10,
		pageList:[10,20,30,40],
		beforePageText:'第',
		afterPageText:' 页,共{pages}页',
		displayMsg:'当前{from} - {to}条, 共{total}条'
	}); 
	//-------------------------------------------
});

function formatterDate(objDate){ //格式化日期函数
 	var strDate = objDate.year;
	strDate += '-' + objDate.month;	
	strDate += '-' + objDate.date;
	strDate += ' ' + objDate.hours;
	strDate += ':' + objDate.minutes;
	strDate += ':' + objDate.seconds;
	return strDate;
}



结果是:

(1),单选,直接单击某行即可单选某条记录;
(2),多选,按住键盘CTRL 或 SHIFT 键开可进行多选,
         (A)按CTRL键不放,在easyui的datagrid上单击某行,即可选中单击的行,再次单击取消选中;
         (B)在easyui的datagrid上单击某行,按SHIFT键不放,再单击另一行,则首尾两行之间记录全部选中;

稍麻烦的是整个过程的设计,和对easyui的datagrid控件熟悉,同时还有如何记录首尾两次单击的位置;

写下来方便日后参考....,懒人计划 : )



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值