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!
>由于两个系列现在都包含具有相同值/坐标的数据点,因此图表足够智能以略微分开显示其标签以避免重叠.这是你看到的效果.
>如果你现在从原始的series0中删除了数据点,那么series1仍然会包含对它的引用,颜色,标签等就像在series0中一样.
因此确实无法使原始版本起作用,因为对同一点的两次引用将始终使图表显示标签两次或根本不显示.
标签:c,net,label,charts,mschart 来源: https://codeday.me/bug/20190705/1387598.html