데이터 바인딩

Add* 메서드는 Y값이 여러 개일지라도 어쨌거나 하나의 데이터만 추가하며 X축의 값 개수만큼 메서드를 일일이 호출해야 한다. 반면 데이터 바인딩은 컬렉션으로부터 여러 개의 데이터를 일괄 추가한다.

 

void DataBindY (params IEnumerable[] yValue);

void DataBindY (IEnumerable yValue, string yFields);

 

yValue 인수는 열거 가능한 타입이며 DataView, Data reader, Array, List 등을 사용할 수 있다. 대량의 데이터는 주로 DB에서 읽어들인다. DB의 데이터는 실행중에 연결하여 읽어야 하므로 디자인 타임에는 바인딩을 할 수 없으며 런타임에 코드로만 할 수 있다.

각 컬렉션에서 값을 읽어 일괄 추가하되 첫 번째 메서드는 첫 컬럼을 읽고 두 번째 메서드는 yFields로 지정한 컬럼을 읽는다. 가장 쉬운 방법은 배열에서 읽는 것이다.

 

chart1.Series[0].Points.DataBindY(new int[] { 55, 77, 66 });

 

세 개의 성적값이 한꺼번에 등록된다. 다음 메서드는 X값도 같이 지정한다.

 

public void DataBindXY (IEnumerable xValue, params IEnumerable[] yValues);

public void DataBindXY (IEnumerable xValue, string xField, IEnumerable yValue, string yFields);

 

X 배열을 지정하면 학생의 이름도 한줄에 다 지정할 수 있다.

 

chart1.Series[0].Points.DataBindXY(new string[] { "철수", "영희", "동수" }, new int[] { 55, 77, 66 });

 

배열보다는 데이터베이스가 더 일반적이다. 얼마든지 많은 데이터를 출력할 수 있다. 메모리상에서 테이블을 만든 후 연결해 보자.

 

private void Form1_Load(object sender, EventArgs e)

{

    chart1.Legends[0].Enabled = false;

    DataTable tAge = MakePeopleTable();

    chart1.Series[0].Points.DataBindY(tAge.Rows, "Age");

}

 

private DataTable MakePeopleTable()

{

    DataTable tblPeople = new DataTable("tblPeople");

 

    DataColumn col;

    DataRow row;

 

    // 열 등록

    col = new DataColumn("Name", typeof(String));

    col.MaxLength = 10;

    col.AllowDBNull = false;

    col.Unique = true;

    tblPeople.Columns.Add(col);

 

    tblPeople.PrimaryKey = new DataColumn[] { col };

 

    col = new DataColumn("Age", typeof(Int32));

    col.AllowDBNull = false;

    tblPeople.Columns.Add(col);

 

    col = new DataColumn("Male", typeof(bool));

    col.AllowDBNull = false;

    tblPeople.Columns.Add(col);

 

    // 행 삽입

    row = tblPeople.NewRow();

    row["Name"] = "정우성";

    row["Age"] = 36;

    row["Male"] = true;

    tblPeople.Rows.Add(row);

 

    row = tblPeople.NewRow();

    row["Name"] = "고소영";

    row["Age"] = 32;

    row["Male"] = false;

    tblPeople.Rows.Add(row);

 

    row = tblPeople.NewRow();

    row["Name"] = "배용준";

    row["Age"] = 37;

    row["Male"] = true;

    tblPeople.Rows.Add(row);

 

    row = tblPeople.NewRow();

    row["Name"] = "김태희";

    row["Age"] = 29;

    row["Male"] = false;

    tblPeople.Rows.Add(row);

 

    tblPeople.AcceptChanges();

 

    return tblPeople;

}

DataTable 자체는 열거 가능한 값이 아니므로 tAge.Rows를 지정해야 한다. 4명의 나이가 나타난다. Age 필드만 사용했는데 이름도 표시할 수 있다.

 

chart1.Series[0].Points.DataBindXY(tAge.Rows, "Name", tAge.Rows, "Age");

X값과 Y값의 테이블이 꼭 일치하지 않아도 상관 없다. 마지막 함수는 다음과 같다.

 

public void DataBind (IEnumerable dataSource, string xField, string yFields, string otherFields);

 

한 테이블에서 X, Y값을 다 구하며 마지막 인수로 바인딩 룰을 규정하는 필드를 지정한다. 다음은 앞 코드와 결과가 같다.

 

chart1.Series[0].Points.DataBind(tAge.Rows, "Name", "Age", "");

 

메모리상에서 만든 테이블이 아닌 DBMS에서 읽은 테이블을 바인딩할 수도 있다. 이 실습을 해 보려면 SQL 서버(또는 다른 DBMS)가 설치되어 있어야 하고 SQL을 어느 정도 할 수 있어야 한다. 차트의 속성창에서 DataSource 속성 팝업을 열고 데이터 소스 추가를 선택한다.

 

데이터베이스를 선택하고 로컬 호스트에 대한 연결을 생성한다. 강좌 제작 PC에는 Study 데이터베이스에 여러 개의 실습 테이블이 준비되어 있는데 여러분은 SQL 서버로 대충 아무 테이블이나 만들어 놓고 실습해 보자.

이 중 도서의 정보를 저장하고 있는 tCity 테이블을 선택한다. 우리나라 도시의 인구, 면적 등에 대한 정보가 저장되어 있다.

여기까지 처리한 후 Form1_Load에 다음 코드를 작성한다.

 

private void Form1_Load(object sender, EventArgs e)

{

       // TODO: 이 코드는 데이터를 'studyDataSet.tCity' 테이블에 로드합니다. 필요 시 이 코드를 이동하거나 제거할 수 있습니다.

       this.tCityTableAdapter.Fill(this.studyDataSet.tCity);

       chart1.Series[0].Points.DataBind(studyDataSet.tCity, "Name", "Area", "");

}

 

첫 줄은 마법사가 작성해 준 것이며 이 문장에 의해 studyDataSet.tCity 테이블에 데이터가 이미 읽혀져 있다. DataBind 메서드로 연결만 해 주면 된다. 마법사가 만든 테이블은 타입드여서 바로 열거 가능하다. Name 필드를 X축으로 하고 AreaY축으로 하면 도시별 면적이 차트로 출력된다.

Y축 필드를 Popu로 변경하면 도시별 인구수를 차트로 보여준다. DataBind 메서드 대신 시리즈의 각 속성에 테이블과 X 필드, Y 필드를 지정해도 결과는 같다.

 

private void Form1_Load(object sender, EventArgs e)

{

    // TODO: 이 코드는 데이터를 'studyDataSet.tCity' 테이블에 로드합니다. 필요 시 이 코드를 이동하거나 제거할 수 있습니다.

    this.tCityTableAdapter.Fill(this.studyDataSet.tCity);

    chart1.DataSource = studyDataSet.tCity;

    chart1.Series[0].XValueMember = "Name";

    chart1.Series[0].YValueMembers = "Area";

}

 

데이터베이스와 연결할 수 있어 얼마든지 다양한 소스로부터 데이터를 받아 차트로 그릴 수 있다. 다만 이 실습은 차트에 대한 지식보다 데이터베이스에 대한 지식이 더 많이 필요해 ADO.NET을 충분히 연구해 봐야 한다.