C#Chart:关于ChartAreas.Cusor和读取X / Y值的多个问题

时间:2015-08-27 21:02:11

标签: c# charts

我有一个在服务器上运行的程序,它每隔5秒就会为其数据联系Online-API。数据成对保存在数据库中。一对由UNIX-Timestamp和double值组成。 在我的C#应用​​程序中,我想同时显示2个API的值。 X轴包含时间戳,Y轴包含双精度值。 保证两个系列都具有相同的X值 - 只有Y值不同。它看起来像这样:

The chart

你可以看到我已经将ChartArea [0] .CursorX添加到图表(绿线)。它会像这样更新:

private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = new Point(e.X, e.Y);

            chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(p, true);

            DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X));
            graph_time.Text = t.ToLongTimeString();

        }

因此绿色CursorX设置为鼠标的X位置。但是,我将间隔设置为5秒

  • 第一个问题

我试图在带有这些行的标签中显示CursorX的X值

    DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X));
graph_time.Text = t.ToLongTimeString();

问题是,它显示了真实光标(我隐藏的)位置的X值,而不是绿线。如何获得绿线的X轴值?

  • 第二个问题

我还想在两个单独的标签中显示绿色/蓝色和绿色/红色线的交叉点的值。有谁知道怎么做?我读到了HitTest,但你需要一个X和Y值。我需要像Vertical HitTest这样的东西。

  • 第三个也是最后一个问题

是否有可能将绿线(ChartArea.CursorX)绑定到实际的现有DataPoints而不是设置间隔?因为它有两个问题: 1。当图表的对看起来像这样(时间戳,值){2,1.23},{7,43.2},{12,5.3}和CursorX间隔设置为5秒,CursorX停在X = 0,5,10而不是X = 2,7,12。 2。有时两对之间的时差不是5秒,有时可能是4或6.这是非常5秒的间隔会产生错误 - 因为我希望CusorX只停留在现有的数据点。

所以,就是这样。我今天第一次尝试使用C#中的图表,并且有很多很酷的想法出现在我脑海中 - 实现它们有很多问题。希望你们中的一些人擅长C#排行榜并且可以帮助我:)

谢谢!

2 个答案:

答案 0 :(得分:0)

让我尝试回答而不进行测试..:

1 - 使用CursorX.Position获取光标所在的x值

2 - 找到光标前后的两个数据点并插入它们的Y值。您可以使用LINQ查找两个点。有关如何在点集合中搜索的示例,请参阅here

3 - 见2!选择第一个或第二个或最近点;你需要将Interval设置为0。

答案 1 :(得分:0)

我昨天晚上尝试了一下,我的问题的解决方案实际上比我想象的容易。它几乎像TaW的回答

        private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.X < 0 || e.Y < 0 || e.Location == prevPos)
                return;
            prevPos = e.Location;
            if (this.graphShowingData == false)
                return;

            Point p = new Point(e.X, e.Y);
            double searchVal = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);

            foreach (DataPoint dp in chart1.Series["Series1"].Points)
            {
                if(dp.XValue >= searchVal)
                {
                    chart1.ChartAreas[0].CursorX.SetCursorPosition(dp.XValue);
                    foreach(double yD in dp.YValues)
                    {
                        val_series1.Text = Math.Round(yD, 4).ToString();
                    }
                    break;
                }
            }

            foreach (DataPoint dp in chart1.Series["Series2"].Points)
            {
                if (dp.XValue >= searchVal)
                {
                    foreach (double yD in dp.YValues)
                    {
                        val_series2.Text = Math.Round(yD, 4).ToString();
                    }
                    break;
                }
            }


            DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].CursorX.Position);
            graph_time.Text = t.ToLongTimeString();

        }

此代码解决了我上面提到的所有三个问题。