2016-11-07 6 views
2

私はチャートには新しく、そうした線図があります。カーソルがあるとのMouseMoveなく、マウスクリックを介してアップデートここカーソル位置に基づいた折れ線グラフのY値へのアクセス

https://s15.postimg.org/vzl71faqj/Untitled.png

垂直線です。

タイトルが示しているように、縦線と 'データ線'が交差する点でY値にアクセスするだけです。

私はこれを試しました - Get Y value of series from the X Cursor position where a ChartArea is clicked onしかし、私は何かが失われていない限り、それはあなたが使用するデータポイントに応じてシリーズの最初または最後の値を返します。

私はhittestresultを試しましたが、それはデータライン自体に「触れている」場合にのみ動作するようです。

アイデア?

+0

[私の答えはこちら](http://stackoverflow.com/a/15566624/106159)は機能しますか? –

+0

どのチャートコントロールを使っていますか? –

+0

コードは正常に動作し、グラフが正しく塗りつぶされています_。私たちがあなたのx値を確認できるように、データポイントをどのように追加するかを示してください!ほとんどの場合、__x値は非数値です。これはあなたが訂正すべき共通のエラーです!注:文字列として追加すると、すべての__x-valuesは実際には0です。コードは実際には機能しません。 – TaW

答えて

1

私たちにコードを表示せず、私の質問に答えなかったので、あなたのチャートには有効な数字のx値がないと仮定できます。

これは、x値がすべて0であり、ズーム範囲の設定、軸やその他のラベルの書式設定、x方向のDataPointsの検索では使用できないことを意味します。

これは「暗黙的に索引付け」と呼ばれることがあります。結果は明示的に索引付けされたチャートと似ています。これは、SeriesIsXValueIndexedをtrueに設定した結果です。DataPointsが行内に並び、すべてが同じ距離に表示されます。これは通常ある

ない1はを望んでいると私は本当にあなたがこれを好きではないDataPointsを追加することによって、それを修正示唆するもの:次に

for (int i = 0; i < count; i++) chart1.Series[0].Points.AddXY(i, someYValue); 

linked answer:このような

for (int i = 0; i < count; i++) chart1.Series[0].Points.AddY(someYValue); 

多分にちょうどうまくいくでしょう。

しかし、単に、ここでの回避策はインデックスさチャートに最も近い二つのポイントを見つける方法でどのようはできる表示します。

内側のプロット位置のピクセル矩形を計算する関数(実際は2つ)を使用することに注意してください。それは動作します

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    ChartArea ca = chart1.ChartAreas[0]; 
    Series S = chart1.Series[0]; 
    RectangleF rf = InnerPlotPositionClientRectangle(chart1, ca); 
    float px = (float)((e.X - rf.X) * S.Points.Count/rf.Width); 

    int p0 = (int)px; // previous point 
    int p1 = p0 + 1; // next point 

    if (p0 >= 0 && p0 < S.Points.Count) 
     Console.WriteLine("DataPoint # " + p0 + " has a y-value of " + 
          S.Points[p0].YValues[0].ToString("0.00")); 
    //.. 
} 

をしかし、あなたは本当にあなたがデータポイントを追加する方法を修正する必要があります:あなたは... hereまたはhereそれらを見つけることができます!

+0

遅れのためにお詫び申し上げます、下のコードは完璧に仕事をしていますが、多くのお礼があります。 – user1006221

+0

私はAddYの代わりにPoints.AddXYを使用しました。あなたはまったく正しいので、リンクされた回答も有効でした。 – user1006221

関連する問題