VerticalLineAnnotation未显示在RangeBar MSChart上

时间:2017-10-05 11:14:40

标签: c# winforms charts mschart

一般信息:C#,WinForms。

我正在尝试创建一些时间表,在其中我可视化生产过程的历史和/或计划数据。我这样做是使用RangeBar风格的MSChart。我成功地将图表配置为我的个人要求,并使用正确的X和Y值填充图表。

当正在进行当前正在进行的过程时,我想在图表上显示一条垂直线,与当前时间相对应。通过SO搜索让我相信VerticalLineAnnotation对象将是实现这种可视化的最佳方式。但无论我尝试什么,无论我设置哪种属性组合,我似乎无法使VerticalLineAnnotation出现在屏幕上。以下是我的测试项目中的代码,在这种情况下,X和Y值以及点毫无意义:

ChartArea ca = chart.ChartAreas.Add("CA");
Series s1 = chart.Series.Add("s1");

s1.ChartArea = ca.Name;
s1.ChartType = SeriesChartType.RangeBar;
s1.XValueType = ChartValueType.String;
s1.YValueType = ChartValueType.DateTime;
ca.AxisY.LabelStyle.Format = "HH:mm tt";

ca.AxisY.Maximum = DateTime.ParseExact("20-9-2017 9:20:00", "dd-M-yyyy H:mm:ss", null).ToOADate();
ca.AxisY.Minimum = DateTime.ParseExact("20-9-2017 8:10:00", "dd-M-yyyy H:mm:ss", null).ToOADate();

int pointIndex = chart.Series["s1"].Points.AddXY(2, DateTime.ParseExact("20-9-2017 8:13:45", "dd-M-yyyy H:mm:ss", null).ToOADate(), DateTime.ParseExact("20-9-2017 9:17:05", "dd-M-yyyy H:mm:ss", null).ToOADate() );
chart.Series["s1"].Points.Add(new DataPoint() { AxisLabel = "SO", XValue = 1, YValues = new double[] { DateTime.ParseExact("20-9-2017 8:13:01", "dd-M-yyyy H:mm:ss", null).ToOADate(), DateTime.ParseExact("20-9-2017 8:15:57", "dd-M-yyyy H:mm:ss", null).ToOADate() } });
chart.Series["s1"].Points.Add(new DataPoint() { AxisLabel = "SO", XValue = 1, YValues = new double[] { DateTime.ParseExact("20-9-2017 9:13:01", "dd-M-yyyy H:mm:ss", null).ToOADate(), DateTime.ParseExact("20-9-2017 9:15:57", "dd-M-yyyy H:mm:ss", null).ToOADate() } });

s1.Points[pointIndex].AxisLabel = "Hello";
s1.Points[pointIndex].Color = Color.Blue;

// Please ignore the different Points adding/altering style, I was experimenting a bit in my test project

chart在Visual Studio Designer中创建并声明为private System.Windows.Forms.DataVisualization.Charting.Chart chart;

在此之前,我的代码按预期工作,并提供以下图表:https://imgur.com/XUYhhC0.jpg(抱歉,由于信誉不佳,无法直接发布图片)。

出于测试目的,我尝试使用以下代码在8:45:00创建VerticalLineAnnotation

VerticalLineAnnotation LA = new VerticalLineAnnotation();
LA.AxisX = ca.AxisX;
LA.AxisY = ca.AxisY;
LA.Y = DateTime.ParseExact("20-9-2017 8:45:00", "dd-M-yyyy H:mm:ss", null).ToOADate();
LA.LineWidth = 2;
LA.Height = ca.AxisY.Maximum - ca.AxisY.Minimum // Should span entire chart
LA.LineColor = Color.Red;
LA.ClipToChartArea = ca.Name;
chart.Annotations.Add(LA);

代码编译得很好,但结果与上一个图像相同:一个RangeBar图表,其中包含正确的条形图,但没有VerticalLineAnnotation的符号。

我觉得我没有设置一个重要的属性(我尝试将LA.Visible设置为true,但它已经默认为true,所以它没有什么区别)。我查看了文档,但这似乎没有暗示RangeBar图表与VerticalLineAnnotations不兼容的任何地方。我不知道还有什么要检查...

1 个答案:

答案 0 :(得分:1)

两个问题:

1 - 这只是一个错字(你想要最大 - 最小,对吧?)..

LA.Height = ca.AxisY.Maximum - ca.AxisY.Maximum // Should span entire chart

但它也不是推荐的方式......要跨越整个图表区域,您可以使用

的组合
LA.IsInfinitive = true;
LA.ClipToChartArea = ca.Name;

2 - 你已经尝试了很多东西,但是注释的x值,就像y,高度和宽度绝不是无关紧要的;你需要设置线的x位置,也许这​​样就可以将它与第一点的起点对齐..:

LA.X = chart.Series[0].Points[0].YValues[0];