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

[WinForms] 필터 > 온라인 스터디

본문 바로가기

5. 필터 및 그룹화 [WinForms] 필터

페이지 정보

작성자 GrapeCity 작성일 2021-10-26 11:05 조회 1,093회 댓글 0건

본문

Spread.NET에서는 스프레드시트와 사용자가 상호작용하는 다양한 측면을 사용자 정의할 수 있습니다. 예를 들면, 다음과 같은 항목이 있습니다.

  • 사용자 데이터 행 정렬 관리(Sort)

  • 사용자 데이터 행 필터링 관리(Filter)

  • 사용자 데이터 행 그룹화 관리(Grouping)

  • 행/열의 개요 관리(Outline, 또는 Range Group)

  • 데이터 검색 사용자 정의

본 포스팅에서는 Excel에서 자주 사용하는 기능인 필터에 대해 살펴보도록 하겠습니다.




Spread.NET 초기화

본격적인 내용을 살펴보기에 앞서, 본 포스팅에서 사용될 데이터 샘플을 만들어보겠습니다.

학생 데이터는 {int 학생코드, int 시험성적, int 과제성적, string 학점}으로 구성됩니다. 시험 성적과 과제 성적은 랜덤으로 부여되고, 학점은 두 성적의 합을 기준으로 80점 이상이면 A, 80미만 50점 이상이면 B, 나머지는 C 학점입니다. 물론, 실제로는 성적을 랜덤으로 결정하면 큰일나겠죠? ^^

  1. 새 프로젝트를 생성하고, 도구상자에서 FpSpread 컴포넌트를 드래그하여 Form으로 가지고 옵니다. ef1ebabf6273c16c7232abacc0970fdf_1635211219_9649.png

  2. 속성 패널에서 스프레드의 Dock 속성을 Fill로 설정하여 스프레드가 폼에 가득 차도록 합니다.

    ef1ebabf6273c16c7232abacc0970fdf_1635211346_2483.png


  3. InitializeSampleData 메소드를 생성합니다.

    private void InitializeSampleData()
    {
    // 이어지는 단계에 따라 메소드 내부를 채워나갑니다.
    }

  4. 데이터가 입력될 4개 열의 사이즈를 조정합니다. SetMultipleColumnWidths 메소드를 통해 여러 열의 너비를 한 번에 조정할 수 있습니다.

    인자로는 시작열, 열 개수, 열 너비가 사용됩니다.

    // 열 사이즈 설정
    fpSpread1.ActiveSheet.SetMultipleColumnWidths(0, 4, 100);

  5. 열 헤더명을 변경합니다. SetColumnLabel 메소드로 열 헤더명을 수정할 수 있습니다.

    // 열 헤더명 변경
    fpSpread1.ActiveSheet.SetColumnLabel(0, 0, "학생코드");
    fpSpread1.ActiveSheet.SetColumnLabel(0, 1, "시험점수");
    fpSpread1.ActiveSheet.SetColumnLabel(0, 2, "과제점수");
    fpSpread1.ActiveSheet.SetColumnLabel(0, 3, "학점");

  6. 데이터를 입력합니다. Random.Next(int maxValue) 메소드로, 0 이상 maxValue 이하 임의의 정수 값을 추출할 수 있습니다. 학생 10명에 대한 데이터를 입력하기 위해 for문을 사용합니다.

    // 데이터 입력
    Random rnd = new Random();
    int test, homework = 0;
    for (int index=0; index<10; index++)
    {
      //학생코드에 1부터 10까지 순차적으로 입력
      fpSpread1.ActiveSheet.Cells[index, 0].Value = index + 1;
      // 시험점수 입력: [0점, 70점]
      test = rnd.Next(70);
      fpSpread1.ActiveSheet.Cells[index, 1].Value = test;
      // 과제점수 입력: [0점, 30점]
      homework = rnd.Next(30);
      fpSpread1.ActiveSheet.Cells[index, 2].Value = homework;
      // 시험점수와 과제점수의 합으로 학점 도출
      // A: 80이상
      // B: 50이상 80미만
      // C: 50 미만
      if((test + homework) >= 80)
      {
      fpSpread1.ActiveSheet.Cells[index, 3].Text = "A";
      }
      else if ((test + homework) >= 50)
      {
      fpSpread1.ActiveSheet.Cells[index, 3].Text = "B";
      }
      else
      {
      fpSpread1.ActiveSheet.Cells[index, 3].Text = "C";
      }
    }

  7. Form()에서 정의한 InitializeSampleData 메소드를 호출합니다.

    public Form1()
    {
    InitializeComponent();
    InitializeSampleData();
    }


  8. 코드를 실행하여 아래와 같은 화면을 확인하실 수 있습니다. ef1ebabf6273c16c7232abacc0970fdf_1635211506_5369.png




필터


필터 기능을 통해 원하는 데이터만 표시할 수 있으며, 시트의 모든 열 또는 특정 열에 대하여 필터링을 허용할 수 있습니다. Spread.NET 필터에서는 필터 모드필터링된 행을 보여주는 방식을 변경할 수 있습니다. 또, 필터의 아이템 리스트의 항목을 정의하거나, 순서를 변경할 수 있고, 아이템 리스트 박스의 테두리 스타일 변경도 가능합니다.

Columns.AllowAutoFilter 속성을 true로 설정하여 필터 기능을 활성화할 수 있습니다. 아래 코드에서는 시험성적 열(1번 열)부터 3개 열에 자동필터를 설정하였습니다. 자동 필터를 허용했을 때 기본으로 보여지는 필터 모드는 EnhancedContextMenu 모드입니다.

// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정
fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true;

ef1ebabf6273c16c7232abacc0970fdf_1635140498_5465.gif
 


필터 모드

필터 모드 - 샘플 다운로드

Spread.NET에서 제공하는 필터 모드는 3가지 입니다. Spread.AutoFilterMode 속성을 사용하여 필터 모드를 변경할 수 있습니다.

  • FilterGadget

  • EnhancedContext Menu

  • FilterBar


각 필터 모드에 대해 알아보도록 하겠습니다.

FilterGadget

필터 모드 중 가장 간단한 필터 모드입니다. 필터 기능을 활성화했을 때, 열 헤더에 행 필터 인디케이터드롭다운 화살표가 보여집니다. 아래 표에서 네번째 열(학점 열)을 주목해 주시기 바랍니다.

  행 필터링 인디케이터

  설명

 ef1ebabf6273c16c7232abacc0970fdf_1635140788_6913.png

  행 필터링 기능을

  설정하지 않은 경우.

 ef1ebabf6273c16c7232abacc0970fdf_1635140793_7568.png

  행 필터링 기능을 설정했으나, 

  필터링된 행이 없는 경우.

 ef1ebabf6273c16c7232abacc0970fdf_1635140799_8601.png

  행 필터링 기능을 설정하고,

  몇몇 행이 필터링된 경우.


해당 인디케이터를 클릭하면 필터 선택 드롭다운 리스트가 나타납니다. 리스트로부터 항목을 선택하면 필터가 적용되며, 조건에 맞는 행이 필터링 됩니다. 기본 드롭다운 리스트는 필터가 적용된 열의 셀에 있는 고유한 텍스트 값들을 보여줍니다. 즉, 열에 {A, B, B, C, D}처럼 값 B가 여러 번 있는 경우에 드롭다운 리스트에는 {A,B,C,D}처럼 값 B가 한 번만 보여집니다. 

아래 코드를 사용하여 시험점수, 과제점수, 학점 열에 필터를 적용하고 필터 모드를 FilterGadget으로 적용해 보겠습니다. 이 모드에서는 열 하나당 하나의 값만 선택 가능하고, 동시에 여러 열에 대해서 필터를 적용할 수 있습니다.

// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정
fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true;
// 필터 모드를 FilterGadget으로 설정
fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.FilterGadget;


ef1ebabf6273c16c7232abacc0970fdf_1635142781_037.gif
 

EnhancedContextMenu

필터 모드를 EnhancedContextMenu으로 변경해 보겠습니다. Spread.AutoFilterMode의 속성값으로 EnhancedContextMenu를 입력합니다.

// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정
fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true;
// 필터 모드를 EnhancedContextMenu으로 설정
fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.EnhancedContextMenu;


ef1ebabf6273c16c7232abacc0970fdf_1635142841_1366.png
 

고급 필터링이 켜져 있으면 사용자는 위 그림과 같이 데이터에 적용할 사용 가능한 필터 목록을 드롭다운할 수 있습니다. 필터 목록은 열의 데이터 유형에 따라 다릅니다. 필터는 숫자, 텍스트, 날짜 또는 색상 필터일 수도 있습니다.

필터 목록의 사용자 지정 필터 메뉴를 클릭하여, 필터 조건을 사용자 정의 할 수도 있습니다. 조건에 와일드카드 문자를 사용할 수 있으며, "?"문자는 단일 문자를 나타내고, "*"문자는 일련의 문자를 나타냅니다.

ef1ebabf6273c16c7232abacc0970fdf_1635142884_9455.png
 

고급 필터에 정렬 대화 상자를 추가할 수 있습니다. 아래 두 줄의 코드를 추가하면, 정렬 인디케이터 모양이 변하면서 대화상자에 정렬 기능이 추가되어 있는 것을 확인하실 수 있습니다.

// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정
fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true;
// 필터 모드를 EnhancedContextMenu으로 설정
fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.EnhancedContextMenu;
// 필터에 정렬 대화상자 기능 추가
fpSpread1.ActiveSheet.AutoSortEnhancedContextMenu = true;
fpSpread1.ActiveSheet.Columns[1,3].AllowAutoSort = true;


ef1ebabf6273c16c7232abacc0970fdf_1635142908_4851.png
 

FilterBar

필터 모드를 FilterBar로 설정하면, 열 헤더 아래에 필터 표시줄이 생성됩니다. Spread.NET에서는 필터바의 모양을 사용자 정의할 수 있습니다. 정의할 수 있는 요소로는 배경색, 글자색, 그리드 선 및 그리드 색상 등이 포함됩니다.

필터바에서는 필터 메뉴 옵션(예: 이전, 이후, 같지 않음, 포함 등)을 선택하고, 필터의 편집 부분에 값을 입력하여 필터링 기능을 사용할 수 있습니다. 아래 코드를 사용하여 필터바를 보여주고 결과를 확인해 보겠습니다. Spread.AutoFilterMode의 속성값으로 FilterBar를 입력합니다.

// 필터 모드를 FilterBar으로 설정
fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.FilterBar;


ef1ebabf6273c16c7232abacc0970fdf_1635142938_8589.gif
 


필터링 불가 행 설정

필터링 불가 행 설정 - 샘플 다운로드

Excel을 사용할 때, 종종 행을 고정하여 합계나 평균 등의 정보를 표시하고, 필터 기능을 통해 원하는 조건에 맞는 행만 선택하여 정보를 조회하는 경우가 있습니다. 간단한 예시를 통해 고정 행을 필터링에 포함시키지 않도록 설정해보겠습니다.

  1. FrozenTrailingRowCount 속성 값으로, 시트 하단에 고정할 행 수를 입력합니다. 예제에서는 각 평균을 표시할 한 행만 고정합니다.

    • FrozenRowCount : 시트 상단에 고정할 행 수 설정

    • FrozenTrailingRowCount : 시트 하단에 고정할 행 수 설정

    // 고정행 설정
    fpSpread1.ActiveSheet.FrozenTrailingRowCount = 1;

    ef1ebabf6273c16c7232abacc0970fdf_1635143024_5965.gif

  2. UnfilteredRows로 필터링 불가 행을 설정합니다. unfilteredRows 속성 값으로는 필터링하지 않을 행의 인덱스 배열이 할당됩니다. 500번째 행을 필터링 불가 행으로 설정했을 때, 아래 gif 이미지와 같이 500번째 행은 필터링되지 않음을 확인할 수 있습니다.

    // 고정행 인덱스 구하기
    int lastRowIndex = fpSpread1.ActiveSheet.RowCount - 1;

    //필터링 불가행 설정
    int[] unfilteredRows = new int[1] { lastRowIndex };
    fpSpread1.ActiveSheet.RowFilter.UnfilteredRows = unfilteredRows;

    ef1ebabf6273c16c7232abacc0970fdf_1635143043_7017.gif

  3. 고정된 행에 텍스트와 수식을 입력합니다. Cells[row, column].Formula 속성을 사용해 수식을 입력할 수 있습니다. 예제에서는 필터 조건에 맞는 학생의 시험점수 평균 및 과제 점수 평균을 확인하기 위해, SUBTOTAL 함수를 사용했습니다. SUBTOTAL(101, range) 함수를 사용하면 숨겨지지 않은 값의 평균값을 구할 수 있습니다.

    // 고정행에 텍스트 및 수식(각 점수의 평균) 입력
    fpSpread1.ActiveSheet.Cells[lastRowIndex, 0].Text = "평균";
    fpSpread1.ActiveSheet.Cells[lastRowIndex, 1].Formula = "ROUND(SUBTOTAL(101, B1:B"+ lastRowIndex +"),2)";
    fpSpread1.ActiveSheet.Cells[lastRowIndex, 2].Formula = "ROUND(SUBTOTAL(101, C1:C"+ lastRowIndex +"),2)";

    ef1ebabf6273c16c7232abacc0970fdf_1635143052_2524.gif
     



지금 바로 Spread.NET을 다운로드하여 직접 테스트해보세요!

spnet.png

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

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

인기글

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