! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

다중시트, 다중셀 Clipboard Copy, Paste 질문 > Q&A | 토론

본문 바로가기

Spread.NET

Q&A | 토론

WinForms윈폼 다중시트, 다중셀 Clipboard Copy, Paste 질문

페이지 정보

작성자 cc22 작성일 2021-04-13 13:39 조회 6,488회 댓글 2건
제품 버전 : Spread.NET 12

본문

안녕하세요


스프레드로 인쇄 기능을 사용하고 싶어서 테스트 중에 잘 안되는 부분이 있어 질문 드립니다.


특정 출력양식을 스프레드 디자이너에서 미리 그려놓고,

사용자가 '인쇄' 버튼을 클릭할 시, 데이터를 양식에 맞춰 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를 복사를 하실때에는 아래 코드가 현재 제일 좋은 성능으로 사용 중입니다. 

' 오리지널 SheetView 복사
Dim sv As New FarPoint.Win.Spread.SheetView()
sv = Md_Spread.CopySheet(FpSpread1.Sheets(0))
sv.SheetName = i + 1

FpSpread1.Sheets.Add(sv)


Public Function CopySheet(ByVal sheet As FarPoint.Win.Spread.SheetView) As FarPoint.Win.Spread.SheetView
        Dim newSheet As FarPoint.Win.Spread.SheetView = Nothing

        Try
            If sheet IsNot Nothing Then
                newSheet = DirectCast(FarPoint.Win.Serializer.LoadObjectXml(sheet.[GetType](),
                    FarPoint.Win.Serializer.GetObjectXml(sheet, "CopySheet"), "CopySheet"), FarPoint.Win.Spread.SheetView)
            End If
            Return newSheet
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        Return newSheet

    End Function


cc22님의 댓글

cc22 작성일

감사합니다
1시트 대 1시트 복사가 아니라
n시트 대 1시트 복사를 해야해서
적어주신대로 직접 적용은 못했지만
해결하는데 많은 도움이 되었습니다 ^^

2 답변

WinForms윈폼 Re: 다중시트, 다중셀 Clipboard Copy, Paste 질문

추천0 이 글을 추천하셨습니다 비추천0 채택채택

페이지 정보

작성자 cc22 작성일 2021-04-15 15:06 댓글 0건

본문

자문자답 입니다.


다중Cell 대 다중Cell

Clipboard Copy & Paste 시

Paste시 iDataObject 부분을 명시적으로 직접 지정해주니 잘 됩니다.

중단점 걸고 한줄한줄 보느라 한참을 돌아왔네요..


svTo.SetActiveCell(toStRowIdx, 0, true);

            CellRange crT = new CellRange(toStRowIdx, 0, svFrom.RowCount - 1, svFrom.ColumnCount - 1);

            svTo.ClipboardPaste(ClipboardPasteOptions.All, svFrom.GetClipDataObject(false, crF, ClipboardCopyOptions.All), crT);

댓글목록

등록된 댓글이 없습니다.

WinForms윈폼 Re: 다중시트, 다중셀 Clipboard Copy, Paste 질문

추천0 이 글을 추천하셨습니다 비추천0 채택채택

페이지 정보

작성자 GCK루카스 작성일 2021-04-16 09:51 댓글 1건

본문

안녕하세요 그레이프시티입니다.


이미 해결이 되셨다니, 일찍 도움을 드리지 못해 죄송합니다.

늦었지만 문의 주신 사항에 대해 저희 편에서 확인 후 답변 전달 드립니다.

copyCellstoCells 메소드 내부의 코드를 아래와 같이 변경하여 사용 시 문제가 해결되었습니다.

먼저 작성해주신 답변과 같은 맥락이지만 참고해 주시기 바랍니다.

//양식 시트
svFrom.ClearSelection();
svFrom.AddSelection(0, 0, svFrom.RowCount, svFrom.ColumnCount);
//svFrom.ClipboardCopy();
var c = svFrom.GetClipDataObject(false, svFrom.GetSelection(0), ClipboardCopyOptions.All);

////출력 시트
svTo.ClearSelection();
svTo.AddSelection(toStRowIdx, 0, toStRowIdx + svFrom.RowCount, svFrom.ColumnCount);
//svTo.ClipboardPaste();
svTo.ClipboardPaste(ClipboardPasteOptions.All, c, svTo.GetSelection(0));

//붙여넣기 후 선택범위 초기화
svFrom.ClearSelection();
svFrom.SetActiveCell(0, 0);
svTo.ClearSelection();
svTo.SetActiveCell(0, 0);


다른 궁금한 점이 생기면, 언제든 문의 주시기 바랍니다.


감사합니다.

그레이프시티 드림

* 그레이프시티(GrapeCity)는 개발자를 위하여 ComponentOne(컴포넌트원), Spread(스프레드), ActiveReports(액티브리포츠), SpreadJS(스프레드JS), Wijmo(위즈모)와 같은 엑셀 스프레드시트 리포팅 그리드와 차트 등 다양한 종류의 .NET JavaScript(자바스크립트) 컴포넌트 툴을 생산하고있는 개발툴 전문 회사 입니다.

댓글목록

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.