Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过在图表区域上移动鼠标来显示折线图的最近数据点信息_C#_Charts - Fatal编程技术网

C# 如何通过在图表区域上移动鼠标来显示折线图的最近数据点信息

C# 如何通过在图表区域上移动鼠标来显示折线图的最近数据点信息,c#,charts,C#,Charts,我将在Windows窗体应用程序中使用c#绘制图表。我需要在折线图上画一个圆圈,并在标签上显示该数据点值,当鼠标移动到图表区域上时,该标签是距离鼠标指针x轴最近的数据点 我写了一个代码如下 private void Chart1_MouseMove(object sender, MouseEventArgs e) { HitTestResult result = Chart1.HitTest(e.X, e.Y); DataPoint nearestPoi

我将在Windows窗体应用程序中使用c#绘制图表。我需要在折线图上画一个圆圈,并在标签上显示该数据点值,当鼠标移动到图表区域上时,该标签是距离鼠标指针x轴最近的数据点

我写了一个代码如下

private void Chart1_MouseMove(object sender, MouseEventArgs e)
    {
        HitTestResult result = Chart1.HitTest(e.X, e.Y);

        DataPoint nearestPoint = null;

        if (prevPosition!=null)
        {

            Chart1.Series[0].Points[prevPosition.PointIndex].MarkerStyle = MarkerStyle.None;


        }


        if (result.ChartElementType == ChartElementType.DataPoint)
        {


            string xValue = DateTime.FromOADate(Chart1.Series[0].Points[result.PointIndex].XValue).ToString("yyyy/MM/dd");
            string yValue = Convert.ToString(Chart1.Series[0].Points[result.PointIndex].YValues[0]);

            Chart1.Series[0].Points[result.PointIndex].MarkerStyle = MarkerStyle.Circle;
            Chart1.Series[0].Points[result.PointIndex].MarkerSize = 7;
            Chart1.Series[0].Points[result.PointIndex].MarkerColor = Color.Green;

            label1.Text = "Date:" + xValue;
            label2.Text = "Price:" + yValue;
            prevPosition = result;

        }

但当鼠标移到所描绘的线附近时,此代码将显示该值和相应的线上方圆。当鼠标远离直线但在图表区域内时,它不会显示圆和值。我需要在离鼠标指针X轴最近的直线点上画一个圆圈,并在标签上显示该数据

您可以找到仅测量X值或y值或测量绝对距离的最近点。或者,您可以简单地在鼠标光标下输出值,而不管点是什么。最后一个

对于前三个选项中的每一个,这都会有所帮助:

用于设置和重置颜色的类级别变量..:

DataPoint dpXaxis = null;
DataPoint dpYaxis = null;
DataPoint dpAbs = null;
以及用于保留所有点的像素位置的点列表:

List<Point> pixPoints = null;
要查找两个方向上最接近的点,您需要包括轴的比例,或者,可能更容易,从保存点位置(以像素为单位)的
数据点创建
列表。为此,请使用反转轴功能。然后我以与上面Linq类似的方式计算delta

列表将按如下方式填充/更新:

List<Point> getPixPoints(Series s, ChartArea ca)
{
    List<Point> points = new List<Point>();
    foreach (DataPoint dp in s.Points)
    {
        points.Add(new Point(
            (int)ca.AxisX.ValueToPixelPosition(dp.XValue),
            (int)ca.AxisY.ValueToPixelPosition(dp.YValues[0])  ));
    }
    return points;
}
列出getPixPoints(系列s,ChartArea ca)
{
列表点=新列表();
foreach(s.Points中的数据点dp)
{
点。添加(新点)(
(int)约轴x.ValueToPixelPosition(dp.XValue),
(int)ca.AxisY.ValueToPixelPosition(dp.y值[0]);
}
返回点;
}
让我们在工作中看到它:


谢谢。第一个是我想要做的,但有时它会给出错误信息。“Position参数应在0到100之间。此行的参数名称:Position”。双值=最大像素位置值(e.X);这将是令人惊讶的。可能是你写的
PositionToValue
??位置是第三个坐标系,表示百分比。如果我将位置写入值,它会给出相同的错误。当图表上没有图表时,问题实际上会发生。在我的例子中,图形是在按钮点击事件上绘制的。啊,好的。这将是错误的。但是如果图表上没有数据,轴就不能工作。因此,您需要在事件开始处添加一个检查。我已经更新了答案。。
List<Point> getPixPoints(Series s, ChartArea ca)
{
    List<Point> points = new List<Point>();
    foreach (DataPoint dp in s.Points)
    {
        points.Add(new Point(
            (int)ca.AxisX.ValueToPixelPosition(dp.XValue),
            (int)ca.AxisY.ValueToPixelPosition(dp.YValues[0])  ));
    }
    return points;
}