Winforms윈폼 FlexGrid 데이터 필터링 - 필터 작업
추천0
페이지 정보
작성자 GCK써니 작성일 2022-04-21 09:23 조회 750회 댓글 0건본문
관련링크
그리드 필터링을 사용하면 열에 적용된 특정 조건에 따라 표시할 레코드의 범위를 좁힐 수 있습니다. 특정 유형의 레코드만 표시하여 데이터를 쉽게 분석할 수 있으므로, 빅테이터 셋의 경우 특히 유용합니다.
본문에서는 아래와 같은 필터 작업에 대하여 살펴보겠습니다.
- 필터 허용
- 코드 기반 필터링
- 특정 열에만 필터 활성화 하는 방법
- 특정 열에 필터 조건 설정하는 방법
- 사용자 정의 필터링
- 필터링 제거
샘플 프로젝트 생성
각각의 내용을 살펴보기에 앞서, 실습을 진행할 샘플 프로젝트를 생성합니다.
- 먼저 Form에 C1FlexGrid 컨트롤을 불러옵니다.
- 샘플 데이터를 바인딩합니다. 샘플 데이터로는 \Documents\ComponentOne Samples\Common 디렉터리에 있는 C1NWind.mdb 파일에 포함된 "Order" 데이터를 사용하겠습니다.
상세한 설명은 [WinForms] FlexGrid 시작하기에서 확인하실 수 있습니다. - .cs 파일에 아래의 코드가 자동으로 생성된 것을 확인할 수 있으며, 프로그램 실행 시 C1FlexGrid에 연결한 "Order" 데이터가 보여집니다.
// TODO: 이 코드는 데이터를 'c1NWindDataSet.Order' 테이블에 로드합니다. 필요 시 이 코드를 이동하거나 제거할 수 있습니다. this.orderTableAdapter.Fill(this.c1NWindDataSet.Order);
필터 작업
그리드의 데이터 필터링은 하기 두 가지 방법으로 수행할 수 있습니다.
- 필터 행
필터 행은 필터링 기준을 표시하기 위한 전용 행으로, 열 해더 바로 아래에 나타납니다. 따라서 사용자는 항상 필터링된 열과 현재 필터링 기준을 볼 수 있습니다. 다만, 필터 행을 표시하기 위한 추가적인 화면 공간이 사용됩니다. FlexGrid에서 사용자 정의 구현을 동해 쉽게 필터 행을 사용하실 수 있습니다. - 헤더 기반 필터
열 헤더 셀에 필터링 아이콘이 표시되어, 드롭다운에서 필터 지정 옵션을 제공하고, 특정 열에 필터가 적용되어있는지 여부가 나타납니다. 헤더 기반 필터는 C1FlexGrid에서 그리드의 AllowFiltering 속성을 사용하여 간단하게 설정할 수 있으며, 사용자의 필요에 따라 유연하게 커스터마이징할 수 있습니다. 자세한 내용은 이어지는 본문에서 살펴보겠습니다.
필터 허용
FlexGrid에서 필터링은 C1FlexGrid.AllowFiltering 속성을 true로 설정하여 활성화할 수 있습니다.
c1FlexGrid1.AllowFiltering = true;
이렇게 하면 그리드의 모든 열에서 기본 ColumnFilter가 활성화됩니다. ColumnFilter를 사용하면 런타임 시 ValuFilter 및 ConditionalFilter 중 하나를 선택하여 적용할 수 있습니다.
코드 기반 필터링
그리드의 AllowFiltering 속성은 그리드 필터링을 가능하게 하고, 가장 일반적인 경우에 사용할 수 있으나, 필요에 따라 필터 옵션을 추가로 미세 조정해야 하는 경우가 있습니다. 이때, 개별 열의 AllowingFilter 속성 및 Filter 속성을 수정하여 이를 수행할 수 있습니다. 두가지 예시를 살펴보겠습니다.
▶ 특정 열에 필터 활성화
코드를 사용하여, 데이터 유형이 문자열인 열에 대해서만 필터를 활성화해보겠습니다.
- 먼저 그리드에 필터를 허용합니다.
c1FlexGrid1.AllowFiltering = true;
- 조건문을 사용하여 열을 하나씩 탐색합니다. 조건문 내부에 다음 코드를 삽입합니다.
- 열의 데이터 타입이 string인 경우: 해당 열의 AllowFiltering 속성 값을 Default로 설정하여, ColumnFilter를 활성화 합니다.
- 열의 데이터 타입이 string이 아닌 경우: 해당 열의 AllowFiltering 속성 값을 None으로 설정하여, 해당 열에 대한 필터링을 비활성화 합니다.foreach(Column c in c1FlexGrid1.Cols) { c.AllowFiltering = c.DataType == typeof(string) ? AllowFiltering.Default : AllowFiltering.None; }
- 실행 결과, 데이터 유형이 문자열인 열에 대해서만 필터가 적용되어었음을 확인하실 수 있습니다.
▶ 특정 열에 필터 조건 설정
코드를 사용하여 필터 조건을 설정할 수 있습니다.
- 먼저 그리드에 필터를 허용합니다.
c1FlexGrid1.AllowFiltering = true;
- 새 ConditionalFilter 개체를 생성합니다.
ConditionFilter filter = new ConditionFilter();
- Operator 속성과 Parameter 속성을 사용하여, 필터의 첫번째 조건을 설정합니다. 예시에서는 "Visa"와 동일한 항목만 보여지도록 필터 조건을 설정하였습니다.
filter.Condition1.Operator = ConditionOperator.Equals; filter.Condition1.Parameter = "Visa";
- "PaymentType" 열에, 설정한 필터를 할당합니다.
c1FlexGrid1.Cols["PaymentType"].Filter = filter;
- 필터를 적용합니다.
c1FlexGrid1.ApplyFilters();
- 실행 결과, 다음과 같이 "PaymentType" 열에 입력된 값이 "Visa"인 항목들만 보여지는 것을 확인하실 수 있습니다.
사용자 정의 필터링
기본적으로 그리드에 필터링이 적용되면, 필터 기준에 맞지 않는 데이터가 포함된 행은 숨겨지고 필터 기준에 맞는 데이터만 화면에 보여집니다. 그러나 필요에 따라 필터링 된 데이터를 보여주는 방식을 커스터마이징해야 하는 경우가 있는데, 이때 FlexGrid의 BeforeFilter 이벤트와 AfterFilter 이벤트를 사용할 수 있습니다.
필터 조건에 맞지 않는 행을 숨기는 대신, 해당 행의 배경색과 폰트색상을 각각 회색과 진회색으로 변경하도록 설정해보겠습니다.
- 먼저 필터 조건에 맞지 않는 행에 적용할 스타일을 적용합니다.
// 필터에 의해 제외된 행에 대한 스타일을 생성합니다. var cs = c1FlexGrid1.Styles.Add( "filteredOut" ); cs.BackColor = Color.LightGray; cs.ForeColor = Color.DarkGray;
- BeforeFilter 이벤트를 정의합니다.
private void C1FlexGrid1_BeforeFilter(object sender, CancelEventArgs e) { // 컨트롤이 업데이트될 때까지 자체 업데이트를 방지하여 성능을 유지합니다. c1FlexGrid1.BeginUpdate(); }
- AfterFilter 이벤트를 정의합니다.
private void C1FlexGrid1_AfterFilter(object sender, EventArgs e) { // 필터링된 행을 표시하는 데 사용되는 스타일을 가져옵니다. var cs = c1FlexGrid1.Styles["filteredOut"]; // 필터링된 행에 대하여, filteredOut 스타일을 적용합니다. for (int r = c1FlexGrid1.Rows.Fixed; r < c1FlexGrid1.Rows.Count; r++) { var row = c1FlexGrid1.Rows[r]; if (row.Visible) { // 필터링 되지 않은 행에 대해서는 스타일을 초기화합니다. row.Style = null; } else { // 필터링된 행이 다시 보여지도록 한 후, 스타일을 적용합니다. row.Visible = true; row.Style = cs; } } // 컨트롤 업데이트를 재개합니다. c1FlexGrid1.EndUpdate(); }
- 코드를 실행한 후 필터를 적용해보면, 필터 조건에 맞지 않는 행이 숨겨지는 대신, 설정한 색상으로 변경되는 것을 확인하실 수 있습니다.
필터링 제거
사용자는 각 컬럼 필터 UI에 주어진 "Clear" 옵션을 사용하여, 런타임 시 컬럼 필터링을 제거할 수 있습니다. 또는 하기 코드와 같이 FlexGrid의 FilterDefinition 속성에 빈 문자열을 전달하여, 전체 그리드의 필터링을 제거할 수 있습니다.
// 필터 정의를 빈 문자열로 설정하여 필터링을 제거합니다. c1FlexGrid1.FilterDefinition = string .Empty;
다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.