c# – 在mschart中添加数据点时双标签

我在C#.Net WinForms中编写代码,在点击图表上的某些数据点时添加标签.

在单击图表之前,图表看起来像这样.

《c# – 在mschart中添加数据点时双标签》

现在我点击330-340之间的数据点.该图表显示了带有双标签的选定数据点(338.61).如下所示:
《c# – 在mschart中添加数据点时双标签》

以下是调试输出:
《c# – 在mschart中添加数据点时双标签》

以下是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中一样.

因此确实无法使原始版本起作用,因为对同一点的两次引用将始终使图表显示标签两次或根本不显示.

点赞