WinForms윈폼 다중시트, 다중셀 Clipboard Copy, Paste 질문
페이지 정보
작성자 cc22 작성일 2021-04-13 13:39 조회 6,488회 댓글 2건본문
관련링크
안녕하세요
스프레드로 인쇄 기능을 사용하고 싶어서 테스트 중에 잘 안되는 부분이 있어 질문 드립니다.
특정 출력양식을 스프레드 디자이너에서 미리 그려놓고,
사용자가 '인쇄' 버튼을 클릭할 시, 데이터를 양식에 맞춰 cell에 뿌려주려
아래의 순서로 테스트 해 봤는데 잘 됩니다.
1. "양식"시트를 제외한 모든 시트 삭제
2. "출력" 시트를 추가
3. SQL 쿼리 실행 및 "출력" 시트에 레코드 데이터 삽입 (다음페이지 추가 필요 시 3-1, 3-2 실행)
3-1. 위에서 미리 그려놓은 "양식" 시트에서 전체 범위 셀 AddSelection() 및 ClipboardCopy()
3-2. "출력" 시트에서 "양식" 시트와 같은 범위를 AddSelection() 및 ClipboardPaste()
위 내용으로는 (양식 시트를 1가지만) 잘 구동 되는데..
여러 양식이 필요한 경우를 테스트해보려
2개 양식을 미리 작성해놓고,
홀수페이지는 "양식01" 시트 복사, 붙여넣기
짝수페이지는 "양식02" 시트 복사, 붙여넣기
이렇게 테스트 해보면,
첫 페이지(1페이지) 용으로 복사했던 시트가 계속해서 붙여넣기 됩니다.
그리고 의아한 점은..
Visual studio에서 fpSpread1.ClipboardCopy(), fpSprad1.ClipboardPaste() 부분에
중단점을 설정해놓고 천천히 해보면
의도한 대로 잘 실행될때도 있고 (페이지 홀,짝에 따라서 시트 변경),
"요청한 클립보드 작업을 수행하지 못했습니다." 라는 메시지와 함께 붙여넣기 자체가 실행이 안되는 경우도 있습니다..
중단점을 모두 해제하고 실행했을 경우에는
여전히 최초에 복사한 시트만 계속해서 붙여넣어 집니다
복사, 붙여넣기 시 딜레이 때문인가 싶어
Task.Delay(2000); 또는 Thread.sleep(2000); 이런식으로 시간간격을 줘봐도 결과는 마찬가지입니다
그레이프시티 네이버카페, 구글링을 꽤 해봤는데 동일증상 case를 보지는 못했습니다..
제가 어느 부분을 놓치고 있는지..
잘못된 점이 있는건지 궁금합니다.
툴은 Visual Studio 2017 (C# WinForms)을 사용중이고,
스프레드는 Spread.NET 12 버전입니다.
아래에 소스 일부를 첨부합니다.
-----------------------------------------------------------------
private void initPageForm(SheetView jobSheet, SheetView formSheet, int stRowIdx = 0)
{ //페이지 변경 시 출력에 양식시트를 복사
jobSheet.RowCount += formSheet.RowCount;
jobSheet.ColumnCount = formSheet.ColumnCount;
copyCellstoCells(formSheet, jobSheet, stRowIdx); //formSheet=>jobSheet 범위셀 복사
}
private void copyCellstoCells(SheetView svFrom, SheetView svTo, Int32 toStRowIdx = 0)
{ //시트->시트 셀 범위 복사, 붙여넣기
int fromRowIdx = 0;
//양식 시트
svFrom.ClearSelection();
svFrom.AddSelection(0, 0, svFrom.RowCount - 1, svFrom.ColumnCount - 1);
svFrom.ClipboardCopy();
////출력 시트
svTo.ClearSelection();
svTo.AddSelection(toStRowIdx, 0, toStRowIdx + svFrom.RowCount - 1, svFrom.ColumnCount - 1);
svTo.ClipboardPaste();
//붙여넣기 후 선택범위 초기화
svFrom.ClearSelection();
svFrom.SetActiveCell(0, 0);
svTo.ClearSelection();
svTo.SetActiveCell(0, 0);
for (int i=toStRowIdx; i<=svTo.RowCount-1; i++) //양식과 rowheight, colwidth 맞추기
{
for(int j=0; j<=svTo.ColumnCount-1; j++)
{
svTo.Columns[j].Width = svFrom.Columns[j].Width;
}
svTo.Rows[i].Height = svFrom.Rows[fromRowIdx].Height;
fromRowIdx += 1;
}
}
private void ReadSQLData()
{
string Strsql = "";
int sheetSeq = 0;
int rowPp = 0, allDataCnt = 0, pageDataCnt = 0;
int dataRowsPerPage = 10; //페이지당 datarow 수
int pageCnt = 0, pageStRow = 0, pageEdRow = 0;
int frmDataStRow = 0, frmDataEdRow = 0;
//DB연결
//
//
//
//탭스트립 표시 활성화
fpSpread1.TabStripPolicy = TabStripPolicy.Always;
//시트 삭제(시트목록 초기화)
while (sheetSeq < fpSpread1.Sheets.Count)
{
if (!fpSpread1.Sheets[sheetSeq].SheetName.ToString().Contains("양식"))
{ //양식 시트 제외하고 삭제
fpSpread1.Sheets.Remove(fpSpread1.Sheets[sheetSeq]);
}
else
{
sheetSeq += 1;
}
}
//시트 추가
fpSpread1.AddNewSheetView(fpSpread1.Sheets.Count, "출력", 1, 1);
//시트 지정
SheetView form01 = fpSpread1.Sheets["양식01"];
SheetView form02 = fpSpread1.Sheets["양식02"];
SheetView prn = fpSpread1.Sheets["출력"];
prn.RowCount = 0;
fpSpread1.SuspendLayout();
////////출력 시트
Strsql = "Select PK_index, 부서명, 이름, PC노트북, 도입일자, 모델명" + vbCrLf +
" From TEST_SpdPrn" + vbCrLf +
" Order By PK_index" + vbCrLf;
SelectObj RecObj = new SelectObj(Db, Strsql);
while (RecObj.Read())
{
allDataCnt += 1;
if ((rowPp == 0) || (pageDataCnt % dataRowsPerPage == 0)) //처음 또는 이전페이지 완료 시
{
//새 페이지 : 양식폼-->출력폼 복사
pageCnt += 1; //페이지 수
if (pageCnt % 2 == 1)
{ //홀수페이지 => 양식01
frmDataStRow = 11;
dataRowsPerPage = 10;
frmDataEdRow = frmDataStRow + dataRowsPerPage - 1;
pageStRow = prn.RowCount; //페이지 시작 Row
initPageForm(prn, form01, pageStRow); //양식 복사
pageEdRow = prn.RowCount - 1; //페이지 종료 Row
}
else
{ //짝수페이지 => 양식02
frmDataStRow = 22;
dataRowsPerPage = 5;
frmDataEdRow = frmDataStRow + dataRowsPerPage - 1;
pageStRow = prn.RowCount; //페이지 시작 Row
initPageForm(prn, form02, pageStRow); //양식 복사
pageEdRow = prn.RowCount - 1; //페이지 종료 Row
}
rowPp = pageStRow + frmDataStRow; //데이터 출력 Row
pageDataCnt = 1; //페이지당 출력Cnt(현재)
}
else
{
rowPp += 1;
pageDataCnt += 1; //페이지당 출력Cnt(현재)
}
prn.Cells[rowPp, 0].Value = RecObj["PK_index"].ToString().Trim();
prn.Cells[rowPp, 1].Value = RecObj["부서명"].ToString().Trim();
prn.Cells[rowPp, 2].Value = RecObj["이름"].ToString().Trim();
prn.Cells[rowPp, 3].Value = RecObj["PC/노트북"].ToString().Trim();
prn.Cells[rowPp, 4].Value = RecObj["도입일자"].ToString().Trim();
prn.Cells[rowPp, 5].Value = RecObj["모델명"].ToString().Trim();
}
RecObj.Close();
//현재 활성화 시트 설정
fpSpread1.ActiveSheet = prn;
prn.SetActiveCell(0, 0);
//인쇄 실제 적용시에는
//탭스트립 visible false,
//activesheet visible false..
fpSpread1.ResumeLayout(true);
}
댓글목록
집념님의 댓글
집념 작성일
1번도 출력 탭 지우실 필요 없이 양식 탭 하나만 남겨두시고
위에서 2 -> 3번 순서로 가시기 전에 2.5 순서를 아래코드를 적용해보시고 2.5 순서가 3-1, 3-2 순서와 동일한 효과 이니 3-1.3-2 패스 하셔도 될것 같습니다.
다른 Sheet를 복사를 하실때에는 아래 코드가 현재 제일 좋은 성능으로 사용 중입니다.
FpSpread1.Sheets.Add(sv)