在利用C#控件绘制曲线图后,有时我们需要通过鼠标查看数据点的值信息,常用的方法就是利用chart控件的chart1_GetToolTipText(object sender, ToolTipEventArgs e)事件来获取数据点的信息,如下我用两个label来显示获取的数据点的值
相关代码如下
private void chart1_GetToolTipText(object sender, ToolTipEventArgs e)
{
if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
{
int i = e.HitTestResult.PointIndex;
DataPoint dp = e.HitTestResult.Series.Points[i];
double x = dp.XValue;
double y = dp.YValues[0];
label1.Text = x.ToString();
label2.Text = y.ToString();
}
}
但是该方法有个弊端,那就是只能获取曲线上的点的信息,不能获取任意位置的信息。要解决这个问题,可以通过chart控件的
chart1_MouseMove(object sender, MouseEventArgs e)
事件来解决。
为了区分是捕获了曲线上的数据点,还是其他位置的信息,这里我再用一个label来显示,若鼠标捕获到了曲线上的数据点,label的标签就显示为“捕获”,否则为“未捕获”。
(当鼠标移动到曲线上的数据点时,显示数据点的信息,状态为捕获)
(当鼠标移开时,显示当前鼠标的坐标信息,状态为未捕获)
相关代码如下
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
//将鼠标沿轴的绝对像素位置转换为轴值
double x = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
double y = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
if(label3.Text=="未捕获")
{
label1.Text = x.ToString();
label2.Text = y.ToString();
}
}
private void chart1_GetToolTipText(object sender, ToolTipEventArgs e)
{
if(e.HitTestResult.ChartElementType==ChartElementType.DataPoint)
{
label3.Text = "未捕获";
int i=e.HitTestResult.PointIndex;
DataPoint dp = e.HitTestResult.Series.Points[i];
double x = dp.XValue;
double y = dp.YValues[0];
//若鼠标的坐标与曲线点的坐标差在3个像素之内,就认为鼠标捕获到了曲线上的数据点
if (Math.Abs(e.X - chart1.ChartAreas[0].AxisX.ValueToPixelPosition(x)) < 3 && Math.Abs(e.Y - chart1.ChartAreas[0].AxisY.ValueToPixelPosition(y)) < 3)
{
label3.Text = "捕获";
label1.Text = x.ToString();
label2.Text = y.ToString();
}
}
else
label3.Text = "未捕获";
}