加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:53:28 所属栏目:百科 来源:网络整理
导读:我在C#.Net WinForms中编写代码,在点击图表上的某些数据点时添加标签. 在单击图表之前,图表看起来像这样. 现在我点击330-340之间的数据点.该图表显示了带有双标签的选定数据点(338.61).如下所示: 以下是调试输出: 以下是chart_mouseclick的以下代码 privat
我在C#.Net WinForms中编写代码,在点击图表上的某些数据点时添加标签.
在单击图表之前,图表看起来像这样.

Chart before click

现在我点击330-340之间的数据点.该图表显示了带有双标签的选定数据点(338.61).如下所示:

Chart after click

以下是调试输出:

Debug Output

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读