C#Chart控件的使用总结1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#Chart控件的使⽤总结1
(1)来⾃SQL server
此时就可以⽤查询语句,来获取你要⽤到的数据
(要引⽤如下命名空间:
using System.Data.SqlClient;
usingSystem.Windows.Forms.DataVisualization.Charting;)
SqlConnection mycon;
SqlDataAdaptermyda;
DataSet myds;
stringcon, sql;
con ="Server=(local);Database=OutputDB;Trusted_Connection=SSPI";
sql = "select * fromMachineStsTable where " +"⽇期>= " +"'" + dateTimePicker1.Value.ToString("yyyyMMdd")+ "'"+"AND⽇期<= " +"'" +dateTimePicker2.Value.ToString("yyyyMMdd ")+"'";
mycon =newSqlConnection(con);
mycon.Open();
myda =newSqlDataAdapter(sql,con);
此时,chart1的数据源有3种绑定⽅式。
⽅式⼀:直接将要查询的那张表的表名绑定上去
myds=newDataSet();
myda.Fill(myds,"MachineStsTable");
mycon.Close();
chart1.DataSource= myds.Tables["MachineStsTable"];
对应的图表X轴、Y轴绑定数据如下:
图1表MachineStsTable的详情
序列1(Series[0])的绑定⽅式如下:
chart1.Series[0].XValueMember= "⽇期";
chart1.Series[0].YValueMembers= "全⽣产线";
chart1.Series[0].LegendToolTip ="全⽣产线";//⿏标放到系列上出现的⽂字
chart1.Series[0].LegendText ="全⽣产线";//系列名字
chart1.Series[0].XValueType =ChartValueType.Date;
chart1.Series[0].ChartType= SeriesChartType.Line;
剩下的其它序列绑定同上。
由此看出,此种⽅式只适合要显⽰的序列⽐较少的情况。
还是建议⽤⽅式2,将表复制到DataTable的实例中。
⽅式⼆:⽤新定义的DataTable类型的dt来绑定
DataTable dt =newDataTable("MachineStsTable");
myda.Fill(dt);
mycon.Close();
chart1.DataSource = dt;
注:此时是因为借助myda,dt已经将整个表复制了过来,不然还要⼈为添加表的内容。
对应的图表X轴、Y轴绑定数据如下:
for(inti = 0; i < dt.Columns.Count -2; i++)
{
chart1.Series[i].XValueMember = dt.Columns[1].ColumnName;
chart1.Series[i].YValueMembers = dt.Columns[i + 2].ColumnName;
chart1.Series[i].LegendToolTip = dt.Columns[i + 2].ColumnName;//⿏标放到系列上出现的⽂字
chart1.Series[i].LegendText = dt.Columns[i + 2].ColumnName;//系列名字
chart1.Series[i].XValueType =ChartValueType.DateTime;
chart1.Series[i].ChartType =SeriesChartType.StackedColumn;
}
这种就⾮常适合Y轴种类特别多的情况。
⼀个循环,搞定所有。
⽅式三:⽤类似chart1.Series[0].Points.DataBindXY(iXAxis,fTargetOT);中的DataBindXY(X,Y)来绑定数据。
其中,X是⼀个数组,Y也是数组,在绑定之前需要对数组中的每个元素赋值,例⼦如下(同样是上述图1中的表格):
DataTable dt =newDataTable("MachineStsTable");
myda.Fill(dt);
mycon.Close();
//chart1.DataSource = dt;(这句话就不要了,因为下⾯会⼀⼀赋值)
if (dt.Rows.Count == 0)
{
return;
}
DateTime[] iXAxis =newDateTime[dt.Rows.Count];
DateTime[] dtXAxis =newDateTime[dt.Rows.Count];
float[]fDownTime =newfloat[dt.Rows.Count];//全⽣产线
float[]fDownTime1 =newfloat[dt.Rows.Count];//绕线机
float[]fDownTime2 =newfloat[dt.Rows.Count];
………………直⾄
float[]fDownTime10=newfloat[dt.Rows.Count];
for(inti = 0; i < dt.Rows.Count; i++)
{
// dtXAxis[i] =(DateTime)dt.Rows[i][1];
iXAxis[i] = (DateTime)dt.Rows[i][1];
fDownTime[i]=float.Parse(dt.Rows[i][2].ToString());
fDownTime1[i]=float.Parse(dt.Rows[i][3].ToString());
fDownTime2[i]=float.Parse(dt.Rows[i][4].ToString());
………………直⾄
fDownTime10[i]=float.Parse(dt.Rows[i][12].ToString());
}
chart1.Series[0].XValueType =ChartValueType.DateTime;
chart1.Series[0].Points.DataBindXY(iXAxis, fDownTime);
chart1.Series[0].LegendToolTip ="全⽣产线";//⿏标放到系列上出现的⽂字
chart1.Series[0].LegendText ="全⽣产线";//系列名字
chart1.Series[0].ChartType =SeriesChartType.StackedColumn;
另外的10个序列的绑定⽅式如上述序列1(Series[0])。
此种⽅式,适合,读过来的数据需要进⾏处理的情况,如果不需要处理,⽽且列特别多,则不建议使⽤这种⽅式,⽤⽅式⼆⽐较⽅便。
(2)来⾃Web Api。
这种要跟写Web Api的⼯程师对接,知道调⽤⽅式,才能按照他返回的数据格式,来绑定数据源。
⽅式同来源于SQL Server。
此时也建议根据要显⽰的情况,建⽴⼀个DataTable,再对表的列和⾏进⾏赋值,再按(1)中的⽅式⼆来进⾏绑定。
⼤致例⼦如下:DateTime[] dtXAxis =newDateTime[device_faultdescs.Count];
System.Data.DataTable myTab =newSystem.Data.DataTable("His");
myTab.Columns.Add("ID",Type.GetType("System.Int32"));
myTab.Columns[0].AutoIncrement =true;
myTab.Columns[0].Unique =true;
myTab.Columns[0].AutoIncrementSeed = 1;
myTab.Columns[0].AutoIncrementStep = 1;
myTab.Columns.Add("Xvalue",Type.GetType("System.DateTime"));
myTab.Columns.Add("停机类型",Type.GetType("System.String"));
//给要添加的列,动态添加列名,以及对应列下的数据类型。
for (intj = 0; j < device_faultdescs[0].desc.Count; j++)
{
myTab.Columns.Add(device_faultdescs[0].desc[j].desc,Type.GetType("System.Double"));
}
for(inti = 0; i < device_faultdescs.Count; i++)
{
DataRow newRow = myTab.NewRow();
for(intj = 0; j < device_faultdescs[i].desc.Count; j++)
{
newRow[device_faultdescs[i].desc[j].desc] =Math.Round(device_faultdescs[i].desc[j].downtime,2);
newRow["ID"] = i;
newRow["Xvalue"] =DateTime.Parse(Program.mainForm.dateTimePicker1.Value.ToString("yyyy-MM-dd"));
newRow["停机类型"] = device_faultdescs[i].devicename;
// myTab.Rows.Add(new object[] { null,scraps[i].dt, scraps[i].detail[j].count });
// myTab.Rows[i]
}
myTab.Rows.Add(newRow);
}
//动态建⽴序列在chart2上
chart2.DataSource = myTab;
chart2.Series.Clear();
for (inti = 0; i < myTab.Columns.Count-3; i++)
{
chart2.Series.Add(i.ToString());//添加
}
for (intj = 0; j < myTab.Columns.Count - 3; j++)
{
chart2.Series[j].XValueMember = myTab.Columns[2].ColumnName;
chart2.Series[j].YValueMembers = myTab.Columns[j + 3].ColumnName;
chart2.Series[j].LegendToolTip =myTab.Columns[j + 3].ColumnName;//⿏标放到系列上出现的⽂字 chart2.Series[j].LegendText = myTab.Columns[j + 3].ColumnName; //系列名字
chart2.Series[j].XValueType =ChartValueType.String;
chart2.Series[j].ChartType =SeriesChartType.StackedColumn;
}
(3)来⾃单独的数据
动态添加序列,
chart3.Series.Clear();
Series seriesDownTime =newSeries("DownTime");//此时就添加⼀个序列,chart3.Series[0] seriesDownTime.ChartType =SeriesChartType.Column;
//⽐如要添加的内容放在了数组X和数组Y中,则添加第⼀个值可以如下添加:
seriesDownTime.Points.AddXY(X[0],Y[0]);
下⼀个值与之类似,直到把很少的⼏个点添加完成即可。
此种⽅式适合要显⽰在图表上的只有少量的⼏个点,如果数据众多,建议按集合来添加。
3、常⽤的属性
chart1.Series[0].ChartType =SeriesChartType.Line;//设置曲线类型
chart1.Series[0].XValueType =ChartValueType.DateTime;//设置X轴绑定值的类型
chart1.Series[0].LegendToolTip ="Target Output";//⿏标放到系列上出现的⽂字
chart1.Series[0].LegendText ="Target Output";//系列名字
chart1.ChartAreas[0].AxisX.Minimum = 1;//坐标最⼩值,这样的话,X轴坐标是从1开始
chart1.Series[0].IsValueShownAsLabel =true;//值作为标签显⽰在图表中
chart1.Series[0].BorderWidth = 3;//设置线宽
chart1.ChartAreas[0].AxisX.Interval = 1;//设置X轴间距,这样的话,就间距固定为1
double max = 120, min = 0;
chart1.ChartAreas[0].AxisY.Maximum = max;//设置Y轴最⼤值
chart1.ChartAreas[0].AxisY.Minimum = min; //设置Y轴最⼩值
⼤致就是这些,后续有什么想起来的,再补充。
//设置坐标轴标题
chart1.ChartAreas[0].AxisX.Title = "不良类型";
chart1.ChartAreas[0].AxisY.Title = "复检个数";
chart1.ChartAreas[0].AxisY2.Title = "NG复检百分⽐(%)";
//设置坐标轴标题的字体
chart1.ChartAreas[0].AxisX.TitleFont = new Font("宋体",12F); chart1.ChartAreas[0].AxisY.TitleFont = new Font("宋体", 12F); chart1.ChartAreas[0].AxisY2.TitleFont = new Font("宋体", 12F); //设置坐标轴栅格是否可见。
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY2.MajorGrid.Enabled = false;。