출처 : http://hoons.net/Board/QACSHAP/Content/59338
이것 질문글 퍼온건데... 거의 대부분 값들이 나열되어 있어서 찾아보기 편하더라구요 ^^;
public Form1()
{
InitializeComponent();
InitChart();
InitChartSeries(InitDataSet());
}
/// <summary>
/// 차트에 DataTable 형태의 바인딩 시킬 데이터
/// </summary>
/// <returns></returns>
private DataSet InitDataSet()
{
DataTable dtResult = new DataTable();
DataColumn dcName = new DataColumn("Name");
DataColumn dcValue = new DataColumn("Value");
dtResult.Columns.Add(dcName);
dtResult.Columns.Add(dcValue);
//DataSet ds = null;
DataRow dr = null;
dr = dtResult.NewRow();
dr["Name"] = "물류구간";
dr["Value"] = 54;
dtResult.Rows.Add(dr);
dr = dtResult.NewRow();
dr["Name"] = "역행구간";
dr["Value"] = 17;
dtResult.Rows.Add(dr);
dr = dtResult.NewRow();
dr["Name"] = "흐름구간";
dr["Value"] = 87;
dtResult.Rows.Add(dr);
dr = dtResult.NewRow();
dr["Name"] = "망할구간";
dr["Value"] = 77;
dtResult.Rows.Add(dr);
dr = dtResult.NewRow();
dr["Name"] = "제길구간";
dr["Value"] = 26;
dtResult.Rows.Add(dr);
dtResult.AcceptChanges();
DataSet dsResult = new DataSet();
dsResult.Tables.Add(dtResult);
DataTable dtResult2 = new DataTable();
DataColumn dcName1 = new DataColumn("Name");
DataColumn dcValue1 = new DataColumn("Value");
dtResult2.Columns.Add(dcName1);
dtResult2.Columns.Add(dcValue1);
dr = dtResult2.NewRow();
dr["Name"] = "a";
dr["Value"] = 201;
dtResult2.Rows.Add(dr);
dr = dtResult2.NewRow();
dr["Name"] = "b";
dr["Value"] = 11;
dtResult2.Rows.Add(dr);
dr = dtResult2.NewRow();
dr["Name"] = "c";
dr["Value"] = 107;
dtResult2.Rows.Add(dr);
dr = dtResult2.NewRow();
dr["Name"] = "d";
dr["Value"] = 33;
dtResult2.Rows.Add(dr);
dr = dtResult2.NewRow();
dr["Name"] = "e";
dr["Value"] = 26;
dtResult2.Rows.Add(dr);
dtResult2.AcceptChanges();
dsResult.Tables.Add(dtResult2);
//ds = new DataSet();
//ds.Tables.Add(dtResult);
return dsResult;
}
/// <summary>
/// 차트의 초기 속성 설정
/// </summary>
private void InitChart()
{
// 기존 차트 영역 삭제
chart1.Titles.Clear();
chart1.Legends.Clear();
chart1.Series.Clear();
chart1.ChartAreas.Clear();
// 차트 영역 이름 설정
string chartName = "ChartArea";
chart1.ChartAreas.Add(chartName);
// 차트 영역 배경 설정
chart1.ChartAreas[chartName].BackColor = Color.WhiteSmoke;
chart1.ChartAreas[chartName].BackSecondaryColor = Color.WhiteSmoke;
//string chartSecondName = "ChartSecondName";
//chart1.ChartAreas.Add(chartSecondName);
//chart1.ChartAreas[chartSecondName].BackColor = Color.Azure;
//chart1.ChartAreas[chartSecondName].BackSecondaryColor = Color.Beige;
//chart1.ChartAreas[chartSecondName].BackGradientStyle = GradientStyle.Center;
chart1.Titles.Add("오동's 차트연습");
}
/// <summary>
/// 차트의 Series 속성 설정 및 데이타 바인딩
/// </summary>
/// <param name="dtResult"></param>
private void InitChartSeries(DataSet dsResult)
{
double maxValue = this.FindMaxValue(dsResult, 1, "Value");
double minValue = this.FindMinValue(dsResult, 1, "Value");
string seriesName = "SeriesName";
chart1.Series.Add(seriesName);
chart1.Series[seriesName].ChartType = SeriesChartType.Column;
chart1.Series[seriesName].BorderDashStyle = ChartDashStyle.Solid;
chart1.Series[seriesName].BorderWidth = 1;
chart1.Series[seriesName].Enabled = true;
chart1.Series[seriesName].IsValueShownAsLabel = true; // 데이터 값을 표시
chart1.Series[seriesName].IsVisibleInLegend = true; // 범례 표시
chart1.Series[seriesName].LabelToolTip = "#VALX : #VALY점";
chart1.Series[seriesName].ToolTip = "#VALX : #VALY점";
chart1.Series[seriesName].Font = new Font("굴림", 12.0F, FontStyle.Regular);
chart1.Series[seriesName].CustomProperties = "DrawingStyle=Cylinder"; // 이걸 사용하면 원통형으로 나옴
string seriesSecondName = "seriesSecondName";
chart1.Series.Add(seriesSecondName);
chart1.Series[seriesSecondName].ChartType = SeriesChartType.Line;
chart1.Series[seriesSecondName].MarkerSize = 15;
chart1.Series[seriesSecondName].MarkerStyle = MarkerStyle.Circle;
chart1.Series[seriesSecondName].MarkerColor = Color.Yellow;
chart1.Series[seriesSecondName].BorderWidth = 4;
chart1.Series[seriesSecondName].BorderColor = Color.Black;
chart1.Series[seriesSecondName].BorderDashStyle = ChartDashStyle.Solid;
chart1.Series[seriesSecondName].Enabled = true;
chart1.Series[seriesSecondName].IsValueShownAsLabel = true;
chart1.Series[seriesSecondName].IsVisibleInLegend = true;
chart1.Series[seriesSecondName].LabelToolTip = "#VALX : #VALYm";
chart1.Series[seriesSecondName].ToolTip = "#VALX : #VALYm";
chart1.Series[seriesSecondName].Font = new Font("굴림", 12.0F, FontStyle.Regular);
chart1.Series[seriesSecondName].CustomProperties = "DrawingStyle=Cylinder";
#region <주, 보조 축의 간격과 속성 설정>
ChartArea3DStyle chartArea3DStyle = new ChartArea3DStyle();
chartArea3DStyle.Enable3D = false;
chartArea3DStyle.LightStyle = LightStyle.Realistic;
chartArea3DStyle.Rotation = 30;
chartArea3DStyle.Inclination = 50;
chartArea3DStyle.PointDepth = 20;
chart1.ChartAreas["ChartArea"].Area3DStyle = chartArea3DStyle;
chart1.ChartAreas["ChartArea"].AxisY.LabelStyle.Interval = maxValue / 10;
chart1.ChartAreas["ChartArea"].AxisY.IntervalType = DateTimeIntervalType.Number;
//chart1.ChartAreas["ChartArea"].AxisY.IntervalOffset = maxValue / 10;
//chart1.ChartAreas["ChartArea"].AxisY.IntervalOffsetType = DateTimeIntervalType.Number;
chart1.ChartAreas["ChartArea"].AxisY.Minimum = 0;
chart1.ChartAreas["ChartArea"].AxisY.Maximum = maxValue;
chart1.ChartAreas["ChartArea"].AxisY.IsMarginVisible = true; // 축의 여백을 표시할지 여부를 설정
chart1.ChartAreas["ChartArea"].AxisY.LabelStyle.Format = "###,0 점";
// 보조 축을 사용하기 위한 설정이며, ChartAreas[...] -> 안에는 차트의 이름을 넣어준다.
// 지정하지 않았다면, 지정하려는 차트의 인덱스 번호를 넣어준다.
chart1.ChartAreas["ChartArea"].AxisY.Enabled = AxisEnabled.True;
chart1.ChartAreas["ChartArea"].AxisY2.Enabled = AxisEnabled.True;
chart1.ChartAreas["ChartArea"].AxisY2.Minimum = 0;
chart1.ChartAreas["ChartArea"].AxisY2.Maximum = maxValue; //maxValue + (maxValue / 10) * 3;
chart1.ChartAreas["ChartArea"].AxisY2.LabelStyle.Interval = maxValue / 10; //(maxValue + (maxValue / 10) * 3) / 10;
chart1.ChartAreas["ChartArea"].AxisY2.IntervalType = DateTimeIntervalType.Number;
chart1.ChartAreas["ChartArea"].AxisY2.IsMarginVisible = false; // 이녀석을 설정하던지, 미니멈 맥시멈을 지정해주던지 하면된다.
chart1.ChartAreas["ChartArea"].AxisY2.LabelStyle.Format = "###,0 m";
//chart1.ChartAreas["ChartName"].AxisY2.LabelStyle.IntervalOffset = 1;
//if (chart1.ChartAreas["ChartName"].AxisY.LabelStyle.Format != "60")
//{
// chart1.ChartAreas["ChartName"].AxisY2.LineColor = Color.Red;
// chart1.ChartAreas["ChartName"].AxisY2.LineDashStyle = ChartDashStyle.DashDot;
//}
//chart1.ChartAreas["ChartName"].AxisY.LabelStyle.IsStaggered = true; --> 이 녀석을 사용하면 지그재그 형태로 라벨이 나타남
//chart1.ChartAreas["ChartName"].AxisY.LabelAutoFitStyle = LabelAutoFitStyles.LabelsAngleStep90;
//chart1.ChartAreas["ChartName"].AxisY.ScaleBreakStyle.BreakLineStyle = BreakLineStyle.Straight;
//chart1.ChartAreas["ChartName"].AxisY.MajorGrid.Enabled = true;
/* 축의 주 모눈선과 눈금 속성을 설정합니다. */
chart1.ChartAreas["ChartArea"].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisX.MajorTickMark.Enabled = true;
chart1.ChartAreas["ChartArea"].AxisY.MajorGrid.Enabled = true;
chart1.ChartAreas["ChartArea"].AxisY.MajorTickMark.Enabled = true;
chart1.ChartAreas["ChartArea"].AxisY2.MajorGrid.Enabled = true;
chart1.ChartAreas["ChartArea"].AxisY2.MajorTickMark.Enabled = true;
/* 보조 축의 주 모눈선과 눈금 속성을 설정합니다. */
chart1.ChartAreas["ChartArea"].AxisX.MinorGrid.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisX.MinorTickMark.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisY.MinorGrid.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisY.MinorTickMark.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisY2.MinorGrid.Enabled = false;
chart1.ChartAreas["ChartArea"].AxisY2.MinorTickMark.Enabled = false;
#endregion <주, 보조 축의 간격과 속성 설정>
int min = -1;
int index = -1;
// 최소값을 찾아 빨간색으로 ChartType을 그려주기 위한 로직
for (int i = 0; i < dsResult.Tables[0].Rows.Count; i++)
{
int current = Convert.ToInt32(dsResult.Tables[0].Rows[i]["Value"]);
if (min == -1)
{
min = current;
index = i;
}
else
{
// 최소값을 찾을 때 까지, 아래 if문을 탐
if (min > current)
{
min = current;
index = i;
}
}
}
foreach (DataRow dRow in dsResult.Tables[0].Rows) // 데이타 바인딩
{
chart1.Series[seriesName].Points.AddXY(dRow["Name"].ToString(), dRow["Value"].ToString());
}
chart1.Series[seriesName].Points[index].Color = Color.Red; // 최소값은 빨간색으로 표시
foreach (DataRow dRow in dsResult.Tables[1].Rows) // 데이타 바인딩
{
chart1.Series[seriesSecondName].Points.AddXY(dRow["Name"].ToString(), dRow["Value"].ToString());
}
}
/// <summary>
/// DataSet 형태로 넘어온 사용자가 지정한 테이블 중, 지정한 컬럼 값들의 최대값을 구합니다.
/// </summary>
/// <param name="dsResult">DataSet</param>
/// <param name="tableSeq">DataSet이 포함한 테이블의 시퀀스</param>
/// <param name="columnName">컬럼명</param>
/// <returns></returns>
private double FindMaxValue(DataSet dsResult, int tableSeq, string columnName)
{
double minValue = -1;
double maxValue = 0;
// 매개변수 DataSet에서 Value의 최대값과 최소값을 찾기위한 로직
for (int i = 0; i < dsResult.Tables[0].Rows.Count; i++)
{
double current = Convert.ToDouble(dsResult.Tables[tableSeq].Rows[i][columnName]);
if (minValue == -1)
{
minValue = current;
}
else
{
// 최대값을 찾을 때 까지, 아래 if문을 탐
if (minValue < current)
{
if (maxValue < current)
{
maxValue = current;
}
}
else
{
maxValue = minValue;
}
// 최소값을 찾을 때 까지, 아래 if문을 탐
if (minValue > current)
{
minValue = current;
}
}
}
return maxValue;
}
/// <summary>
/// DataSet 형태로 넘어온 사용자가 지정한 테이블 중, 지정한 컬럼 값들의 최소값을 구합니다.
/// </summary>
/// <param name="dsResult">DataSet</param>
/// <param name="tableSeq">DataSet이 포함한 테이블의 시퀀스</param>
/// <param name="columnName">컬럼명</param>
/// <returns></returns>
private double FindMinValue(DataSet dsResult, int tableSeq, string columnName)
{
double minValue = -1;
double maxValue = 0;
// 매개변수 DataSet에서 Value의 최대값과 최소값을 찾기위한 로직
for (int i = 0; i < dsResult.Tables[tableSeq].Rows.Count; i++)
{
double current = Convert.ToDouble(dsResult.Tables[0].Rows[i][columnName]);
if (minValue == -1)
{
minValue = current;
}
else
{
// 최대값을 찾을 때 까지, 아래 if문을 탐
if (minValue < current)
{
if (maxValue < current)
{
maxValue = current;
}
}
else
{
maxValue = minValue;
}
// 최소값을 찾을 때 까지, 아래 if문을 탐
if (minValue > current)
{
minValue = current;
}
}
}
return minValue;
}
'C#' 카테고리의 다른 글
String과 string 차이 (0) | 2013.09.20 |
---|---|
partial Class (0) | 2012.11.23 |