본문 바로가기
C++ 200제/코딩 IT 정보

C# MS Chart 예제와 사용 방법 (그래프 차트)

by vicddory 2017. 12. 29.

C# MS Chart 예제와 사용 방법 (그래프 차트)


MS에서 무료로 배포하는 C# MS Chart입니다. C# MS Chart는 영역, 수직 막대, 수평 막대, 원형, 분산, 주식 전용, 피라미드, 단위 그래프를 지원합니다. C# MS Chart는 총 200여 가지 그래프를 지원한다고 하니 시간 날 때 하나씩 사용해 보며 C# MS Chart를 확실히 이해해보는 것도 좋을 듯합니다.


그리고 C# MS Chart는 사용자가 차트를 편집해 상황에 맞도록 별도로 구성할 수 있는데, 이는 C# MS Chart만의 장점이기도 합니다. C#은 각종 도구의 편집 기능을 제공하고 있기 때문이죠. 이런 C# MS Chart를 이용하기 위해선, 두 개의 파일을 다운 받아 미리 설치해야 합니다.


필요한 파일은 아래 두 개입니다.


- C# MS Chart Controls for .NET Framework 3.5

- C# MS Chart Controls for .NET Framework 3.5 Language Pack

위의 이름과 똑같은 파일을 다운 받으세요. 닷넷 프레임워크를 설치하셨다면 C# MS Chart를 사용하기 위한 추가 파일도 설치합니다.



C# MS Chart와 AddOn 파일은 다운로드 한 뒤에 설치해주세요.


그러면, 비주얼 스튜디오에서 별도의 조작 없이 C# MS Chart를 사용할 수 있습니다. 설치가 정상적으로 이뤄지면 아래 그림처럼 C# MS Chart 항목을 확인할 수 있습니다.


C# MS Chart 도구 추가[C# 그래프 라이브러리] 차트


C# MS Chart 예제

저는 RS232로 전송되는 정수형 데이터를 기반으로 그래프가 실시간으로 변화하도록 구성했는데, C# MS Chart 예제 소스는 간단합니다.


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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
Using System.IO.Ports;
 
namespace LineChartTEST
{
    public partial class Form1 : Form
    {
        private delegate void CanIJust();
        private List<int> _valueList;
        private List<double>_timeList;
        private List<int> _customValueList;
 
        string InputData = String.Empty;
        delegate void SetTextCallback(string text);
        SerialPort SP = new SerialPort();
 
        public Form1()
        {        
        InitializeComponent();
          _valueList = new List<int>();
            _timeList = new List<double>();
           _customValueList = new List<int>();
 
            SP.PortName = "COM9";
            SP.BaudRate = 115200;
            SP.DataBits = 8;
            SP.Parity = Parity.None;
            SP.StopBits = StopBits.One;
            SP.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            SP.Open();
        }
 
        protected override void OnClosed(EventArgs e)
        {
          base.OnClosed(e);
        }
 
        private void UpdateSecondChart()
        {
            chart.Series[0].Points.AddXY(_timeList[_timeList.Count - 1],
            _customValueList[_customValueList.Count - 1]);
            
            chart.Series[0].IsValueShownAsLabel = true
            chart.Legends[0].Enabled = false;            
            chart.Invalidate();
        }
 
        private void btnClear_Click(object sender, EventArgs e)
        {
            chart.Series[0].Points.Clear();
        }
 
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = SP.ReadExisting();
 
            if (InputData != String.Empty)
            {
                if(InputData.Length > 4)
                {
                    if (String.Compare(InputData.Substring(12), "P"== 0 || 
                       String.Compare(InputData, "P")== 0)
                    {                      
                       SP.WriteLine("K");
                    }
                }
                else if (String.Compare(InputData, "P")== 0)
                {
                }
                else
                {
                    if (InputData.Length >= 2)
                    {                      
                       SetText(InputData.Substring(0, InputData.Length - 1));
                    }
                    else
                    {
                    }
                }
            }
        }
 
        private void SetText(string text)
        {
            if (this.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {                             
                _customValueList.Add(Convert.ToInt32(text));
                UpdateSecondChart();
            }
        }
 
        private void button_Click(object sender, EventArgs e)
        {
            if (SP.IsOpen)
                SP.WriteLine("K");
            else
                MessageBox.Show("Serial port is closed!");
        }
    }
}
cs

C# MS Chart 예제에서 중요한 부분은 아래 네 줄 입니다.


1
2
3
4
chart.Series[0].Points.AddXY(_timeList[_timeList.Count - 1], _customValueList[_customValueList.Count - 1]);
chart.Series[0].IsValueShownAsLabel = true;         
chart.Legends[0].Enabled = false;          
chart.Invalidate();
cs


1 : chart 객체의 Series는 실제 그려지는 데이터를 의미

2 : IsValueShowAsLabel = true로 데이터의 값을 표현

3 : Legends[0].Enable = false로 라벨의 값은 표현하지 않음

4 : Invalidate()를 호출함으로서 새로 고침 계속 발생


C Sharp MS Chart 예제 사용[C# 그래프 라이브러리] 차트


궁금한 점은 댓글로 알려주세요.


C# MS Chart 예제와 사용 방법 (그래프 차트)

댓글