Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在图表上选择特定值_C#_Select_Charts_Mschart - Fatal编程技术网

C# 在图表上选择特定值

C# 在图表上选择特定值,c#,select,charts,mschart,C#,Select,Charts,Mschart,我正试图用图表上的数据创建一种复制粘贴功能,我想知道是否有任何方法可以在点击图表时获得点的x位置 基本上,这个想法是能够单击图形的一部分并拖动以选择一个区域,然后我将相应地处理该区域 因此,我需要能够找出用户在图形上单击的位置,以确定所选区域的第一个点是什么 我查看了图表API,但似乎找不到任何对此类问题有用的东西。直接单击数据点可以执行命中测试。但对于微小的点或范围的选择,这将不起作用 必要的函数隐藏在轴方法中 此解决方案使用常规橡皮筋矩形选择捕捉的点: Point mdown=Point.

我正试图用图表上的数据创建一种复制粘贴功能,我想知道是否有任何方法可以在点击图表时获得点的x位置

基本上,这个想法是能够单击图形的一部分并拖动以选择一个区域,然后我将相应地处理该区域

因此,我需要能够找出用户在图形上单击的位置,以确定所选区域的第一个点是什么


我查看了图表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));
}