选择图表上的特定值
Selecting specific values on a Chart
我正在尝试使用图表上的数据创建一种复制和粘贴功能,我想知道是否有任何方法可以在单击图表时获取图表上某个点的 x 位置?
基本上,我的想法是能够单击图形的一部分并拖动到 select 一个区域,然后我将相应地对其进行处理。
因此,我需要能够弄清楚用户在图表上的哪个位置单击以确定 selected 区域的第一个点。
我查看了图表 API,但我似乎找不到任何对此类问题有用的东西..
直接点击 DataPoint
你可以点击 HitTest
。但对于微小的点或范围内的 selection,这将无法正常工作。
必要的功能隐藏在 Axes
方法中。
此解决方案使用常规橡皮筋矩形来 select 捕获的点:
Point mdown = Point.Empty;
List<DataPoint> selectedPoints = null;
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
mdown = e.Location;
selectedPoints = new List<DataPoint>();
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
chart1.Refresh();
using (Graphics g = chart1.CreateGraphics())
g.DrawRectangle(Pens.Red, GetRectangle(mdown, e.Location));
}
}
private void chart1_MouseUp(object sender, MouseEventArgs e)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
Rectangle rect = GetRectangle(mdown, e.Location);
foreach (DataPoint dp in chart1.Series[0].Points)
{
int x = (int)ax.ValueToPixelPosition(dp.XValue);
int y = (int)ay.ValueToPixelPosition(dp.YValues[0]);
if (rect.Contains(new Point(x,y))) selectedPoints.Add(dp);
}
// optionally color the found datapoints:
foreach (DataPoint dp in chart1.Series[0].Points)
dp.Color = selectedPoints.Contains(dp) ? Color.Red : Color.Black;
}
static public Rectangle GetRectangle(Point p1, Point p2)
{
return new Rectangle(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y),
Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
}
请注意,这适用于 Line, FastLine and Point
图表。对于其他类型,您必须调整 selection 标准!
我正在尝试使用图表上的数据创建一种复制和粘贴功能,我想知道是否有任何方法可以在单击图表时获取图表上某个点的 x 位置?
基本上,我的想法是能够单击图形的一部分并拖动到 select 一个区域,然后我将相应地对其进行处理。
因此,我需要能够弄清楚用户在图表上的哪个位置单击以确定 selected 区域的第一个点。
我查看了图表 API,但我似乎找不到任何对此类问题有用的东西..
直接点击 DataPoint
你可以点击 HitTest
。但对于微小的点或范围内的 selection,这将无法正常工作。
必要的功能隐藏在 Axes
方法中。
此解决方案使用常规橡皮筋矩形来 select 捕获的点:
Point mdown = Point.Empty;
List<DataPoint> selectedPoints = null;
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
mdown = e.Location;
selectedPoints = new List<DataPoint>();
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
chart1.Refresh();
using (Graphics g = chart1.CreateGraphics())
g.DrawRectangle(Pens.Red, GetRectangle(mdown, e.Location));
}
}
private void chart1_MouseUp(object sender, MouseEventArgs e)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
Rectangle rect = GetRectangle(mdown, e.Location);
foreach (DataPoint dp in chart1.Series[0].Points)
{
int x = (int)ax.ValueToPixelPosition(dp.XValue);
int y = (int)ay.ValueToPixelPosition(dp.YValues[0]);
if (rect.Contains(new Point(x,y))) selectedPoints.Add(dp);
}
// optionally color the found datapoints:
foreach (DataPoint dp in chart1.Series[0].Points)
dp.Color = selectedPoints.Contains(dp) ? Color.Red : Color.Black;
}
static public Rectangle GetRectangle(Point p1, Point p2)
{
return new Rectangle(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y),
Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
}
请注意,这适用于 Line, FastLine and Point
图表。对于其他类型,您必须调整 selection 标准!