何度もすみません。
クリックをしたグラフ棒の直ぐ上に…、
Q1,▽や○などの形の、小さいマーカー(目印)を付ける事は可能でしょうか?
出来れば色も指定したいです。
Q2,更にその上部に、日付などの文字表示も出来れば有り難いです。
これは上の二つとは関係ないのですが…、
Q3,クリックした位置の、グラフ棒の色と背景の色を取得する方法を教えてください。
どうぞよろしくお願いします。
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim tbl As New DataTable
'列の作成
With tbl.Columns
.Add("日付", GetType(String))
.Add("指数", GetType(Integer))
End With
'データの追加
tbl.Rows.Add("2012/08/1", 40)
tbl.Rows.Add("2012/08/2", 60)
tbl.Rows.Add("2012/08/7", 30)
tbl.Rows.Add("2012/08/8", 80)
'初期化
Chart1.Series.Clear()
'グラフの種類,系列,軸の設定
Dim rosoku = Chart1.Series.Add("棒グラフ")
With rosoku
.ChartType = DataVisualization.Charting.SeriesChartType.Column
.XValueMember = "日付"
.YValueMembers = "指数"
.IsVisibleInLegend = False
End With
Chart1.DataSource = tbl
Chart1.DataBind()
With Chart1.ChartAreas(0)
.AxisX.MajorGrid.Enabled = False
.AxisX.MinorGrid.Enabled = False
.BackColor = Color.Gainsboro '背景の色
End With
End Sub
Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
'クリックした位置の要素を取得
Dim htrResult As HitTestResult = Chart1.HitTest(e.X, e.Y)
If htrResult.ChartElementType = ChartElementType.DataPoint Then
Dim i As Integer = htrResult.PointIndex
Dim dp As DataPoint = htrResult.Series.Points(i)
For j As Integer = 0 To Chart1.Series.Count - 1
If Chart1.Series(j).Name = htrResult.Series.Name Then
Dim SeriesNo As Integer = j
Exit For
End If
Next
'クリックした位置の要素を表示
MessageBox.Show(String.Format("{0}({1}) : {2}", htrResult.Series.Name, dp.AxisLabel, dp.YValues(0)))
End If
End Sub
End Class
もうひとつお願いします。
チャートを描画後に…、
日付を指定して、その該当する日付の位置に縦線を、
指数を指定して、その該当する指数の位置に横線を、
引くことは可能でしょうか?
また、一度引かれた線を消すことは可能でしょうか?
お手数をお掛けし恐縮ですが、どうぞよろしくお願いします。
プロパティなどで設定が可能かもしれませんが、
いろいろカスタマイズしたいのならPostPaintイベントで
追加で表示したい内容を描画するとよいと思います。
クリックされた場所にたいし縦横に線を引く例。
PostPaintで描画しているのは1組の線なので前回引いた線は
勝手に消えます。(描画しなおしなので)
Private m_click As Boolean = False
Private m_x As Integer
Private m_y As Integer
Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
m_click = True
m_x = e.X
m_y = e.Y
Chart1.Invalidate()
End Sub
Private Sub Chart1_PostPaint(sender As Object, e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
If m_click Then
Dim x1 = Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Maximum)
Dim x2 = Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Minimum)
e.ChartGraphics.Graphics.DrawLine(Pens.Cyan, CInt(x1), m_y, CInt(x2), m_y)
Dim y1 = Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Maximum)
Dim y2 = Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Minimum)
e.ChartGraphics.Graphics.DrawLine(Pens.Cyan, m_x, CInt(y1), m_x, CInt(y2))
End If
End Sub
shuさん、希望通りです。
ありがとうございます。
あと…、
日付を指定してその該当する日付の位置に縦線を引く、
或いは、
指数を指定してその該当する指数の位置に横線を引く、
ことは可能でしょうか?
それとクリックした位置の、グラフ棒の色と、背景の色の取得の仕方も教えてください。
何度もすみません。
よろしくお願いします。
> 日付を指定してその該当する日付の位置に縦線を引く、
> 指数を指定してその該当する指数の位置に横線を引く、
ValueToPixelPositionで場所を探すと良いと思います。
>それとクリックした位置の、グラフ棒の色と、背景の色の取得の仕方も教えてください。
クリックした位置がどのグラフかは分かると思いますので、自分で設定した背景色、棒の色が希望している色なのではないでしょうか。
1個のスレであまり複数の質問を混ぜない方がよいと思います。
質問毎にスレを立てればスレの解決への時間が短くてすみますが
複数の質問を混ぜるとすべてが解決するまでに時間がかかってしまいます。
>ValueToPixelPositionで場所を探すと良いと思います。
記述していただいたプログラムを見て、その手法を学び応用はさせて頂いてますが、
一から作成するほどの能力は残念ですがまだないのです。
>希望している色なのではないでしょうか。
色を利用してマウスの位置が、背景なのか?、棒なのか?、を知りたいのです。
>質問毎にスレを立てればスレの解決への時間が短くてすみますが
そうですね、今後は複数質問にならないように気をつけます。
> 背景なのか?、棒なのか?、を知りたいのです。
提示コードの
htrResult.ChartElementType
で判断出来ます。
棒 => DataPoint
背景 => PlottingArea, AxisLabels, Nothing
軸 => Axis
グリッド => Gridlines
でどうでしょう?
shuさん、すみません。
htrResult.ChartElementType で判断出来ることは分かりますが、
今の能力ではそれから先が進めません(^^;
> 今の能力ではそれから先が進めません(^^;
もっと基礎を勉強してみてはどうでしょう?あなたの
能力以上のこのソリューションはそれからでないとほとんど
の内容を聞かないと解決出来ないような気がします。
shuさん、
確かにそうかもしれません。
あれこれ欲張り過ぎました。
いろいろ教えて頂き本当にありがとうございました。
ツイート | ![]() |