C# Chart控制元件的使用總結

快樂阿拉蕾發表於2017-06-16

最近一直在畫圖表,總結一下,方便以後參考。

1、  圖表的各種屬性

對不起,我太懶了,詳情看如下的連結吧。。。。

http://blog.sina.com.cn/s/blog_621e24e20101cp64.html

2、關於圖表的資料來源

(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軸繫結資料如下:

1MachineStsTable的詳情

序列1Series[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;

注:此時是因為藉助mydadt已經將整個表複製了過來,不然還要人為新增表的內容。。。

對應的圖表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);中的DataBindXYX,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個序列的繫結方式如上述序列1Series[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;
           

 

相關文章