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

CheckBox 셀타입의 전체체크 기능에 대해서 질문드립니다. > Q&A | 토론

본문 바로가기

Spread.NET

Q&A | 토론

WinForms윈폼 CheckBox 셀타입의 전체체크 기능에 대해서 질문드립니다.

페이지 정보

작성자 편도준 작성일 2024-01-12 16:31 조회 69회 댓글 0건
제품 버전 : 13.45.20203.0
컨트롤 이름 : FpSpread CheckboxCellType

본문

안녕하세요 이번에 12 -> 13버전으로 덕분에 업그레이드하여

문제 없이 잘 사용 중에 감사드립니다.


FpSpread에 CellDoubleClick Event를 통해서 셀을 더블 클릭하였을 때 

해당 컬럼의 CellType이 CheckBoxCelltype인 셀들에 Value를 전부 true 혹은 false로

변경하는 함수를 작성중에 있는데 문제는 [그림 1]을 보시면

해당 컬럼에 CheckBoxCellType과 TextBoxCellType이 같이 있습니다.


밑의 코드처럼 해당 이벤트를 해주었으나 TextBoxCellType까지 같이 value값이 true로 지정되어

for문으로 celltype을 비교하여 checkbox인지 확인해 value값을 true로 변경하도록 수정해줬지만 행수가 기본적으로 2000개 이상이다 보니 속도가 많이 느려져서 for문으로는 도저히 안될 것 같습니다. 


혹시 해당 기능을 구현할 다른 방법이나 속성 값이 있는지 궁금합니다.

항상 성실한 답변 감사드립니다!

private void fpSp_CellDoubleClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
{
    fpSp.Sheets[0].Cells[0, e.Column, fpSp.Sheets[0].RowCount - 1, e.Column].Value = true;
}


[그림 1]
 

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

3 답변

WinForms윈폼 Re: CheckBox 셀타입의 전체체크 기능에 대해서 질문드립니다.

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

페이지 정보

작성자 MESCIUS써니 작성일 2024-01-16 16:10 댓글 0건

본문

편도준 님, 안녕하세요.

메시어스입니다.


셀 타입이 섞여있을 경우에 CheckBox 셀 타입에 대해서만 Value를 변경하려면, 말씀하신 것과 같이 반복문(for)과 조건문(if)을 활용하여 셀 타입을 체크하는 과정이 필요합니다.


다만 다음 샘플 코드로 테스트해본 결과, 10만 개의 셀에 대하여 셀타입 체크 후 값을 true/false로 변경하는 데 소요되는 시간은 1초 미만으로 확인되었습니다.

private void Form1_Load(object sender, EventArgs e)
{
    fpSpread1.Sheets[0].RowCount = 100000;
    FarPoint.Win.Spread.CellType.CheckBoxCellType check = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
    FarPoint.Win.Spread.CellType.TextCellType text = new FarPoint.Win.Spread.CellType.TextCellType();

    // 임의로 셀 타입 설정
    Random rand = new Random();
    for(int i = 0; i< fpSpread1.Sheets[0].RowCount; i++)
    {
        if (rand.NextDouble() > 0.5d)
            fpSpread1.Sheets[0].Cells[i, 0].CellType = check;
        else
            fpSpread1.Sheets[0].Cells[i, 0].CellType = text;
    }
            
    // CellDoubleClick 이벤트 추가
    fpSpread1.CellDoubleClick += FpSpread1_CellDoubleClick;
}

bool flag = false;

private void FpSpread1_CellDoubleClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
{
    // 첫번째 컬럼의 컬럼 헤더를 더블클릭했을 때, 전체 체크/해제
    if (e.ColumnHeader && e.Column == 0)
    {
        // 시간 측정 시작
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        // 레이아웃 로직을 일시정지
        fpSpread1.SuspendLayout();

        flag = !flag;
        for (int i = 0; i < fpSpread1.Sheets[0].RowCount; i++)
        {
            if(fpSpread1.Sheets[0].Cells[i, 0].CellType.ToString() == "CheckBoxCellType")
            {
                fpSpread1.Sheets[0].Cells[i, 0].Value = flag;
            }
        }
        // 레이아웃 로직 재시작
        fpSpread1.ResumeLayout();

        // 시간 측정 종료
        sw.Stop();
        MessageBox.Show("time : " + sw.ElapsedMilliseconds + "ms");
    }
}


이때 FpSpread.SuspendLayout() 메서드와 FpSpread.ResumeLayOut() 메서드를 사용하여 체크박스 셀의 값을 변경하는 동안 레이아웃 로직을 일시정지한다면, 시간을 조금 더 단축시킬 수 있습니다.


일전에 작성하셨던 코드와 본문의 샘플 테스트 코드를 비교하였을 때, 소요시간에 영향을 미칠만한 차이점이 있는지 확인 부탁드립니다.


항상 따뜻한 인사말과 함께 문의주심에 감사드리며,

평안과 뜻하시는 일 모두 이루어지는 2024년이 되시길 바랍니다.


감사합니다.

메시어스 드림

댓글목록

등록된 댓글이 없습니다.

WinForms윈폼 Re: CheckBox 셀타입의 전체체크 기능에 대해서 질문드립니다.

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

페이지 정보

작성자 편도준 작성일 2024-01-17 10:50 댓글 1건

본문

안녕하세요 

먼저 답변주셔서 감사합니다 ^^


해당 테스트 코드로 실행한결과는 문제없이 빠른 속도로 잘되었습니다.
근데 저희 코드 같은 경우는 같은 CellDoubleClick 이벤트를 해줬음에도 속도가 굉장히 느렸습니다. 

찾아보다가 저희 쪽 디자인에는 Spread에 FpSpread.StatusBarVisible = true로 적요되어있습니다. 이 속성값을 false로 바꿔주면 해당 코드가 빠른속도로 문제없이 잘 적용되는데 혹시 StatusBarVisible이 속도에 영향을 끼칠 수 있을까요 ???



댓글목록

MESCIUS써니님의 댓글

MESCIUS써니 작성일

편도준 님, 안녕하세요.

먼저, 테스트 결과를 공유해 주심에 감사드립니다.
StatusBarVisible 속성에 따라 처리 소요시간이 달라지는 현상에 대하여 확인 중입니다.
관련 내용이 업데이트되는대로 안내드리겠습니다.

감사합니다.
메시어스 드림

WinForms윈폼 Re: CheckBox 셀타입의 전체체크 기능에 대해서 질문드립니다.

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

페이지 정보

작성자 MESCIUS써니 작성일 2024-01-18 17:54 댓글 0건

본문

편도준 님, 안녕하세요.

메시어스 입니다.


문의하신 사항에 대하여 안내드립니다. 


StatusBar는 데이터 모델에서의 변경이 발생할 때마다, 해당 셀의 값을 업데이트하기 위해 값을 재계산합니다. 일례로 100개의 셀이 있다고 가정하면, 100번의 재계산(recalculate)이 발생함으로 인해 더 많은 시간이 소요됩니다.


StatusBar와 함께 전체 체크/해제 기능을 사용하셔야 하는 경우라면, 체크박스 셀의 Value를 변경하기 전에 StatusBar를 숨기고, Value를 변경한 후 StatusBar를 다시 보이는 방식을 고려해보시기 바랍니다.


아래는 샘플 코드입니다.

bool flag = false;

private void FpSpread1_CellDoubleClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
{
    if (e.ColumnHeader && e.Column == 0)
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        fpSpread1.SuspendLayout();
        fpSpread1.StatusBar.Visible = false;  //Don't set fpSpread1.StatusBarVisible which resume layout unexpectedly

        flag = !flag;
        for (int i = 0; i < fpSpread1.Sheets[0].RowCount; i++)
        {
            if (fpSpread1.Sheets[0].Cells[i, 0].CellType.ToString() == "CheckBoxCellType")
            {
                fpSpread1.Sheets[0].Cells[i, 0].Value = flag;
            }
        }

        fpSpread1.StatusBar.Visible = true; //Show the StatusBar again
        fpSpread1.ResumeLayout();

        sw.Stop();
        MessageBox.Show("time : " + sw.ElapsedMilliseconds + "ms");
    }
}


감사합니다.

메시어스 드림

댓글목록

등록된 댓글이 없습니다.

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