我正在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();
}
}
}
代码有什么问题?
答案 0 :(得分:1)
这实际上是一个非常有趣的观察。
让我们看看第二个版本,它对您来说很好用:
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
(或DataPoints
)是series0
。
这表现出惊人的不同..:
一个人可以想象DataPoint
被移动了(<{>} {strong} ),但事实并非如此。或像字符串一样被克隆。
相反,仅创建新参考,并将其添加到Controls
。这会带来一些令人惊讶的后果。
两个引用都指向同一个数据点对象;因此突然之间,系列1中的一个点具有从系列0中获取的属性,包括series1.Points
!
由于两个系列现在都包含一个具有相同值/坐标的数据点,因此图表非常聪明,可以稍微分开地显示其标签,从而避免重叠。 这就是您看到的效果。
如果现在将数据点从其原始的series0中删除,则series1仍将包含对其进行引用的颜色,标签等,就像在series0中一样。.
所以实际上没有办法使原始版本起作用,因为对同一点的两次引用将始终使图表显示标签两次或根本不显示标签。