zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    CHttpFile调试
    关于linux下网络编程socket 转换IP问题 inet_ntoa()
    vc使用SetTimer回调函数
    OpenGL+VC6.0开发环境搭建
    Java StringBuffer和StringBuilder类
    Java String类
    Java 异常处理
    hashcode()和equals()的作用、区别、联系
    抽象类可以继承实体类吗?
    Java 向上造型详解
  • 原文地址:https://www.cnblogs.com/rosesmall/p/9317614.html
Copyright © 2011-2022 走看看