实际的开发过程中chart是可以自己使用gdi来自己画的,但是处理特殊情况可能还是不如系统自带的控件。花了一天的时间研究了一下chart。把一些基本的功能算是研究明白了,主要是折线的显示,用于数据分析,增加参考线,超警戒线区分显示,离散点/点线连接基本满足需要了。
上硬菜(想用的可以修改一下使用,勿喷):
Chart主要属性:
ChartArea:在容器内创建多个Chart表
Series:设置多组数据的显示(比如一个Chart里面可以出现多条折线)
Title:设置Chart的标题属性
Legends:设置每组数据的标签属性
效果图:
建立一个Form窗体,在Series属性里面增加三个Series
//创建数据
private DataTable CreateDataTable()
{
DataTable dt=new DataTable();
dt.Columns.Add("date");
dt.Columns.Add("Volume1");
dt.Columns.Add("Volume2");
dt.Columns.Add("Volume3");
DataRow dr;
dr=dt.NewRow();
dr["date"]="Jans";
dr["Volume1"]=10000;
dr["Volume2"]=4101;
dr["Volume3"]=101;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["date"]="Feb";
dr["Volume1"]=20000;
dr["Volume2"]=4101;
dr["Volume3"]=1101;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["date"]="Mar";
dr["Volume1"]=10000;
dr["Volume2"]=7101;
dr["Volume3"]=2101;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["date"]="Apr";
dr["Volume1"]=20000;
dr["Volume2"]=6101;
dr["Volume3"]=3101;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["date"]="May";
dr["Volume1"]=10000;
dr["Volume2"]=7101;
dr["Volume3"]=5101;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["date"]="Jun";
dr["Volume1"]=20000;
dr["Volume2"]=8101;
dr["Volume3"]=1101;
dt.Rows.Add(dr);
return dt;
}
private void Form1_Load(object sender,EventArgs e)
{
DataTable dt=new DataTable ();
dt=CreateDataTable ();
//设置Chart的数据源
chart1.DataSource=dt;
//设置图标Y轴的对应项
chart1.Series[0].YValueMembers="Volume1";
chart1.Series[1].YValueMembers="Volume2";
chart1.Series[2].YValueMembers="Volume3";
//设置X轴的对应项
chart1.Series[1].XValueMember="date";
//绑定数据
chart1.DataBind();
//设置网格的颜色
chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineColor=Color.LightGreen;
chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineColor=Color.LightBlue;
//绘制警戒线
StripLine stripLine=new StripLine();
stripLine.Interval=0;
stripLine.IntervalOffset=18000.0;
stripLine.StripWidth=1;
stripLine.BackColor=Color.Red;
stripLine.BorderDashStyle=ChartDashStyle.Dash;
stripLine.Text="警戒线标识";
chart1.ChartAreas["ChartArea1"].AxisY.StripLines.Add(stripLine);
#region 先设置为散点法显示(超出警戒线的点显示为红色,如果散点显示则使用这种判断方式)
// foreach(DataPoint point in chart1.Serier[0].Points)
//{
// if(point.YValues[0]>15000)
// point.Color=Color.Red;
//}
#endregion
#region 先设置为折线显示(然后设置折线拐点的大小与Style)
//设置线条的粗细
chart1.Series[0].BorderWidth=2;
//标记显示点的颜色
chart1.Series[0].MarkerBorderColor=Color.Blue;
//设置点的边框粗细
chart1.Series[0].MarkerBorderWidth=2;
//设置点的中心颜色
chart1.Series[0].MarkerColor=Color.White;
//设置点的大小
chart1.Series[0].MarkerSize=8;
//设置点的类型
chart1.Series[0].MarkerStyle=MarkerStyle.Circle;
//将超限的点修改为红色区分显示
foreach(DataPoint point in chart1.Series[0].Points)
{
//鼠标悬停显示数据
point.ToolTip=point.YValues[0].ToString();
if(point.YValues[0]>18000)
point.MarkerBorderColor=Color.Red;
}
#endregion
}