[c#] 차트 기본 예제
아래 코드는 선 차트를 그리는 예제 둘이다. 시리즈에 바로 바인드를 하는 것과 차트에 바인드를 하는 거다. 여기에서 바인드라는 개념은 DataTable 등을 DataGridView에 바인드하는 것과는 다르다. 데이터를 바꿔도 차트가 새로 그려지지는 않는다. 어떤 바인드 방법으로도 데이터가 바뀌면 차트를 새로 그려야 한다.
y 값들만 만들었으므로 x 값은 자동으로 추가되게 해야 한다. IsXValueIndexed를 true로 하면 되는데 디자이너 창에서도 설정을 할 수 있다.
DataSource 프라퍼티로 바인드를 한 때에는 꼭 DataBind 메서드를 실행해야 그려진다는 거에 주의한다.
List<int> ints = new() { 1, 3, 2, 4, 3, 5 };
chart1.Series[0].IsXValueIndexed = true; // designer
// 1
chart1.Series[0].Points.DataBindY(ints);
// 2
chart1.DataSource = ints;
chart1.DataBind();
아래 코드는 캔들스틱 차트 예제다. 1번 예제는 시리즈에 직접 데이터를 추가하는 거다. 2번 예제는 시리즈의 데이터 포인트를 수정하는 거다. refresh 메서드를 실행해야 새로 그려지는데 특이하게 인텔리센스로는 이 메서드가 보이지 않는다. 일일이 타이핑해 넣어야 한다.
// 1
chart1.Series[0].Points.AddY(2, -1, 0, 1); // high low open close
// 2
chart1.Series[0].Points[0].SetValueY(2, -1, -1, 1);
chart1.Refresh(); // intellisense does not show this
아래 코드는 클래스 리스트를 차트에 바인딩하는 보다 일반적인 상황을 다루는 예제다. 어차피 데이터를 바꿔도 차트에 자동으로 반영되지는 않으므로 List를 쓰나 BindingList를 쓰나 다를 건 없다.
바인딩을 할 클래스의 멤버는 필드가 아닌 프라퍼티이어야 하는 거에 유의한다. 뒤에 반드시 { get; set; }를 붙여야 한다. 그런 뒤 시리즈에 연결할 프라퍼티들만 YValueMembers 프라퍼티에 특정해야 한다. 클래스에 있는 모든 프라퍼티를 자동으로 차트에 연결하지는 않을 수도 있기 때문이다. 이 작업은 디자이너 창에서도 할 수 있다. 시가-고가-저가-종가 순서가 아니라 고가-저가-시가-종가 순서라는 거에 유의한다.
class TestClass
{
public int Open { get; set; }
public int High { get; set; }
public int Low { get; set; }
public int Close { get; set; }
}
List<TestClass> TestClasses = new();
TestClass testClass = new();
testClass.Open = 0;
testClass.High = 1;
testClass.Low = -2;
testClass.Close = -1;
TestClasses.Add(testClass);
testClass = new();
testClass.Open = 10;
testClass.High = 15;
testClass.Low = 9;
testClass.Close = 13;
TestClasses.Add(testClass);
chart1.DataSource = TestClasses;
chart1.Series[0].YValueMembers = "High, Low, Open, Close"; // designer
chart1.DataBind();