2016-10-15 18 views
0

私はグラフのデータを使ってコピーアンドペースト機能を作成しようとしていますが、グラフ上のポイントのx位置を取得する方法があればクリックされましたか?グラフ上の特定の値を選択

基本的には、グラフの一部をクリックしてドラッグして領域を選択し、それに従って処理します。

したがって、選択した領域の最初の点を決定するためにユーザーがクリックしたグラフの位置を把握できるようにする必要があります。

私はチャートAPIを介して見えたが、私はこの種の問題のために有益な何かを見つけるように見えることができませんでした。..

+0

テキストブロックC#コードブロックを変更しようとしています。 – mybirthname

+0

あなたがその答えに満足しているなら、[accepting](http://stackoverflow.com/help/accepted-answer)それを考えてみてください.. ..! - あなたはこれをしたことがないことが分かります:答えの投票の下の左上にある(目に見えない)チェックマークをクリックしてクリックしてください!それは緑色に変わり、私たちは少し評判を得る。 – TaW

答えて

1

直接DataPointをクリックするために、あなたはHitTestを行うことができます。しかし、小さなポイントや範囲の選択のために、これはうまく動作しません。

メソッドは、Axesメソッドでは隠されています。

このソリューションでは、キャッチポイントを選択するために、定期的なラバーバンド四角形を使用しています。これはLine, FastLine and Pointチャートのために働くことを

enter image description here

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)); 
} 

注意を。他のタイプの場合は、選択基準を変更する必要があります。

+0

ありがとう! ValueToPixelPosition関数はまさに私が探していたものです。 – user3713569

+0

もう少し簡単な質問です。私はFastLineチャートを使用しているので、ポイント自体の色を変更するのではなく、ポイント間のラインの色を変更する簡単な方法を知っていますか? – user3713569

+0

'FastLine'では使用できません。これと他のエキストラが必要な場合は 'Line'を使います。次に' DataPoint'の 'Color'を設定することができます。もしあなたが答えに満足すれば、[accepting](http://stackoverflow.com/ヘルプ/受け入れ - 回答)それ..! – TaW

関連する問題