(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;