| ■No98561 (魔界の仮面弁士) に追記 > Label への反映が問題になるのは、 No98520 で御自身がお書きになった変数 ZaKa の算出処理のせいでしょう。 > 現状の実装だと、Y 軸が 0 以上の値のみを扱うチャートであったとして、 > マウス座標が 0 未満の位置(プロットエリア外)を指していたときには、 > ラベルを書き換えていますよね? あるいは最大値を超える位置であっても書き換わっています。
もし、プロットエリア外での Label 更新を止めたいなら No98525 で用意した
Private Function GetYValue(yAxis As Axis, y As Integer) As Double Dim y1 = yAxis.ValueToPixelPosition(yAxis.Maximum) Dim y2 = yAxis.ValueToPixelPosition(yAxis.Minimum) Return yAxis.Maximum - (yAxis.Maximum - yAxis.Minimum) * ((y - y1) / (y2 - y1)) End Function
の処理を
Private Function GetYValue(yAxis As Axis, y As Integer) As Double? Dim y1 = yAxis.ValueToPixelPosition(yAxis.Maximum) Dim y2 = yAxis.ValueToPixelPosition(yAxis.Minimum) If y1 <= y AndAlso y <= y2 Then Return yAxis.Maximum - (yAxis.Maximum - yAxis.Minimum) * ((y - y1) / (y2 - y1)) Else Return Nothing End If End Function
に変更し、さらに、Label への表示部を yLabel.Text = GetYValue(e.Chart.ChartAreas(0).AxisY, mousePoint.Y).ToString("N0") から yLabel.Text = GetYValue(e.Chart.ChartAreas(0).AxisY, mousePoint.Y)?.ToString("N0") などとすれば良いでしょう。
上記では、ラベルが更新されるエリアをプロットエリア内に限定していますが、 判定範囲を変更すれば、それぞれのチャート全体を対象にすることもできますね。 |