반응형
그리드에서 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; }
반응형
'IT > xPlatform' 카테고리의 다른 글
xPlatform 그리드 Line 동적으로 그리기 (0) | 2020.06.05 |
---|---|
xPlatform 동적으로 Div 생성(복사), 이벤트 등록, BindItem 생성 (1) | 2020.06.01 |
xPlatform 동적 그리드 생성하기 (0) | 2020.06.01 |
xPlatform 콤보 대소문자 구별 없이 필터하기 (0) | 2020.06.01 |
xPlatform 그리드 가로 병합 (0) | 2020.06.01 |
댓글