5. 필터 및 그룹화 [WinForms] 필터
페이지 정보
작성자 GrapeCity 작성일 2021-10-26 11:05 조회 1,105회 댓글 0건본문
관련링크
Spread.NET에서는 스프레드시트와 사용자가 상호작용하는 다양한 측면을 사용자 정의할 수 있습니다. 예를 들면, 다음과 같은 항목이 있습니다.
사용자 데이터 행 정렬 관리(Sort)
사용자 데이터 행 필터링 관리(Filter)
사용자 데이터 행 그룹화 관리(Grouping)
행/열의 개요 관리(Outline, 또는 Range Group)
데이터 검색 사용자 정의
본 포스팅에서는 Excel에서 자주 사용하는 기능인 필터에 대해 살펴보도록 하겠습니다.
Spread.NET 초기화
본격적인 내용을 살펴보기에 앞서, 본 포스팅에서 사용될 데이터 샘플을 만들어보겠습니다.
학생 데이터는 {int 학생코드, int 시험성적, int 과제성적, string 학점}으로 구성됩니다. 시험 성적과 과제 성적은 랜덤으로 부여되고, 학점은 두 성적의 합을 기준으로 80점 이상이면 A, 80미만 50점 이상이면 B, 나머지는 C 학점입니다. 물론, 실제로는 성적을 랜덤으로 결정하면 큰일나겠죠? ^^
속성 패널에서 스프레드의 Dock 속성을 Fill로 설정하여 스프레드가 폼에 가득 차도록 합니다.
InitializeSampleData 메소드를 생성합니다.
private
void
InitializeSampleData()
{
// 이어지는 단계에 따라 메소드 내부를 채워나갑니다.
}
데이터가 입력될 4개 열의 사이즈를 조정합니다. SetMultipleColumnWidths 메소드를 통해 여러 열의 너비를 한 번에 조정할 수 있습니다.
인자로는 시작열, 열 개수, 열 너비가 사용됩니다.
// 열 사이즈 설정
fpSpread1.ActiveSheet.SetMultipleColumnWidths(0, 4, 100);
열 헤더명을 변경합니다. SetColumnLabel 메소드로 열 헤더명을 수정할 수 있습니다.
// 열 헤더명 변경
fpSpread1.ActiveSheet.SetColumnLabel(0, 0,
"학생코드"
);
fpSpread1.ActiveSheet.SetColumnLabel(0, 1,
"시험점수"
);
fpSpread1.ActiveSheet.SetColumnLabel(0, 2,
"과제점수"
);
fpSpread1.ActiveSheet.SetColumnLabel(0, 3,
"학점"
);
데이터를 입력합니다. 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"
;
}
}
Form()에서 정의한 InitializeSampleData 메소드를 호출합니다.
public
Form1()
{
InitializeComponent();
InitializeSampleData();
}
필터
필터 기능을 통해 원하는 데이터만 표시할 수 있으며, 시트의 모든 열 또는 특정 열에 대하여 필터링을 허용할 수 있습니다. Spread.NET 필터에서는 필터 모드와 필터링된 행을 보여주는 방식을 변경할 수 있습니다. 또, 필터의 아이템 리스트의 항목을 정의하거나, 순서를 변경할 수 있고, 아이템 리스트 박스의 테두리 스타일 변경도 가능합니다.
Columns.AllowAutoFilter 속성을 true로 설정하여 필터 기능을 활성화할 수 있습니다. 아래 코드에서는 시험성적 열(1번 열)부터 3개 열에 자동필터를 설정하였습니다. 자동 필터를 허용했을 때 기본으로 보여지는 필터 모드는 EnhancedContextMenu 모드입니다.
// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정 fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true ; |
필터 모드
Spread.NET에서 제공하는 필터 모드는 3가지 입니다. Spread.AutoFilterMode 속성을 사용하여 필터 모드를 변경할 수 있습니다.
FilterGadget
EnhancedContext Menu
FilterBar
FilterGadget
필터 모드 중 가장 간단한 필터 모드입니다. 필터 기능을 활성화했을 때, 열 헤더에 행 필터 인디케이터와 드롭다운 화살표가 보여집니다. 아래 표에서 네번째 열(학점 열)을 주목해 주시기 바랍니다.
행 필터링 인디케이터 | 설명 |
행 필터링 기능을 설정하지 않은 경우. | |
행 필터링 기능을 설정했으나, 필터링된 행이 없는 경우. | |
행 필터링 기능을 설정하고, 몇몇 행이 필터링된 경우. |
해당 인디케이터를 클릭하면 필터 선택 드롭다운 리스트가 나타납니다. 리스트로부터 항목을 선택하면 필터가 적용되며, 조건에 맞는 행이 필터링 됩니다. 기본 드롭다운 리스트는 필터가 적용된 열의 셀에 있는 고유한 텍스트 값들을 보여줍니다. 즉, 열에 {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; |
EnhancedContextMenu
필터 모드를 EnhancedContextMenu으로 변경해 보겠습니다. Spread.AutoFilterMode의 속성값으로 EnhancedContextMenu를 입력합니다.
// 시험점수 열(1열)부터 3개 열에 대해 자동필터 설정 fpSpread1.ActiveSheet.Columns[1, 3].AllowAutoFilter = true ; // 필터 모드를 EnhancedContextMenu으로 설정 fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.EnhancedContextMenu; |
고급 필터링이 켜져 있으면 사용자는 위 그림과 같이 데이터에 적용할 사용 가능한 필터 목록을 드롭다운할 수 있습니다. 필터 목록은 열의 데이터 유형에 따라 다릅니다. 필터는 숫자, 텍스트, 날짜 또는 색상 필터일 수도 있습니다.
필터 목록의 사용자 지정 필터 메뉴를 클릭하여, 필터 조건을 사용자 정의 할 수도 있습니다. 조건에 와일드카드 문자를 사용할 수 있으며, "?"문자는 단일 문자를 나타내고, "*"문자는 일련의 문자를 나타냅니다.
고급 필터에 정렬 대화 상자를 추가할 수 있습니다. 아래 두 줄의 코드를 추가하면, 정렬 인디케이터 모양이 변하면서 대화상자에 정렬 기능이 추가되어 있는 것을 확인하실 수 있습니다.
// 시험점수 열(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 ; |
FilterBar
필터 모드를 FilterBar로 설정하면, 열 헤더 아래에 필터 표시줄이 생성됩니다. Spread.NET에서는 필터바의 모양을 사용자 정의할 수 있습니다. 정의할 수 있는 요소로는 배경색, 글자색, 그리드 선 및 그리드 색상 등이 포함됩니다.
필터바에서는 필터 메뉴 옵션(예: 이전, 이후, 같지 않음, 포함 등)을 선택하고, 필터의 편집 부분에 값을 입력하여 필터링 기능을 사용할 수 있습니다. 아래 코드를 사용하여 필터바를 보여주고 결과를 확인해 보겠습니다. Spread.AutoFilterMode의 속성값으로 FilterBar를 입력합니다.
// 필터 모드를 FilterBar으로 설정 fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.FilterBar; |
필터링 불가 행 설정
Excel을 사용할 때, 종종 행을 고정하여 합계나 평균 등의 정보를 표시하고, 필터 기능을 통해 원하는 조건에 맞는 행만 선택하여 정보를 조회하는 경우가 있습니다. 간단한 예시를 통해 고정 행을 필터링에 포함시키지 않도록 설정해보겠습니다.
FrozenTrailingRowCount 속성 값으로, 시트 하단에 고정할 행 수를 입력합니다. 예제에서는 각 평균을 표시할 한 행만 고정합니다.
FrozenRowCount : 시트 상단에 고정할 행 수 설정
FrozenTrailingRowCount : 시트 하단에 고정할 행 수 설정
// 고정행 설정
fpSpread1.ActiveSheet.FrozenTrailingRowCount = 1;
UnfilteredRows로 필터링 불가 행을 설정합니다. unfilteredRows 속성 값으로는 필터링하지 않을 행의 인덱스 배열이 할당됩니다. 500번째 행을 필터링 불가 행으로 설정했을 때, 아래 gif 이미지와 같이 500번째 행은 필터링되지 않음을 확인할 수 있습니다.
// 고정행 인덱스 구하기
int lastRowIndex = fpSpread1.ActiveSheet.RowCount - 1;
//필터링 불가행 설정
int[] unfilteredRows = new int[1] { lastRowIndex };
fpSpread1.ActiveSheet.RowFilter.UnfilteredRows = unfilteredRows;고정된 행에 텍스트와 수식을 입력합니다. 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)"
;
지금 바로 Spread.NET을 다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.