当前位置:   article > 正文

C# Chart控件的使用总结_c# chart 设置显示的最大最小值

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

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

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

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

  1. myds = new DataSet();
  2. myda.Fill(myds, "DeviceState");
  3. mycon.Close();
  4. //如图1所示,本例:X轴是日期,Y轴是设备1,绑定方式如下
  5. chart1.DataSource = myds.Tables["DeviceState"];
  6. chart1.Series[0].XValueMember = "日期"; //绑定X轴的值
  7. chart1.Series[0].YValueMembers = "设备1"; //绑定Y轴的值 

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

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

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

  1.   DataTable dt = new DataTable("DeviceState");
  2. myda.Fill(dt);
  3. mycon.Close();
  4. chart1.DataSource = dt;

注:此时是因为借助mydadt已经将整个表复制了过来,不然还要人为添加表的内容。。。

         对应的图表X轴、Y轴绑定数据如下:          

  1. for (inti = 0; i < dt.Columns.Count - 2; i++)
  2. {
  3. chart1.Series[i].XValueMember = dt.Columns[1].ColumnName;
  4. chart1.Series[i].YValueMembers = dt.Columns[i + 2].ColumnName;
  5. chart1.Series[i].XValueType = ChartValueType.DateTime;
  6. chart1.Series[i].ChartType = SeriesChartType.StackedColumn; //设置图表类型             
  7. }

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

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

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

  1. DataTable dt = new DataTable("DeviceState");
  2. myda.Fill(dt);
  3. mycon.Close();
  4. //chart1.DataSource = dt;(这句话就不要了,因为下面会一一赋值)
  5. if (dt.Rows.Count == 0) return;
  6. DateTime[] iXAxis = new DateTime[dt.Rows.Count];
  7. DateTime[] dtXAxis = new DateTime[dt.Rows.Count];
  8. float[] fDownTime = new float[dt.Rows.Count];//设备1
  9.             float[] fDownTime1 = new float[dt.Rows.Count];//设备2
  10.             float[] fDownTime2 = new float[dt.Rows.Count];
  11. //     ………………定义数组,直至fDownTime9
  12. float[] fDownTime9 = new float[dt.Rows.Count];
  13. for (int i = 0; i < dt.Rows.Count; i++) //然后针对DataTable循环对数组赋值
  14.             {
  15. dtXAxis[i] = (DateTime)dt.Rows[i][1];
  16. iXAxis[i] = (DateTime)dt.Rows[i][1];
  17. fDownTime[i] = float.Parse(dt.Rows[i][2].ToString());
  18. fDownTime1[i] = float.Parse(dt.Rows[i][3].ToString());
  19. fDownTime2[i] = float.Parse(dt.Rows[i][4].ToString());
  20. //      ………………直至fDownTime9绑定结束
  21. fDownTime9[i] = float.Parse(dt.Rows[i][11].ToString());
  22. }
  23. chart1.Series[0].XValueType = ChartValueType.DateTime;
  24. chart1.Series[0].Points.DataBindXY(iXAxis, fDownTime);
  25. chart1.Series[0].ChartType = SeriesChartType.StackedColumn;

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

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

(2)来自列表

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

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

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

(3)来自单独的数据

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

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

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

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

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

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

3、  常用的属性

  1. chart1.Series[0].ChartType = SeriesChartType.Line;//设置曲线类型
  2. chart1.Series[0].XValueType = ChartValueType.DateTime;//设置X轴绑定值的类型
  3. chart1.Series[0].LegendToolTip = "Target Output";//鼠标放到系列上出现的文字 
  4. chart1.Series[0].LegendText = "Target Output";//系列名字 
  5. chart1.ChartAreas[0].AxisX.Minimum = 1;//坐标最小值,这样的话,X轴坐标是从1开始
  6. chart1.Series[0].IsValueShownAsLabel = true;//值作为标签显示在图表中
  7. chart1.Series[0].BorderWidth = 3;//设置线宽
  8. chart1.ChartAreas[0].AxisX.Interval = 1;//设置X轴间距,这样的话,就间距固定为1
  9. double max = 120, min = 0;
  10. chart1.ChartAreas[0].AxisY.Maximum = max;//设置Y轴最大值
  11. chart1.ChartAreas[0].AxisY.Minimum = min; //设置Y轴最小值

大致就是这些,后续有什么想起来的,再补充。。。

------------------------------------------------------------ 某个未知的时间------------------追加---------------------------------------

  1. //设置坐标轴标题
  2. chart1.ChartAreas[0].AxisX.Title = "日期";
  3. chart1.ChartAreas[0].AxisY.Title = "产量";
  4. chart1.ChartAreas[0].AxisY2.Title = "百分比(%)";
  5. //设置坐标轴标题的字体
  6. chart1.ChartAreas[0].AxisX.TitleFont = new Font("宋体", 12F);
  7. chart1.ChartAreas[0].AxisY.TitleFont = new Font("宋体", 12F);
  8. chart1.ChartAreas[0].AxisY2.TitleFont = new Font("宋体", 12F);
  9. //设置坐标轴栅格是否可见。。
  10. chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
  11. chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
  12. chart1.ChartAreas[0].AxisY2.MajorGrid.Enabled = false;

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

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

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

  1.  for (int i = 0; i < listp.Count; i++)//仍然用上面的listp做例子
  2. {
  3.     if (int.Parse(listp[i].Value) > 24)
  4.      {
  5.          chart1.Series[0].Points[i].Color = Color.Green;
  6.      }
  7.      else
  8.       {
  9.         chart1.Series[0].Points[i].Color = Color.Orange;
  10.       }
  11.   }       

                              

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

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

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/270670
推荐阅读
相关标签
  

闽ICP备14008679号