我想得到一个系列的Y值,该系列对应于用户点击的ChartArea的X位置。
我试图在点击的图表区域内捕获鼠标的X位置,但我得到NaN返回结果:
private void chart_Click(object sender, EventArgs e)
{
double XVal = chart.ChartAreas[0].CursorX.Position;
}
一旦我在用户点击了鼠标的图表区域中获得了X位置,我就会想用它来获得该x位置的系列的Y值。
答案 0 :(得分:2)
至于chart.ChartAreas[0].CursorX
:Chart Cursor
是zooming创建并用于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
;非常适合Columns
或Bars
,但Points
或Bubbles
不太好。
您可以致电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];
}