c# – 在mschart中添加数据点时双标签
我在C#.Net WinForms中编写代码,在点击图表上的某些数据点时添加标签.
在单击图表之前,图表看起来像这样. 现在我点击330-340之间的数据点.该图表显示了带有双标签的选定数据点(338.61).如下所示: 以下是调试输出: 以下是chart_mouseclick的以下代码 private void chart1_MouseClick(object sender,MouseEventArgs e) { if (e.Button == MouseButtons.Left) { double mouse_Xvalue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X); double mouse_Yvalue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y); DataPoint Prev_DataPoint = chart1.Series[0].Points.Select(x => x) .Where(x => x.XValue >= mouse_Xvalue) .DefaultIfEmpty(chart1.Series[0].Points.First()).First(); DataPoint Next_DataPoint = chart1.Series[0].Points.Select(x => x) .Where(x => x.XValue <= mouse_Xvalue) .DefaultIfEmpty(chart1.Series[0].Points.Last()).Last(); DataPoint Add_DataPoint = Math.Abs(Prev_DataPoint.XValue - mouse_Xvalue) < Math.Abs(Next_DataPoint.XValue - mouse_Xvalue) ? Prev_DataPoint : Next_DataPoint; int add_data_point_index = chart1.Series[0].Points.IndexOf(Add_DataPoint); DataPoint max = Add_DataPoint; for (int i = add_data_point_index - 10; i <= add_data_point_index + 10; i++) { DataPoint dp = chart1.Series[0].Points[i]; if (dp.YValues[0] > max.YValues[0]) { add_data_point_index = i; max = dp; } } chart1.Series[1].Points.Add(max); chart1.Series[1].Sort(PointSortOrder.Ascending,"X"); for (int i = 0; i < chart1.Series[1].Points.Count; i++) { chart1.Series[1].Points[i].Label = Math.Round(chart1.Series[1].Points[i].XValue,2).ToString(); } } } 代码有什么问题? 解决方法
这实际上是一个非常有趣的观察..
让我们来看看第二个版本,它适用于你: chart1.Series[1].Points.AddXY(max.XValue,max.YValue[0]) 或简而言之: series1.Points.AddXY(x,y); 这是添加DataPoints的常规方法:使用两个(或更多)值以及从Series默认值中获取的所有其他属性创建新点. “其他”属性包括颜色,标记和标签数据,包括IsValueShownAsLabel. 这里没有惊喜. 现在为原始版本: chart1.Series[1].Points.Add(max); 或简而言之 series1.Points.Add(dp); 其中max(或dp)是第一个系列(series0)中的DataPoints. 这表现出惊人的不同……: 可以想象DataPoint会被移动(就像Controls一样),但事实并非如此.或克隆像字符串一样. 而是仅创建新引用并将其添加到series1.Points.这有几个令人惊讶的后果..: >两个引用都指向同一个数据点对象;所以突然在series1中有一个点,其中属性取自series0,包括IsValueShownAsLabel! 因此确实无法使原始版本起作用,因为对同一点的两次引用将始终使图表显示标签两次或根本不显示. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |