C# 在图表上选择特定值
我正试图用图表上的数据创建一种复制粘贴功能,我想知道是否有任何方法可以在点击图表时获得点的x位置 基本上,这个想法是能够单击图形的一部分并拖动以选择一个区域,然后我将相应地处理该区域 因此,我需要能够找出用户在图形上单击的位置,以确定所选区域的第一个点是什么C# 在图表上选择特定值,c#,select,charts,mschart,C#,Select,Charts,Mschart,我正试图用图表上的数据创建一种复制粘贴功能,我想知道是否有任何方法可以在点击图表时获得点的x位置 基本上,这个想法是能够单击图形的一部分并拖动以选择一个区域,然后我将相应地处理该区域 因此,我需要能够找出用户在图形上单击的位置,以确定所选区域的第一个点是什么 我查看了图表API,但似乎找不到任何对此类问题有用的东西。直接单击数据点可以执行命中测试。但对于微小的点或范围的选择,这将不起作用 必要的函数隐藏在轴方法中 此解决方案使用常规橡皮筋矩形选择捕捉的点: Point mdown=Point.
我查看了图表API,但似乎找不到任何对此类问题有用的东西。直接单击
数据点
可以执行命中测试。但对于微小的点或范围的选择,这将不起作用
必要的函数隐藏在轴
方法中
此解决方案使用常规橡皮筋矩形选择捕捉的点:
Point mdown=Point.Empty;
列出所选点=空;
私有无效图表1\u鼠标向下(对象发送方,鼠标目标e)
{
mdown=e.位置;
selectedPoints=新列表();
}
私有void chart1_MouseMove(对象发送方,MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
图1.刷新();
使用(Graphics g=chart1.CreateGraphics())
g、 DrawRectangle(Pens.Red,GetRectangle(mdown,e.Location));
}
}
专用无效图表1\u鼠标(对象发送器,鼠标目标e)
{
Axis ax=图表1。图表区域[0]。AxisX;
ay轴=图表1。图表区域[0]。Axis;
矩形rect=GetRectangle(mdown,即位置);
foreach(图表1.系列[0]中的数据点dp.点)
{
int x=(int)ax.ValueToPixelPosition(dp.XValue);
int y=(int)ay.ValueToPixelPosition(dp.YValues[0]);
如果(矩形包含(新点(x,y)))选择点添加(dp);
}
//可选地为找到的数据点着色:
foreach(图表1.系列[0]中的数据点dp.点)
dp.Color=selectedPoints.Contains(dp)?Color.Red:Color.Black;
}
静态公共矩形GetRectangle(点p1、点p2)
{
返回新矩形(Math.Min(p1.X,p2.X),Math.Min(p1.Y,p2.Y),
Math.Abs(p1.X-p2.X),Math.Abs(p1.Y-p2.Y));
}
请注意,这将适用于直线、快速直线和点
图表。对于其他类型,您必须调整选择标准文本块尝试更改它的C代码块。如果您对答案满意,请考虑考虑它。我发现你从来没有这样做过:点击左上角答案票数下方的(不可见)复选标记,然后点击它!它变绿了,给我们俩都赢得了一点声誉。谢谢!ValueToPixelPosition函数正是我想要的。还有一个简单的问题。您知道有什么简单的方法可以改变点之间的线的颜色,而不是改变点本身的颜色,因为我使用的是快速折线图吗?快速折线
。使用Line
如果您需要此项和其他额外功能,则可以设置每个数据点的颜色如果你对答案很满意,请考虑一下。
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));
}