从单击ChartArea的X光标位置获取系列的Y值

时间:2015-11-24 16:49:34

标签: c# charts

我想得到一个系列的Y值,该系列对应于用户点击的ChartArea的X位置。

我试图在点击的图表区域内捕获鼠标的X位置,但我得到NaN返回结果:

 private void chart_Click(object sender, EventArgs e)
    {
       double XVal = chart.ChartAreas[0].CursorX.Position;
    }

一旦我在用户点击了鼠标的图表区域中获得了X位置,我就会想用它来获得该x位置的系列的Y值。

3 个答案:

答案 0 :(得分:2)

  • 您的代码有什么问题?

至于chart.ChartAreas[0].CursorXChart Cursorzooming创建并用于theory的对象,然后

  

表示定义位置的水平或垂直线   轴。

因此它与鼠标光标没什么关系,并且在不缩放或(当禁用缩放时)选择时无效。

  • 如何解决您的问题?

你有几个选择;不幸的是,没有一个简单的正是你所要求的。

一个简单的事情是使用HitTest Charts

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    HitTestResult hit = chart1.HitTest(e.X, e.Y);
    if (hit.PointIndex >= 0)
        infoLabel.Text = "Over DataPoint No " +  hit.PointIndex;
}

这很简单且安全,但只有当光标实际上超过 a DataPoint时才会起作用。它适合你的程度可能取决于ChartType;非常适合ColumnsBars,但PointsBubbles不太好。

您可以致电PixelPositionToValue

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    var xv =  chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);                    
    var yv =  chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
    infoLabel.Text = "x = " +  xv + "   y =" + yv;
}

dummy call中,从Paint事件之一调用它是安全的,但实际上从用户交互中调用它似乎也可以正常工作。 (如果遇到问题,可以在其中一个Paint事件上执行{{3}},并在拉出所需的值后用标记中止它;该示例比您更多需要,但我怀疑它是否有必要..)

但是,它只会根据轴返回 Values,而不是最近的DataPoint。如果您确实需要获得实际的DataPoint,那么您必须搜索Points的{​​{1}} ..:

Series

这应该会显示上一个和下一个Series S = chart1.Series[0]; // short reference DataPoint pPrev = S.Points.Select(x => x) .Where(x => x.XValue >= xv) .DefaultIfEmpty(S.Points.First()).First(); DataPoint pNext = S.Points.Select(x => x) .Where(x => x.XValue <= xv) .DefaultIfEmpty(S.Points.Last()).Last(); 。您可以自行决定使用哪一个..

答案 1 :(得分:0)

首先将鼠标点击位置转换为相对位置:

UPDATE MY_TABLE SET DT_UPDATE_OPERATION = ?

然后将相对位置转换为轴位置:

x= 100.0 * e.X / chart.Width

然后使用轴位置探测系列(例如插入或最喜欢的点)

答案 2 :(得分:0)

由于&#34; MouseEventArgs&#34;

,您需要一个用于图表控件的MouseClick-Handler而不是普通的Click-Handler。
private void chart1_MouseClick(object sender, MouseEventArgs e)
{
    //check where you clicked, returns different information like the clicked series name and the index of the clicked point
    HitTestResult clicked = chart1.HitTest(e.X, e.Y);
    //this is how you get your y-Value
    double yValue = chart1.Series[clicked.Series.Name].Points[clicked.PointIndex].YValues[0];
}