C# Chart控件的使用总结

最近一直在画图表,总结一下,方便以后参考。

1、图表的各种属性

 

对不起,我太懒了,详情看如下的链接吧。。。。

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

2、关于图表的数据来源

                                                                      图1表DeviceState的详情

(1)来自SQL server

         此时就可以用查询语句,来获取你要用到的数据

(要引用如下命名空间:using System.Data.SqlClient; using System.Windows.Forms.DataVisualization.Charting;)

   SqlConnection mycon; SqlDataAdapter myda; DataSet myds;
   string con = "Server=(local);Database=OutputDB;Trusted_Connection=SSPI";
   string sql = "select * from DeviceState where " + "日期>= " + "'" + 
   DateTime.Now.AddDays(-2).ToString("yyyyMMdd") + "'" + "AND 日期<= " + "'" + 
   DateTime.Now.ToString("yyyyMMdd ") + "'";
   mycon = new SqlConnection(con);
   mycon.Open(); 
   myda = new SqlDataAdapter(sql, con);

    此时,chart1的数据源有3种绑定方式。

方式一:直接将要查询的那张表的表名绑定上去

  myds = new DataSet();
  myda.Fill(myds, "DeviceState");
  mycon.Close();

  //如图1所示,本例:X轴是日期,Y轴是设备1,绑定方式如下
  chart1.DataSource = myds.Tables["DeviceState"];
  chart1.Series[0].XValueMember = "日期"; //绑定X轴的值
  chart1.Series[0].YValueMembers = "设备1"; //绑定Y轴的值 

剩下的其它序列绑定同上。。

由此看出,此种方式只适合要显示的序列比较少的情况。。还是建议用方式2,将表复制到DataTable的实例中。

方式二:用新定义的DataTable类型的dt来绑定

    DataTable dt = new DataTable("DeviceState");
    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].XValueType = ChartValueType.DateTime;
     chart1.Series[i].ChartType = SeriesChartType.StackedColumn; //设置图表类型             
}

这种就非常适合Y轴种类特别多的情况。。。。一个循环,搞定所有。。。

方式三:用类似chart1.Series[0].Points.DataBindXY(iXAxis,fTargetOT);中的DataBindXYX,Y)来绑定数据。。

其中,X是一个数组,Y也是数组,在绑定之前需要对数组中的每个元素赋值,例子如下(同样是上述图1中的表格):

            DataTable dt = new DataTable("DeviceState");
            myda.Fill(dt);
            mycon.Close();

            //chart1.DataSource = dt;(这句话就不要了,因为下面会一一赋值)

            if (dt.Rows.Count == 0) return;
            DateTime[] iXAxis = new DateTime[dt.Rows.Count];
            DateTime[] dtXAxis = new DateTime[dt.Rows.Count];
            float[] fDownTime = new float[dt.Rows.Count];//设备1
            float[] fDownTime1 = new float[dt.Rows.Count];//设备2
            float[] fDownTime2 = new float[dt.Rows.Count];
            //     ………………定义数组,直至fDownTime9
            float[] fDownTime9 = new float[dt.Rows.Count];
            for (int i = 0; i < dt.Rows.Count; i++) //然后针对DataTable循环对数组赋值
            {
                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());
                //      ………………直至fDownTime9绑定结束
                fDownTime9[i] = float.Parse(dt.Rows[i][11].ToString());
            }

            chart1.Series[0].XValueType = ChartValueType.DateTime;
            chart1.Series[0].Points.DataBindXY(iXAxis, fDownTime);
            chart1.Series[0].ChartType = SeriesChartType.StackedColumn;

另外的9个序列的绑定方式如上述序列1(Series[0])。。

此种方式,适合,读过来的数据需要进行处理的情况,如果不需要处理,而且列特别多,则不建议使用这种方式,用方式二比较方便。

(2)来自列表

如果数据来源是一个列表,并且X轴和Y轴要绑定的值是这列表中某2个字段,则可以按照如下方式进行数据源绑定:

        class point //point类
        {
            public string Name { get; set; }
            public string Value { get; set; }
        }
 
        List<point> listp = new List<point>();
        for (int i = 0; i < 5; i++)//循环,给listp添加值
        {
           point p = new point();
           p.Name = "X0" + (i + 1).ToString();
           p.Value = (20 + i * 2).ToString();
           listp.Add(p);
         }
          chart1.DataSource = listp; //将listp绑定给chart1
          chart1.Series[0].XValueMember = "Name";//将listp中所有Name元素作为X轴
          chart1.Series[0].YValueMembers = "Value";//将listp中所有Value元素作为Y轴
          chart1.DataBind(); //绑定数据,数据源如果是DataTable就不需要这一步

此种方式,比较适合哪种X轴和Y轴元素均来自同一个列表的情况,可以不用循环,直接按照类的成员名来进行绑定。另外,chart1.DataBind();语句,需要写上。 

(3)来自单独的数据

比如要添加的内容放在了数组X和数组Y中,则添加第一个值可以如下添加:          

seriesDownTime.Points.AddXY(X[0], Y[0]);
seriesDownTime.Points.AddXY(X[1], Y[1]);

下一个值与之类似,直到把很少的几个点添加完成即可。。。

 或者,直接用DataBindXY,例子如下:   

string[] strXAxis = new string[8] { "0", "K01", "K02", "K03", "K04", "K05", "", "7" };
int[] iYAxis = new int[8] { 20, 40, 87, 29, 33, 0, 0, 0 };
chart1.Series[0].Points.DataBindXY(strXAxis, iYAxis);

此种方式适合要显示在图表上的只有少量的几个点,如果数据众多,建议按集合来添加。

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 = "百分比(%)";

            //设置坐标轴标题的字体
            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;

------------------------------------------------------------ 2019-07-10------------------追加------------------------------------------

(1)    在图表类型是Column的图表中,可以对柱状图的某个“柱子”进行颜色的设置。

             示例代码如下,效果图如图2所示。

 for (int i = 0; i < listp.Count; i++)//仍然用上面的listp做例子
 {
    if (int.Parse(listp[i].Value) > 24)
     {
         chart1.Series[0].Points[i].Color = Color.Green;
     }
     else
      {
        chart1.Series[0].Points[i].Color = Color.Orange;
      }
  }       

                              

                                          图2 设定柱状图各个“柱子”颜色示意 

(2) 如果在图2的柱状图中,想要添加一条基准线,比如是目标值之类的,看看实际柱状图达标情况,可以利用StripLine来实现。但我测试了下,发现需要进行以下设置:      

 chart1.ChartAreas[0].AxisY.Enabled = AxisEnabled.True;//把Y轴是否启用属性设置为True
 //本例因为给listp绑定的值偏小,然后画的目标线值又太大(例子中将设置为80),就需要做一些设置
 chart1.ChartAreas[0].AxisY.Minimum = 0;//设置Y轴的最小值
 chart1.ChartAreas[0].AxisY.Maximum = 120;//设置Y轴的最大值

之后在数据绑定之后,调用如下函数,就会出现如图2所示的效果。 

 private void AddStripLine(Chart chartInfo)
 {          
    double max = 80;
    StripLine stripMax = new StripLine();
    stripMax.Text = string.Format("最大:{0:F}", max);//展示文本
    stripMax.Font = new Font("宋体", 20);//文本字体
    stripMax.BackColor = Color.FromArgb(208, 109, 106);//背景色
    stripMax.Interval = 0;//间隔
    stripMax.IntervalOffset = max;//偏移量
     stripMax.StripWidth = 0.001;//线宽
     //   stripMax.ForeColor = Color.White;//前景色
      stripMax.TextAlignment = StringAlignment.Near;//文本对齐方式          
     chartInfo.ChartAreas[0].AxisY.StripLines.Add(stripMax);//添加到ChartAreas中
 }

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页