첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ PivotGridControl 클래스 : CustomCellValue 이벤트를 사용해 커스텀 SUMMARY 타입을 갖는 다수 커스텀 총계 계산하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


MainForm.cs

 

 

using System.Collections.Generic;

 

using DevExpress.Data.PivotGrid;

using DevExpress.Utils;

using DevExpress.XtraEditors;

using DevExpress.XtraPivotGrid;

 

using TestProject.nwindDataSetTableAdapters;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : XtraForm

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            ProductReportsTableAdapter adapter = new ProductReportsTableAdapter();

 

            this.pivotGridControl.DataSource = adapter.GetData();

 

            PivotGridCustomTotal medianCustomTotal = new PivotGridCustomTotal(PivotSummaryType.Custom);

 

            medianCustomTotal.Tag                 = "Median";

            medianCustomTotal.Format.FormatType   = FormatType.Custom;

            medianCustomTotal.Format.FormatString = "{0} Median";

 

            this.categoryNameField.CustomTotals.Add(medianCustomTotal);

 

            PivotGridCustomTotal quartilesCustomTotal = new PivotGridCustomTotal(PivotSummaryType.Custom);

 

            quartilesCustomTotal.Tag                 = "Quartiles";

            quartilesCustomTotal.Format.FormatType   = FormatType.Custom;

            quartilesCustomTotal.Format.FormatString = "{0} Quartiles";

 

            this.categoryNameField.CustomTotals.Add(quartilesCustomTotal);

 

            this.categoryNameField.TotalsVisibility = PivotTotalsVisibility.CustomTotals;

 

            this.pivotGridControl.CustomCellValue += pivotGridControl_CustomCellValue;

 

            this.pivotGridControl.BestFit();

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        //////////////////////////////////////////////////////////////////////////////// Event

 

        #region 피벗 그리드 컨트롤 셀 값 커스텀 설정하기 - pivotGridControl_CustomCellValue(sender, e)

 

        /// <summary>

        /// 피벗 그리드 컨트롤 셀 값 커스텀 설정하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void pivotGridControl_CustomCellValue(object sender, PivotCellValueEventArgs e)

        {

            if(e.ColumnCustomTotal == null && e.RowCustomTotal == null)

            {

                return;

            }

 

            List<decimal> valueList = GetSummaryValueList(e);

 

            string customTotalName = GetCustomTotalName(e);

 

            e.Value = GetCustomTotalValue(valueList, customTotalName);

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////// Function

 

        #region SUMMARY 값 리스트 구하기 - GetSummaryValueList(e)

 

        /// <summary>

        /// SUMMARY 값 리스트 구하기

        /// </summary>

        /// <param name="e">이벤트 인자</param>

        /// <returns>SUMMARY 값 리스트</returns>

        private List<decimal> GetSummaryValueList(PivotCellValueEventArgs e)

        {

            List<decimal> valueList = new List<decimal>();

 

            PivotSummaryDataSource dataSource = e.CreateSummaryDataSource();

 

            for(int i = 0; i < dataSource.RowCount; i++)

            {

                object value = dataSource.GetValue(i, e.DataField);

 

                if(value == null)

                {

                    continue;

                }

 

                valueList.Add((decimal)value);

            }

 

            valueList.Sort();

 

            return valueList;

        }

 

        #endregion

        #region 커스텀 총계명 구하기 - GetCustomTotalName(e)

 

        /// <summary>

        /// 커스텀 총계명 구하기

        /// </summary>

        /// <param name="e">이벤트 인자</param>

        /// <returns>커스텀 총계명</returns>

        private string GetCustomTotalName(PivotCellValueEventArgs e)

        {

            return e.ColumnCustomTotal != null ? e.ColumnCustomTotal.Tag.ToString() :

                                                 e.RowCustomTotal.Tag.ToString();

        }

 

        #endregion

        #region 중앙 값 구하기 - GetMedianValue(valueList)

 

        /// <summary>

        /// 중앙 값 구하기

        /// </summary>

        /// <param name="valueList">값 리스트</param>

        /// <returns>중앙 값</returns>

        private decimal GetMedianValue(List<decimal> valueList)

        {

            if((valueList.Count % 2) == 0)

            {

                return ((decimal)(valueList[valueList.Count / 2 - 1]) + (decimal)(valueList[valueList.Count / 2])) / 2;

            }

            else

            {

                return (decimal)valueList[valueList.Count / 2];

            }

        }

 

        #endregion

        #region 사분위 값 구하기 - GetQuartilesValue(valueList)

 

        /// <summary>

        /// 사분위 값 구하기

        /// </summary>

        /// <param name="valueList">값 리스트</param>

        /// <returns>사분위 값</returns>

        private string GetQuartilesValue(List<decimal> valueList)

        {

            List<decimal> part1List = new List<decimal>();

            List<decimal> part2List = new List<decimal>();

 

            if((valueList.Count % 2) == 0)

            {

                part1List = valueList.GetRange(0, valueList.Count / 2);

                part2List = valueList.GetRange(valueList.Count / 2, valueList.Count / 2);

            }

            else

            {

                part1List = valueList.GetRange(0, valueList.Count / 2 + 1);

                part2List = valueList.GetRange(valueList.Count / 2, valueList.Count / 2 + 1);

            }

 

            return string.Format

            (

                "({0}, {1})",

                GetMedianValue(part1List).ToString("c2"),

                GetMedianValue(part2List).ToString("c2")

            );

        }

 

        #endregion

        #region 커스텀 총계 값 구하기 - GetCustomTotalValue(valueList, customTotalName)

 

        /// <summary>

        /// 커스텀 총계 값 구하기

        /// </summary>

        /// <param name="valueList">값 리스트</param>

        /// <param name="customTotalName">커스텀 총계명</param>

        /// <returns>커스텀 총계 값</returns>

        private object GetCustomTotalValue(List<decimal> valueList, string customTotalName)

        {

            if(valueList.Count == 0)

            {

                return null;

            }

 

            if(customTotalName == "Median")

            {

                return GetMedianValue(valueList);

            }

 

            if(customTotalName == "Quartiles")

            {

                return GetQuartilesValue(valueList);

            }

 

            return null;

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

'DevExpress > WinForm' 카테고리의 다른 글

[DEVEXPRESS/WINFORM] PivotGridField 클래스 : CustomGroupInterval 이벤트를 사용해 그룹 간격 커스텀 설정하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridField 클래스 : GroupInterval 속성을 사용해 날짜/시간 값 그룹 설정하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : CustomFieldSort 이벤트를 사용해 히든 필드로 출력 필드 정렬하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridField 클래스 : SortBySummaryInfo 속성을 사용해 필드 값을 정렬하기 위한 정렬 조건 설정하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : CustomFieldValueCells 이벤트를 사용해 특정 조건을 만족하는 필드 값 셀 배치하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : CustomCellValue 이벤트를 사용해 커스텀 SUMMARY 타입을 갖는 다수 커스텀 총계 계산하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : LINQ to SQL 서버 모드 사용하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : CustomUnboundFieldData 이벤트를 사용해 그룹 간격 커스텀 설정하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridField 클래스 : 엑셀 데이터 소스 바인딩하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridCells 클래스 : CopySelectionToClipboard 메소드를 사용해 데이터를 클립보드에 복사하기  (0) 2020.05.09
[DEVEXPRESS/WINFORM] PivotGridControl 클래스 : CustomDrawCell 이벤트를 사용해 셀 커스텀 그리기  (0) 2020.05.08
Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요