본문 바로가기
IT/xPlatform

xPlatform 그리드 복사/붙여넣기

by heavenLake 2020. 5. 26.
반응형

그리드에서 onkeydown이벤트를 통해 밑에 fn_grdCopyPasteData() 함수를 호출하면 된다.

 

1. 그리드 selecttype이 area, multiarea를 권장한다.

2. 그리드 해당 셀 edittype이 none이거나 검색 불가하면 복붙하지 않는다.

3. 그리드 해당 셀 edittype이 checkbox이면 복붙값이 있으면 무조건 1로 판단한다.

4. 그리드 해당 셀이 number타입이고 숫자면 ,를 제거후 복붙한다.

5. 그리드 해당 셀이 combo이면 해당 combo에 데이타셋에 값이 존재해야만 복붙한다.

 

 

 

var v_tmpStrClipboard="";

/**---------------------------------------------------------------------
* 기능 :  Grid Cell Copy & Paste
* 인수 :  oGrid			: Grid
----------------------------------------------------------------------*/
function fn_grdCopyPasteData(obj,e)
{
	//trace("call fn_grdCopyPasteData");
	var sSeparator 	=	"	";
	// Ctrl C
	if(e.ctrlKey && e.keycode == 67) 
	{
		gfn_gridCopyClipboardDt(obj, sSeparator);
	}
	
	
	// Ctrl V
	else if (e.ctrlKey && e.keycode == 86) 
	{
		gfn_gridPasteClipboardDt(obj, sSeparator);
	}
}


/**---------------------------------------------------------------------
* 기능 :  Grid Cell Copy 실행
* 인수 :  oGrid			: Grid
----------------------------------------------------------------------*/
function gfn_gridCopyClipboardDt(objGrid, strSeparator) {
	
	var orgDataset = eval(objGrid.binddataset);
	var strColID;
	var strValue;
	var strClipboard = "";
	var nAreaStartRow;
	var nAreaEndRow;
	var nAreaStartCol;
	var nAreaEndCol;

	if(objGrid.selecttype == "area" || objGrid.selecttype == "multiarea") {
		nAreaStartRow = objGrid.selectstartrow[0];
		nAreaEndRow   = objGrid.selectendrow[0];
		nAreaStartCol = objGrid.selectstartcol[0];
		nAreaEndCol   = objGrid.selectendcol[0];
	} else {
		nAreaStartRow = 0 ;
		nAreaEndRow   = orgDataset.getRowCount() - 1;
		nAreaStartCol = 0;
		nAreaEndCol   = orgDataset.getColCount() - 1;
	}
	//trace("nAreaStartRow:"+nAreaStartRow+",nAreaEndRow:"+nAreaEndRow+",nAreaStartCol:"+nAreaStartCol+",nAreaEndCol:"+nAreaEndCol);
	//에디트 모드에서 한행에서만 카피할경우 => 일반 텍스트 카피로 간주.
	if(objGrid.getEditCaret()!=undefined && nAreaStartRow==nAreaEndRow && nAreaStartCol==nAreaEndCol)	//getEditCaret : undefined ->edit 모드가 아닐때
	{
		return;
	}

	for(var nRow = nAreaStartRow; nRow <= nAreaEndRow; nRow++) {
		for(var nCell = nAreaStartCol; nCell <= nAreaEndCol; nCell++) {
			strColID = objGrid.getCellProperty("body",nCell,"text");
			strValue = orgDataset.getColumn(nRow,strColID.substr(5));
			
// 			if(strValue.indexOf("\n")>0 && nAreaStartRow!=nAreaEndRow) 
// 			{
// 				strValue = strValue.replace("\r\n","\n");		//엑셀에 붙여넣기 한후 다시 엑셀에서 그리드로 카피시 개행되는걸 막기위해.
// 				strValue = "\""+strValue+"\"";
// 			}
			strValue = UtilMisc.isEmpty(strValue)?"":new String(strValue);
			//trace(strValue);
			strValue = UtilMisc.isEmpty(strValue)?strValue:strValue.replace(String.fromCharCode(13,10),String.fromCharCode(13));	// 복붙할때 한셀에 개행된 문자split 되지 안고 한셀에 넣기 위해 변환.
			strClipboard = strClipboard + ((UtilMisc.isEmpty(strValue))?"":strValue) + strSeparator;
		}
		strClipboard = strClipboard.substr(0,strClipboard.length-1);
		strClipboard = strClipboard + "\r\n";//20200319 excel과 타이똑같게 맞춤 asis -> ((nRow == nAreaEndRow)?"":""+String.fromCharCode(13,10));	//textArea에 일반 개행문자와 구분 짓기 위해서 뒤에 28(alt)을 더 붙여준다.
	}
	
	//strClipboard = strClipboard.substr(0,strClipboard.length-1);
	this.v_tmpStrClipboard = strClipboard; 
	//trace(strClipboard);
	system.setClipboard("CF_UNICODETEXT",strClipboard); 
	return;
}

/**---------------------------------------------------------------------
* 기능 :  Grid Cell Paste 실행
* 인수 :  oGrid			: Grid
----------------------------------------------------------------------*/
function gfn_gridPasteClipboardDt(objGrid, strSeparator, arrEditColor) 
{
	//sleep(200);
	var orgDataset = eval(objGrid.binddataset);
	var ClipboardType = "";
	var nSearchRow = 0;
	var nSearchCol = 0;
	var strColID;
	var strValue;
	var strBgColor; 
	var strClipboardData = system.getClipboard("CF_UNICODETEXT");

	if(v_tmpStrClipboard != strClipboardData){
		ClipboardType = "EXCEL";
	} 
	
	if(UtilMisc.isEmpty(strClipboardData)) return;
	  
	//trace("ClipboardType:"+ClipboardType);
	//trace("strClipboardData : ["+strClipboardData+"]");
	var strClipboardRecord = strClipboardData.split("\r\n");//20200319  excel과 타이똑같게 맞춤 asis ->(ClipboardType=="EXCEL")? strClipboardData.split("\r\n"): strClipboardData.split(String.fromCharCode(13,10));  //fn_gridCopyClipboardDt 함수에서 Row 끝을 28(alt)로 끝냄. 
	var strClipboardColunm;
	var nAreaStartRow;
	var nAreaEndRow;
	var nAreaStartCol;
	var nAreaEndCol; 
	//trace("strClipboardRecord : ["+strClipboardRecord+"]");

	if(objGrid.selecttype == "area" || objGrid.selecttype == "multiarea") {
		nAreaStartRow = objGrid.selectstartrow;
		nAreaEndRow   = objGrid.selectendrow;
		nAreaStartCol = objGrid.selectstartcol;
		nAreaEndCol   = objGrid.selectendcol;
	} else {
		nAreaStartRow = 0 ;
		nAreaEndRow   = orgDataset.getRowCount() - 1;
		nAreaStartCol = 0;
		nAreaEndCol   = orgDataset.getColCount() - 1;
	}
	
	var sEditType = objGrid.getCellProperty("body", nAreaStartCol, "edittype");
		
	var bOneRowCopy  = false;
	var nWriteEndRow = (eval(nAreaStartRow) + eval(strClipboardRecord.length));
	var nWriteEndCol = eval(nAreaStartCol) + eval(String(strClipboardRecord[nSearchRow].split(strSeparator)).length);	

	if(strClipboardRecord.length == 1) {
		bOneRowCopy = true;
		nWriteEndRow = parseInt(nAreaEndRow) + 1;
		nWriteEndCol = parseInt(nAreaEndCol) + 1;		
	} 
	 
	var nBeforeColLeng = -1;
	var objDsCmb = null; 
	var sCmbCode = null;  
	var sEditType = null;
	
	//trace("nAreaStartRow:"+nAreaStartRow);
	//trace("nWriteEndRow:"+nWriteEndRow);
	
	//system.clearClipboard();
	for(var nCurRow = nAreaStartRow; nCurRow < nWriteEndRow; nCurRow++) {
		strClipboardColunm = strClipboardRecord[nSearchRow].split(strSeparator);  
		
		if(strClipboardRecord.length==1 && strClipboardColunm.length==1 && !UtilMisc.isEmpty(objGrid.getEditCaret()) )	return; // 한셀만 붙여넣기고 입력모드가 아니면일반 붙여놓기로 판단하여 종료..
		
		nSearchCol = 0;
		var nAreaCell = eval(nAreaStartCol) + eval(strClipboardColunm.length);
		if(nBeforeColLeng==-1) nBeforeColLeng = strClipboardColunm.length;
		
		if(strClipboardColunm.length!=nBeforeColLeng) break; // 앞에 컬럼 배열길이와 현 배열길이가 틀리면 끝에 필요없는 엔터값... 종료.

		for(var nCell = nAreaStartCol; nCell < objGrid.getFormatColCount(); nCell++) {
		
			if(objGrid.getCellProperty("body",nCell,"text") != "undefined" && objGrid.getCellProperty("body",nCell,"text") != null){
				strColID = objGrid.getCellProperty("body",nCell,"text").substr(5);
			}
			
			strValue = strClipboardColunm[nSearchCol]; 
			//trace(nCurRow+","+nCell+":["+strValue+"]");

			if(strValue != "undefined"  ) 
			{
				//trace("ClipboardType:"+ClipboardType);
				//20200319  excel과 타이똑같게 맞춤 asis -> if(strValue != null &&!(ClipboardType=="EXCEL"&&(nCurRow+1)==(eval(nAreaStartRow) + eval(strClipboardRecord.length))))	//excel인경우 마지막에 엔터값이 넘어온다.
				if(strValue != null &&!((nCurRow+1)==(eval(nAreaStartRow) + eval(strClipboardRecord.length))))	//null체크 and 마지막 빈값 개행줄체크.
				{ 
				//trace("=>>>"+nCurRow+","+nCell+":["+strValue+"]");
					
					
					sEditType = objGrid.getCellProperty("body",nCell,"edittype");
					
					
					//trace(nCell+" sEditType :"+sEditType);
					if(sEditType != "none"  && !UtilMisc.isEmpty(sEditType))		//사용자가 수정할수 없는 셀은 복붙 막기.
					{					 
						//trace(nCurRow+" / "+strColID); 
						orgDataset.setColumn(nCurRow,strColID,null);  //초기에 null 처리 안하면 맨처음 셀에 간헐적으로 일반(전체데이터가) 붙여넣기로 들어감.
						
						//strValue = strValue.replace(String.fromCharCode(13),"");
						//trace(nCurRow+" / "+strColID);
						
						var nIdxStartQ = strValue.indexOf("\"")
						var nIdxLastQ  = strValue.lastIndexOf("\"")
						if(nIdxStartQ==0 && nIdxLastQ==strValue.length-1)
						{
							strValue = strValue.substring(1,strValue.length-1);	// 엑셀에서 한셀에 엔터값이 있을경우 더블쿼테이션이 붙어서 오는데 그걸 삭제하고 붙인다.
						}
										
						
//						var sDisplayType = objGrid.getCellProperty("body",nCell,"displaytype");
//						trace("sDisplayType:"+sDisplayType);
// 						trace("orgDataset.name111:"+orgDataset.name);
// 						if(sDisplayType.toUpperCase().indexOf("EXPR")==0 && sDisplayType.toUpperCase().indexOf("CURROW") >0 && sDisplayType.toUpperCase().indexOf(orgDataset.name) >0 )
// 						{
// 								trace("sDisplayTypeExp");
// 							try
// 							{
// 								var sDisplayTypeExp = eval(sDisplayType.repalce(currow,"nCell"));
// 								trace("sDisplayTypeExp:"+sDisplayTypeExp);
// 								
// 								if(U!tilMisc.isEmpty(sDisplayTypeExp))sDisplayType = sDisplayTypeExp;
// 							}
// 							catch(e)
// 							{
// 							} 
// 						}
						
						
						//trace(objGrid.getCellProperty("body",nCell,"edittype"));
						if(sEditType == "checkbox")	//체크박스인경우 값이 있으면 1로 판단.
						{
							
							orgDataset.setColumn(nCurRow,strColID,(UtilMisc.isEmpty(strValue)?"0":"1"));
						}
						else if( objGrid.getCellProperty("body",nCell,"displaytype") == "number" && !UtilMisc.isEmpty(strValue))	//넘버타입이면 ,제거
						{
							//넘버 타입일 경우 숫사가 아니면 null 처리
							strValue = strValue.replace(",","");
							
							if(isNaN(strValue))
							{
								orgDataset.setColumn(nCurRow,strColID,null); 
							}
							else
							{
								orgDataset.setColumn(nCurRow,strColID,strValue.trim()); 
							}
						}
						else if(objGrid.getCellProperty("body",nCell,"displaytype") =="combo" && !UtilMisc.isEmpty(strValue))	
						{	 
							try
							{
								//콤보 타입일 경우 콤보에 없는 값이면 값을 null처리.
								objDsCmb = eval(objGrid.getCellProperty("Body",nCell,"combodataset")); 
								sCmbCode = objGrid.getCellProperty("Body",nCell,"combocodecol");  
								if(UtilMisc.isEmpty(objDsCmb) || UtilMisc.isEmpty(sCmbCode) || !(objDsCmb instanceof Dataset))	
								{ 
									//orgDataset.setColumn(nCurRow,strColID,strValue.trim());
									orgDataset.setColumn(nCurRow,strColID,null);
								}
								else if(objDsCmb.findRow(sCmbCode,strValue)<0) 	
								//else if(objDsCmb.findRowExpr(sCmbCode+"=='"+strValue.toUpperCase+"'")<0) 	//toUpperCase
								{
									orgDataset.setColumn(nCurRow,strColID,null);
								}
								else
								{
									orgDataset.setColumn(nCurRow,strColID,strValue.trim());
								}
							}
							catch(e)
							{
							}
						}
						else 
						{ 
							if(UtilMisc.isEmpty(strValue))
							{ 
								orgDataset.setColumn(nCurRow,strColID,strValue);
							}
							else
							{ 
								orgDataset.setColumn(nCurRow,strColID,strValue.trim());
							}
						}
					}
				}
				//if(!bOneRowCopy){
				//	nSearchCol++;
				//} 
				
			}	
			nAreaCell++;  
			nSearchCol++;
			//}
			if(nSearchCol == strClipboardColunm.length)
			{
				break;
			} 
			
		}//for(var nCell = nAreaStartCol; nCell < objGrid.getFormatColCount(); nCell++) {
		if(!bOneRowCopy){
			nSearchRow++;
		}
	}
	//system.setClipboard("CF_TEXT", strClipboardData);
	objGrid.showEditor(false);	//에디터 모드에서 나와야 함. 그래야 마스크등 이벤트등으로 변경된 값이 제대로 보임.
	
	return;	
}

 

 

반응형

댓글