본문 바로가기
C#/DevExpress

[C# DevExpress] ChartControl - Bar Chart

by 샤나엘 2018. 4. 6.
반응형


DevExpress ChartControl 중에서 BarChart를 사용하는 방법에 대한 예제입니다.

 

아래와 같은 형태로 나오는 Chart를 만들어보는 예제입니다.

 

아래와 같이 가상의 Data를 만들어서 왼쪽 Grid에 표시하고,

BarChart로 보여주는 예제입니다.

 

[실행화면]

 

=====================================================================

 

[Chart Data 세팅]

Chart를 세팅하는 부분입니다.

ChartControl.Series Series를 생성해서 Add 시켜주어야 합니다.

Series의 ViewTypeBar로 설정하면 BarChart로 보여주게 됩니다.

Series.PointsChart에 보여줄 SeriesPoint를 만들어서 Add 해야 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void SetChartData(ChartControl chart, ViewType viewType, DataTable dt)
        {
            #region BarChart
            if (viewType == ViewType.Bar)
            {
                Dictionary<string, Series> seriesList = new Dictionary<string, Series>();
 
                foreach (DataRow row in dt.Rows)
                {
                    string product = row["PRODUCT"].ToString();
                    string year = row["YEAR"].ToString();
                    int qty = (int)row["QTY"];
 
                    Series series;
                    if (seriesList.TryGetValue(product, out series) == false)
                    {
                        seriesList.Add(product, series = new Series(product, viewType));
                        chart.Series.Add(series);
                    }
 
                    SeriesPoint point = new SeriesPoint(year, qty);
                    series.Points.Add(point);
                }
            }
            #endregion
        }

 

=====================================================================

 

[Chart에 Title 세팅하기]

아래처럼 빨간색 동그라미로 표시된 부분처럼 Title 세팅하는 방법입니다.

 

 

Chart 생성부분에서 23, 24, 25 Line의 코드(빨간색으로 표시된 코드 부분) 추가해줍니다.

ChartTitle을 생성해서 ChartControl의 Titles 속성에 Add 시켜줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
            #region BarChart
            if (viewType == ViewType.Bar)
            {
                Dictionary<string, Series> seriesList = new Dictionary<string, Series>();
 
                foreach (DataRow row in dt.Rows)
                {
                    string product = row["PRODUCT"].ToString();
                    string year = row["YEAR"].ToString();
                    int qty = (int)row["QTY"];
 
                    Series series;
                    if (seriesList.TryGetValue(product, out series) == false)
                    {
                        seriesList.Add(product, series = new Series(product, viewType));
                        chart.Series.Add(series);
                    }
 
                    SeriesPoint point = new SeriesPoint(year, qty);
                    series.Points.Add(point);
                }
 
                ChartTitle title = new ChartTitle();
                title.Text = viewType.ToString();
                chart.Titles.Add(title);
            }
            #endregion

 

 

 

=====================================================================

 

[Label 세팅]

 

아래처럼 Bar위에 수량정보를 표시하는 방법입니다.

 

 

 

Chart 생성부분에서 16번째 Line의 코드(빨간색으로 표시) 부분을 추가해줍니다.

Series 객체의 LabelsVisibility 속성DevExpress.Utils.DefaultBoolean.True로 설정해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
            #region BarChart
            if (viewType == ViewType.Bar)
            {
                Dictionary<string, Series> seriesList = new Dictionary<string, Series>();
 
                foreach (DataRow row in dt.Rows)
                {
                    string product = row["PRODUCT"].ToString();
                    string year = row["YEAR"].ToString();
                    int qty = (int)row["QTY"];
 
                    Series series;
                    if (seriesList.TryGetValue(product, out series) == false)
                    {
                        seriesList.Add(product, series = new Series(product, viewType));
                        series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;
                        chart.Series.Add(series);
                    }
 
                    SeriesPoint point = new SeriesPoint(year, qty);
                    series.Points.Add(point);
                }
 
                ChartTitle title = new ChartTitle();
                title.Text = viewType.ToString();
                chart.Titles.Add(title);
            }
            #endregion

 

=====================================================================

 


 

[가상 Data 생성]

 

가상의 Data를 생성합니다.

APPLE, BANANA, ORAGE에 대한 년도별 생산수량에 대한 시나리오로 생성했고,

생산수량은 Random을 사용해서 생성합니다.

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private DataTable CreateData()
        {
            DataTable dataTable = new DataTable();
 
            DataColumn productColumn = new DataColumn("PRODUCT"typeof(string));
            DataColumn yearColumn = new DataColumn("YEAR"typeof(string));
            DataColumn qtyColumn = new DataColumn("QTY"typeof(int));
 
            dataTable.Columns.Add(productColumn);
            dataTable.Columns.Add(yearColumn);
            dataTable.Columns.Add(qtyColumn);
 
            List<string> prodList = new List<string>();
            prodList.Add("APPLE");
            prodList.Add("BANANA");
            prodList.Add("ORAGNE");
 
            Random random = new Random();
 
            for (int i = DateTime.Now.Year - 4; i <= DateTime.Now.Year; i++)
            {
                foreach (string prod in prodList)
                {
                    DataRow row = dataTable.NewRow();
 
                    row[productColumn] = prod;
                    row[yearColumn] = string.Format("{0}", i.ToString());
                    row[qtyColumn] = random.Next(10, 101);
 
                    dataTable.Rows.Add(row);
                }
            }
 
            return dataTable;
        }

 

=====================================================================

 

 

[전체 소스코드]

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraCharts;
using DevExpress.XtraBars.Docking;
 
namespace Chart
{
    public partial class Form1 : Form
    {
 
        MainView mainView;
 
        public Form1()
        {
            InitializeComponent();
 
            //가상의 Data 생성
            DataTable dataTable = CreateData();
 
            //Control 초기화
            InitializeControl(dataTable);
        }
 
        // 가상의 Data를 생성하는 함수입니다.
        private DataTable CreateData()
        {
            DataTable dataTable = new DataTable();
 
            DataColumn productColumn = new DataColumn("PRODUCT"typeof(string));
            DataColumn yearColumn = new DataColumn("YEAR"typeof(string));
            DataColumn qtyColumn = new DataColumn("QTY"typeof(int));
 
            dataTable.Columns.Add(productColumn);
            dataTable.Columns.Add(yearColumn);
            dataTable.Columns.Add(qtyColumn);
 
            List<string> prodList = new List<string>();
            prodList.Add("APPLE");
            prodList.Add("BANANA");
            prodList.Add("ORAGNE");
 
            Random random = new Random();
 
            for (int i = DateTime.Now.Year - 4; i <= DateTime.Now.Year; i++)
            {
                foreach (string prod in prodList)
                {
                    DataRow row = dataTable.NewRow();
 
                    row[productColumn] = prod;
                    row[yearColumn] = string.Format("{0}", i.ToString());
                    row[qtyColumn] = random.Next(10, 101);
 
                    dataTable.Rows.Add(row);
                }
            }
 
            return dataTable;
        }
 
        private void InitializeControl(DataTable dataTable)
        {
            foreach(ViewType viewType in Enum.GetValues(typeof(ViewType)))
            {
                this.comboBoxChartOption.Items.Add(viewType);
            }
 
            this.comboBoxChartOption.SelectedIndex = 0;
            this.gridControlData.DataSource = dataTable;
 
            this.mainView = new MainView();
            this.mainView.Dock = DockStyle.Fill;
            this.panelMainView.Controls.Add(this.mainView);
        }
 
        private void buttonViewChart_Click(object sender, EventArgs e)
        {
            ViewType viewType = (ViewType)this.comboBoxChartOption.SelectedItem;
 
            DockPanel newPanel = this.mainView.DockManager.AddPanel(DockingStyle.Float);
            newPanel.Text = viewType.ToString();
            newPanel.DockedAsTabbedDocument = true;
 
            ChartControl chart = new ChartControl();
            chart.Dock = DockStyle.Fill;
            newPanel.Controls.Add(chart);
 
            SetChartData(chart, viewType, this.gridControlData.DataSource as DataTable);
        }
 
        //Chart에 Data를 세팅
        private void SetChartData(ChartControl chart, ViewType viewType, DataTable dt)
        {
            #region BarChart
            if (viewType == ViewType.Bar)
            {
                Dictionary<string, Series> seriesList = new Dictionary<string, Series>();
 
                foreach (DataRow row in dt.Rows)
                {
                    string product = row["PRODUCT"].ToString();
                    string year = row["YEAR"].ToString();
                    int qty = (int)row["QTY"];
 
                    Series series;
                    if (seriesList.TryGetValue(product, out series) == false)
                    {
                        seriesList.Add(product, series = new Series(product, viewType));
                        chart.Series.Add(series);
                    }
 
                    SeriesPoint point = new SeriesPoint(year, qty);
                    series.Points.Add(point);
                }
            }
            #endregion
        }
    }
}



반응형

댓글