一般信息: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不兼容的任何地方。我不知道还有什么要检查...
答案 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];