WPF 피벗 그리드에서 데이터를 구성하고 편집하는 방법
페이지 정보
작성자 GrapeCity 작성일 2021-10-21 15:02 조회 2,922회 댓글 0건본문
첨부파일
관련링크
데이터 분석은 기본적으로 대량 데이터를 평가하고 미래 작업을 효율적으로 계획할 기회를 제공하는 결론을 도출해야 합니다. 가장 흔한 예는 수백만 개의 레코드로 구성된 다국적 회사의 전년도 매출 분석일 수 있습니다. 원시 데이터를 간단하게 검토하는 것만으로는 결론에 도달할 수 없습니다. 전년도에 기장된 분기별 수익이나 최고 매출 국가 등의 데이터 분석과 관련된 몇 가지 질문에 대답하는 방식으로 데이터를 구성하고 수치를 집계해야 합니다.
에서 제공하는 을 사용하면 가능한 최상의 방식으로 데이터를 분석하기 위해 수백만 개의 레코드를 여러 방법으로 구성하고 집계할 수 있습니다. 사용자 편의를 위해 데이터 분석 결과를 그리드, 차트 또는 보고서로 제공할 수 있습니다. 에서 컨트롤이 제공하는 아키텍처와 강력한 기능 집합을 자세히 살펴볼 수 있습니다. 다음 FlexPivot 컨트롤 빠른 보기에서 시작하십시오.
이 블로그에서는 FlexPivot이 제공하는 범위 그룹화 기능을 중점적으로 살펴보겠습니다. 요약 제품인 FlexPivot은 기본적으로 데이터를 그룹화하여 의미 있는 집계를 계산합니다. 범위 그룹화 기능은 조건에서 정의된 범위로 문자열, 숫자, 날짜/시간 또는 기타 데이터 형식을 그룹화하는 옵션을 사용자에게 제공하여 요약과 집계를 더욱 향상시킵니다.
숫자 데이터를 100~200, 200~300 등의 범위로 그룹화할 수 있습니다. 년, 월, 분기 또는 주의 날짜 범위를 만들 수 있습니다. 알파벳 그룹화를 사용하여 문자열 값을 그룹화할 수 있습니다. 마지막으로, 범위 그룹화에서 사용자 정의 로직을 정의하여 값을 그룹화하면 모든 범위 그룹화 조건을 제어할 수 있습니다.
FlexPivot은 클래스의 속성과 을 제공하여 위 유형의 범위 그룹화를 지원합니다. 모든 API 멤버에 대한 자세한 내용은 설명서의 주제를 참조하십시오.
범위 그룹화 기능, 기능의 필요성, C#을 사용한 구현을 이해하기 위해 실시간 시나리오로 작업해 봅시다.
사용 사례
2020년에 코로나19가 전 세계를 강타했습니다. 그 이후로 이 치명적인 바이러스에 대응하는 과정에서 이뤄진 모든 기술 발전이 시스템에 깊이 통합되었습니다.
여러 조직이 다양한 목적으로 모든 관련 데이터를 수집하고 분석했기 때문입니다. 일례로, 환자 치료에 필요한 모든 의료 리소스를 준비하기 위해 증가하거나 감소하는 확진자 수를 분석하고 있습니다.
다른 예로, 위기 상황을 원활하게 처리하기 위해 인구와 사용 가능한 리소스를 비교하고, 상황의 심각도를 파악하기 위해 사망률을 모니터링하고, 코로나19의 추가 확산을 통제하기 위해 적절한 조치를 시행하고 있습니다.
시간이 지나 코로나바이러스 백신이 개발되고 백신 접종을 위해 전 세계에 배포되면서 코로나19 데이터 분석의 차원이 한 단계 높아졌습니다. 정부와 제약 업계에서 해당 국가의 백신 접종 프로그램을 계획하고 백신 가용성을 관리하는 데 데이터 분석이 어떻게 도움이 되는지를 확인하기 위해 이 측면을 살펴보겠습니다.
신뢰할 수 있는 전 세계 리소스에서 코로나19 데이터를 수집하는 에서 가져온 대량 원시 데이터에서 검색된 다음 제한된 행 집합을 확인합니다.
여기서 두 가지 데이터 형식을 관찰할 수 있습니다.
왼쪽에는 다양한 국가의 일일 백신 접종자 수가 나와 있습니다. 오른쪽에는 다양한 국가의 일일 백신 접종자 수가 연령대별로 나와 있습니다. 원시 데이터의 전체 집합을 적절하게 그룹화하고 집계할 경우 현재 전 세계 백신 접종 상황의 평가에 도움이 되는 몇 가지 질문이 아래에 나와 있습니다.
전 세계 백신 접종자 수는 몇 명입니까?
이 백신 접종자 수에 도달하는 데 얼마나 오래 걸렸습니까?
각 국가에서 백신 접종률이 가장 높은 연령대와 가장 낮은 연령대는 무엇입니까?
위 질문에 대한 답변은 제약 회사에서 생산 계획을 세우는 데 도움이 될 수 있습니다. 그와 동시에 정부가 필요한 개수의 백신을 적시에 예약하는 데에도 유용할 수 있습니다.
이 예제는 강력한 데이터의 매우 기본적인 분석이며, 더 많은 질문에 대답할 수 있습니다.
데이터를 보기만 해도 위의 질문에 모두 대답할 수 있도록 FlexPivot과 범위 그룹화 기능을 사용하여 이 데이터를 구성하고 집계하는 방법을 살펴보겠습니다. FlexPivot으로 만든 최종 데이터 표현 보기를 빠르게 살펴보면 다음과 같으며, 위에 명시된 질문에 쉽게 대답할 수 있습니다.
첫 번째 보기: 전 세계 총 백신 접종자 수 분석
아래 스크린샷에는 2021년 8월까지 2년간 전 세계 총 백신 접종자 수가 분기별로 명확하게 나와 있습니다.
두 번째 보기: 다양한 국가의 연령대별 총 백신 접종자 수 분석
다음 스크린샷은 2021년 8월까지 다양한 국가의 연령대별 백신 접종자 수를 보여 줍니다.
이후 섹션에서는 FlexPivot과 범위 그룹화 기능을 사용하여 원시 데이터에서 위 데이터 표현 보기를 만드는 방법을 둘 다 설명합니다.
FlexPivot 시작하기
FlexPivot 컨트롤 작업을 시작하려면 .Net Core WPF 응용 프로그램을 만들고 NuGet 패키지 관리자로 C1.WPF.Pivot 패키지를 설치해야 합니다.
필요한 패키지를 설치하면 WPF 컨트롤이 도구 상자에 추가됩니다. WPF 응용 프로그램에 추가된 기본 창인 MainWindow.xaml에 도구 상자의 FlexPivotPage 컨트롤을 끌어서 놓습니다. 자세한 내용은 설명서의 주제를 참조하십시오.
데이터에 FlexPivot 바인딩
FlexPivot 컨트롤을 데이터 표나 데이터 엔진에 바인딩하여 데이터에 바인딩할 수 있습니다. 동일한 내용을 설명하는 설명서 를 참조하십시오.
위 시나리오를 구현하기 위해 웹 사이트에서 관련 csv 파일을 다운로드하고 정보를 가져와 데이터베이스를 만들었습니다.
따라서 아래 코드에 설명된 대로 FlexPivot 컨트롤을 관계형 데이터베이스에 바인딩하겠습니다.
//Establish connection to database and fetch data OleDbConnection oconn = new OleDbConnection(); oconn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=VaccinationData.mdb"; var da = new OleDbDataAdapter("select * from vaccinations", oconn); var vaccinationSet = new DataTable(); da.Fill(vaccinationSet); da.SelectCommand = new OleDbCommand("select * from [vaccinations-by-age-group]", oconn); var vaccinationSubset = new DataTable(); da.Fill(vaccinationSubset); //Bind the datatable to FlexPivot's C1PivotEngine var fpEngine = flexPivotPage1.FlexPivotPanel.C1PivotEngine; fpEngine.DataSource = vaccinationSet.DefaultView;
FlexPivot 컨트롤을 데이터 소스에 바인딩한 후 모든 데이터 소스 필드가 FlexPivotPanel에 표시되기 시작하는 것을 관찰합니다.
FlexPivotPanel과 FlexPivot의 아키텍처를 구성하는 기타 요소를 이해하려면 설명서 를 참조하십시오.
아래 이미지는 FlexPivotPanel에 채워진 필드를 보여 줍니다.
FlexPivotField를 추가하여 보기 만들기
이 섹션에서는 FlexPivotPage에 PivotField를 RowField, ColumnField 또는 ValueField로 추가하여 보기를 생성하는 방법을 설명합니다. 필드 설정을 적용하여 범위 그룹화 기능을 구현하는 방법도 설명합니다. 위에서 설명한 보기를 디자인하려면 여러 필드에 범위 그룹화를 적용해야 합니다. 이후 섹션에서는 각 보기에 대해 자세히 설명합니다.
PivotField를 추가하여 기본 정보 표시
첫 번째 보기에 표시할 기본 정보는 국가 이름과 각 국가의 백신 접종자 수입니다. 이 작업을 위해 location 필드를 RowField로, people_fully_vaccinated 필드를 ValueField로 추가하겠습니다.
정보가 적절한 형식으로 표시되도록 두 필드의 Caption 및 Width 속성도 설정합니다. 다음은 동일한 내용을 구현하는 코드 조각입니다.
//Bind FlexPivotPage to data fpEngine.DataSource = dt.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("location"); fpEngine.RowFields[0].Caption = "Country"; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated"; fpEngine.ValueFields[0].Width = 200;
다음과 같은 보기가 생성되어 FlexPivotGrid에 표시됩니다.
위 이미지에서 각 국가에 해당하는 데이터 항목과 특정 국가에 해당하는 모든 행의 people_fully_vaccinated 필드 값을 더한 해당 국가의 백신 접종자 수를 표시하기 위해 FlexPivot에서 원시 데이터를 요약한 방식을 관찰할 수 있습니다.
따라서 FlexPivot은 데이터 형식을 기준으로 암시적 그룹화와 집계를 구현합니다.
지역별 국가 그룹화
위에서 생성한 보기의 국가는 그룹화되지 않습니다. 이 섹션에서는 보다 요약된 형태의 데이터와 집계를 위해 범위 그룹화를 사용하여 국가를 지역으로 그룹화하는 방법을 설명합니다.
각 국가에 해당하는 지역을 저장하는 데이터베이스 필드가 있는 경우 FlexPivot에서 국가를 지역으로 그룹화할 수도 있습니다. 이 사례에서는 해당 목적에 맞는 continent 필드가 있으므로 국가와 집계를 지역별로 그룹화하는 RowField로 이 필드를 추가하기만 하면 됩니다. 다음은 동일한 내용을 구현하는 샘플 코드입니다.
//Bind FlexPivot to data fpEngine.DataSource = dt.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("continent"); fpEngine.RowFields[0].Caption = "Continent"; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated"; fpEngine.ValueFields[0].Width = 200;
위 코드를 실행하면 다음 보기가 생성됩니다.
요약 보기를 위해 location 필드를 제거했지만 국가와 함께 지역을 표시하려는 경우 continent와 location을 둘 다 유지할 수 있습니다.
이제 각 국가에 해당하는 지역을 저장하는 필드가 없는 시나리오를 살펴봅시다. 이 시나리오에서 범위 그룹화가 사용됩니다. 사용자 정의 로직을 정의하여 국가를 지역으로 그룹화하는 사용자 정의 범위 그룹화를 사용하여 국가를 지역별로 그룹화할 수 있습니다.
이렇게 하려면 지역과 국가의 키-값 쌍을 저장하는 사전을 정의해야 합니다. 그런 다음, location RowField의 RangeType 속성을 Custom으로 설정하여 사용자 정의 범위 그룹화로 이 필드를 그룹화합니다. RangeInfo 클래스의 CustomRange 이벤트를 처리하여 각 값을 확인합니다. 사전 값과 필드 값을 비교하고 CustomRangeEventArgs 클래스의 GroupValue 속성으로 이 국가에 키, 즉 지역을 할당하여 모든 국가가 그룹화된 지역으로 렌더링되게 합니다.
아래 코드 조각은 continent 필드가 없어서 국가를 지역별로 그룹화하려면 사용자 정의 범위 그룹화가 필요한 의 또 다른 데이터 집합을 사용하여 동일한 내용을 구현합니다.
//Define dictionary storing region and countries Dictionary<string, List<string>> countries = new Dictionary<string, List<string>>(){ {"Europe", new List<string>(){"Austria", "Belgium", "Bulgaria", "Croatia", "Cyprus", "Czechia", "Denmark", "Estonia", "Finland", "France", "Hungary", "Iceland", "Ireland", "Italy", "Latvia", "Lithuania", "Luxembourg", "Malta", "Norway", "Poland", "Portugal", "Romania", "Slovakia", "Slovenia", "Spain", "Sweden" } }, {"South America", new List<string>(){"Peru", "Uruguay" } }, {"USA", new List<string>(){"Jersey"} } }; //Group countries by region using custom grouping public void Custom_GroupCountryByRegion(C1PivotEngine fpEngine, DataTable dt) { //Bind FlexPivot to data fpEngine.DataSource = dt.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("location"); fpEngine.RowFields[0].Caption = "Continent"; //Apply custom range grouping to RowField fpEngine.RowFields[0].Range.RangeType = C1.PivotEngine.RangeType.Custom; fpEngine.RowFields[0].Range.CustomRange += Range_CustomRange; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated_per_hundred"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated (per hundred)"; fpEngine.ValueFields[0].Width = 250; } //Handle CustomRange event to perform custom grouping private void Range_CustomRange(object sender, CustomRangeEventArgs e) { foreach (var kvp in countries) { if (kvp.Value.Contains(e.Value.ToString())) { e.GroupValue = kvp.Key; break; } } }
위 코드에서 어떻게 사용자 정의 그룹화를 사용하여 지역을 생성하는지 확인합니다.
날짜/시간 필드에 범위 그룹화를 사용하여 보기 데이터 그룹화
이 섹션에서는 위에서 생성한 보기에 또 다른 필드인 date를 추가합니다. 앞서 제공한 원시 데이터에 표시된 대로, 국가와 age_group에 따라 달라지는 수많은 날짜별 항목이 있습니다.
따라서 이 필드를 RowField 또는 ColumnField로 추가하는 것은 의미가 없습니다. 범위 그룹화를 적용하여 날짜를 그룹화하고 의미 있는 방식으로 표시해야 합니다. 사용자 요구 사항에 따라 FiscalYear, FiscalMonth, FiscalQuarter, FiscalWeek, Quarter, Week 조건을 기준으로 날짜를 그룹화할 수 있습니다.
현재 시나리오에서는 Year 및 Quarter 그룹화를 사용하여 날짜 값을 그룹화합니다. 다음 코드 조각은 PivoField의 RangeType 속성을 적절한 값으로 설정하여 날짜 형식 값을 그룹화하는 방법을 보여 줍니다.
첫 번째 코드 조각은 날짜 값을 연도별 형식으로 그룹화합니다.
//Bind FlexPivot to data fpEngine.DataSource = dt.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("continent"); fpEngine.RowFields[0].Caption = "Continent"; //Add and configure ColumnField fpEngine.ColumnFields.Add("date"); //Apply range grouping to ColumnField fpEngine.ColumnFields[0].Format = "yyyy"; fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format; fpEngine.ColumnFields[0].Caption = "Date"; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated"; fpEngine.ValueFields[0].Width = 200;
위 코드 조각을 사용하여 생성된 보기를 빠르게 살펴보면 다음과 같습니다.
백신 접종자 수를 정의하는 필드가 데이터 소스의 레코드를 기준으로 두 연도로 분할되는 방식을 관찰할 수 있습니다.
이제 날짜 필드의 분기별 그룹화를 구현해 봅시다.
다음은 동일한 내용을 구현하는 코드 조각입니다.
//Bind FlexPivot to data fpEngine.DataSource = dt.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("continent"); fpEngine.RowFields[0].Caption = "Continent"; //Add and configure ColumnField fpEngine.ColumnFields.Add("date"); fpEngine.ColumnFields[0].Caption = "Date"; //Apply range grouping to ColumnField fpEngine.ColumnFields[0].Range.RangeType = RangeType.FiscalQuarter; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated"; fpEngine.ValueFields[0].Width = 130;
위 코드 조각을 사용하여 생성된 보기를 빠르게 살펴보면 다음과 같습니다.
백신 접종자 수를 정의하는 필드가 데이터 소스의 레코드를 기준으로 분기로 분할되는 방식을 관찰할 수 있습니다.
첫 번째 보기 생성
위 섹션에서는 첫 번째 보기를 생성하기 위해 적용해야 하는 다양한 유형의 범위 그룹화에 대해 설명했습니다. 이 섹션에서는 모든 코드를 병합하여 최종 보기를 생성하는 방법을 설명합니다. 아래 코드 조각은 첫 번째 보기를 생성하는 데 사용되는 병합 코드를 보여 줍니다.
//Bind FlexPivot to data fpEngine.DataSource = vaccinationSet.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("continent"); fpEngine.RowFields[0].Caption = "Continent"; //Add and configure ColumnFields fpEngine.ColumnFields.Add("date"); fpEngine.ColumnFields[0].Caption = "Date"; fpEngine.ColumnFields[0].Format = "yyyy"; fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format; fpEngine.ColumnFields.Add("date"); fpEngine.ColumnFields[1].Range.RangeType = RangeType.Quarter; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated"; fpEngine.ValueFields[0].Width = 100;
아래 이미지는 위 코드를 실행하면 생성되는 첫 번째 보기를 보여 줍니다.
두 번째 보기 생성
FlexPivot에서는 숫자 범위 그룹화를 사용하여 숫자 데이터 범위를 만들 수 있습니다. FlexPivot을 사용하여 숫자 범위 그룹을 만드는 방법에 대한 자세한 내용은 설명서 를 참조하십시오.
그러나 에서 가져온 데이터에는 연령대를 나타낼 숫자 범위 그룹을 포함하는 필드가 이미 있습니다. 따라서 연도/분기별로 분할된 시간 범위 내 각 국가의 백신 접종 데이터를 표시하고 백신 접종자를 연령대별로 그룹화하는 두 번째 보기를 만들기 위해 age_group 필드를 RowField로 추가하기만 하면 됩니다.
아래 코드 조각은 두 번째 보기를 생성하는 데 사용되는 코드를 보여 줍니다.
//Bind the datatable to FlexPivot's C1PivotEngine var fpEngine = flexPivotPage1.FlexPivotPanel.C1PivotEngine; fpEngine.DataSource = vaccinationSubset.DefaultView; //Add and configure RowField fpEngine.RowFields.Add("location"); fpEngine.RowFields[0].Caption = "Country"; fpEngine.RowFields[0].Range.CustomRange += Range_CustomRange; fpEngine.RowFields[0].Range.RangeType = C1.PivotEngine.RangeType.Custom; fpEngine.RowFields.Add("age_group"); fpEngine.RowFields[1].Caption = "Age Group"; //Add and configure ColumnFields fpEngine.ColumnFields.Add("date"); fpEngine.ColumnFields[0].Caption = "Date"; fpEngine.ColumnFields[0].Format = "yyyy"; fpEngine.ColumnFields[0].Range.RangeType = RangeType.Format; fpEngine.ColumnFields.Add("date"); fpEngine.ColumnFields[1].Range.RangeType = RangeType.FiscalQuarter; //Add and configure ValueField fpEngine.ValueFields.Add("people_fully_vaccinated_per_hundred"); fpEngine.ValueFields[0].Caption = "People fully Vaccinated (per hundred)"; fpEngine.ValueFields[0].Width = 100;
아래 이미지는 위 코드를 실행하면 생성되는 두 번째 보기를 보여 줍니다.
위에서 설명한 모든 범위 그룹화 시나리오를 구현하는 샘플을 서 또는 위의 첨부파일을 다운로드합니다.
지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.